.jks 文件就是Java KeyStore (JKS)文件。它的用于存储加密密钥和证书。这个jks可以用在SSL加密,Android应用签名,Java应用等上面。
其实,我们还见过.keystore文件,它和.jks文件是一样的。 .jks 文件是.keystore 文件的其中一种。区别在于 .jks 文件是Java应用的默认keystore。
既然.jks文件存储了加密密钥和证书,那么具体有哪些呢?一个.jks文件可以存储如下信息:
- Private keys 私钥
- Public keys 公钥
- Certificates 证书
- Passwords 密码
因为它存储了这么多敏感的信息,所以一定要保护好这个文件。通过keytool这个JDK提供的工具查看一下.jks文件里大概有什么:
keytool -v -list -alias kyunban -keystore kyunban.jks
Enter keystore password:
Alias name: kyunban
Creation date: Jan 6, 2024
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: C=CN, ST=GD, L=GZ, O=kyunban, OU=kyunban, CN=kyunban
Issuer: C=CN, ST=GD, L=GZ, O=kyunban, OU=kyunban, CN=kyunban
Serial number: 1
Valid from: Sat Jan 06 12:58:51 CST 2024 until: Wed Dec 30 12:58:51 CST 2048
Certificate fingerprints:
SHA1: D9:2B:1E:52:E4:38:8B:4F:F6:45:76:03:47:40:A9:98:33:99:F7:E8
SHA256: 59:2B:D2:33:7B:81:38:E9:F9:28:F8:16:E7:9F:9C:74:E4:06:71:C6:2C:71:6B:AE:54:38:4A:1A:38:5D:F0:A8
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 1
从输出的信息中,我们可知有
- 私钥
- 证书
- 证书指纹
- 公钥
等等。
还可以通过KeyStore Explorer这个工具查看.jks文件中的内容,如:
Properties for 'kyunban.jks'
File: /Users/juklinglee/AndroidStudioProjects/P2PIM/keys/kyunban.jks
Type: PKCS12
Provider: SUN
Keys
None
Key Pairs
kyunban
Private Key
Locked - unlock to get properties
Certificates
kyunban
Version: 1
Subject: C=CN,ST=GD,L=GZ,O=kyunban,OU=kyunban,CN=kyunban
Issuer: C=CN,ST=GD,L=GZ,O=kyunban,OU=kyunban,CN=kyunban
Serial Number: 0x01
Valid From: 1/6/2024, 12:58:51 PM CST
Valid Until: 12/30/2048, 12:58:51 PM CST
Public Key
Algorithm: RSA
Key Size: 2048 bits
Format: X.509
Encoded: 0x30820122300D06092A864886F70D01010105000382010F003082010A0282010100C827ECF085CB2BA3E30E8FA04194D7187AB8AA63689E28D38FA342878878B2DB96E92EB9016FF39630047D0033B4DC33F98ADC5E5ED82F83B1AC53B8E138FB5AF86B89CF0173F570C13E96679EFE358EAD3BD98C13E67B619B5FBA0F67656B39CD17595346E4418348529FCF85ACBCDDE4E15D7B8A179EF271AC24883BEAAE3690E06EA433B711F3AC00DF83951CE4ECBE174FB8E5598A5CE51DA94BA393AD9F5676D811059951D563568BF458AF6C4C96A58EAFD7F0FAE440118BC979DC77E417B41297F5FD6CD507007DCEB31AFE10B9477FBF4A49BD77E989F93AD3D804A426E7C5B92D6F003E5286899FFC66718662CE9F735B9CF56BEFB0A7BE0DC4D5630203010001
Public Exponent: 0x10001
Modulus: 0xC827ECF085CB2BA3E30E8FA04194D7187AB8AA63689E28D38FA342878878B2DB96E92EB9016FF39630047D0033B4DC33F98ADC5E5ED82F83B1AC53B8E138FB5AF86B89CF0173F570C13E96679EFE358EAD3BD98C13E67B619B5FBA0F67656B39CD17595346E4418348529FCF85ACBCDDE4E15D7B8A179EF271AC24883BEAAE3690E06EA433B711F3AC00DF83951CE4ECBE174FB8E5598A5CE51DA94BA393AD9F5676D811059951D563568BF458AF6C4C96A58EAFD7F0FAE440118BC979DC77E417B41297F5FD6CD507007DCEB31AFE10B9477FBF4A49BD77E989F93AD3D804A426E7C5B92D6F003E5286899FFC66718662CE9F735B9CF56BEFB0A7BE0DC4D563
Signature Algorithm: SHA-256 with RSA
MD5 Fingerprint: 81:B6:73:05:59:42:28:CA:79:4B:CE:E5:CA:FD:BE:6B
SHA-1 Fingerprint: D9:2B:1E:52:E4:38:8B:4F:F6:45:76:03:47:40:A9:98:33:99:F7:E8
Trusted Certificates
None
提取.jks中的私钥来使用:
第一步,将jks文件转换为PKCS12格式的文件
% keytool -importkeystore -srckeystore kyunban.jks -srcstorepass kyunban -srckeypass kyunban -srcalias kyunban -destalias kyunban -destkeystore kyunban.p12 -deststoretype PKCS12 -deststorepass kyunban123 -destkeypass kyunban123
kyunban.p12就是转换后得到的文件 :
% ls
kyunban.jks kyunban.p12
从PKCS12格式的文件提取私钥
我们用openssl命令再从PKCS12格式文件中提取出私钥:
% openssl pkcs12 -in kyunban.p12 -nodes -nocerts -out private_key.pem
Enter Import Password:
% ls
kyunban.jks kyunban.p12 private_key.pem
从PKCS12格式的文件提取公钥
我们用openssl命令再从PKCS12格式文件中提取出公钥:
// -nokeys 不要输出私钥
// -in 指定输入的p12文件
// -out 指定输出文件名
% openssl pkcs12 -in kyunban.p12 -nokeys -out public_key.pem
Enter Import Password:
% ls
kyunban.jks kyunban.p12 private_key.pem public_key.pem
提取出来的公钥,实际上是一份证书,不包含私钥。
常见 SSL 证书格式
- .der .cer: 二进制文件,只保存证书,不保存私钥。
- .pem:可保存证书,可保存私钥。
- .crt:不保存私钥。
- .pfx .p12: 二进制文件,同时包含证书和私钥,一般有密码保护。
- .jks: 二进制文件,同时包含证书和私钥,一般有密码保护