.jks 文件就是Java KeyStore (JKS)文件。它的用于存储加密密钥和证书。这个jks可以用在SSL加密,Android应用签名,Java应用等上面。

其实,我们还见过.keystore文件,它和.jks文件是一样的。 .jks 文件是.keystore 文件的其中一种。区别在于 .jks 文件是Java应用的默认keystore。

既然.jks文件存储了加密密钥和证书,那么具体有哪些呢?一个.jks文件可以存储如下信息:

  1. Private keys 私钥
  2. Public keys 公钥
  3. Certificates 证书
  4. 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

从输出的信息中,我们可知有

  1. 私钥
  2. 证书
  3. 证书指纹
  4. 公钥

等等。

还可以通过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 证书格式

  1. .der .cer: 二进制文件,只保存证书,不保存私钥。
  2. .pem:可保存证书,可保存私钥。
  3. .crt:不保存私钥。
  4. .pfx .p12: 二进制文件,同时包含证书和私钥,一般有密码保护。
  5. .jks: 二进制文件,同时包含证书和私钥,一般有密码保护