如何把PEM格式证书转换成JKS格式。
通常一个完整的证书链包含三个文件:
- cert.pem:用户证书文件
- cert.key:用户私钥文件
- ca.pem:CA根证书文件
当然,我们假设cert.pem是经过ca.pem签名的。
把PEM格式转换成JKS格式通常会生成两个JKS文件。
- 把CA证书文件转换成truststore.jks文件
$ keytool -import -noprompt -file ca.pem -keystore truststore.jks -storepass <passvalue>
Certificate was added to keystore
然后我们可以keystore.jks里面有多少个entry:
$ keytool --list -keystore truststore.jks -storepass <passvalue>
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
mykey, Dec 13, 2018, trustedCertEntry,
Certificate fingerprint (SHA1): D2:D1:A9:A7:B7:24:F0:E5:0C:48:9B:2F:2E:1C:76:89:98:43:11:2E
上面我们看到truststore.jks里面只有一个入口:mykey;这个是缺省的名字,当我我们在添加的时候可以指定alias,例如:
$ keytool -import -alias myname -noprompt -file ca.pem -keystore truststore.jks -storepass <passvalue>
Certificate was added to keystore
我们指定了entry的一个alias别名;在看一遍:
$ keytool --list -keystore truststore.jks -storepass <passvalue>
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 2 entries
myname, Dec 13, 2018, trustedCertEntry,
Certificate fingerprint (SHA1): D2:D1:A9:A7:B7:24:F0:E5:0C:48:9B:2F:2E:1C:76:89:98:43:11:2E
mykey, Dec 13, 2018, trustedCertEntry,
Certificate fingerprint (SHA1): D2:D1:A9:A7:B7:24:F0:E5:0C:48:9B:2F:2E:1C:76:89:98:43:11:2E
这时truststore.jks里面有两个entry,其中一个使用了别名myname;而且我们看到两个entry的SHA1是一样的,因为本身就是同一份证书,只是采用了一个不同的别名而已。
- 把用户证书文件转换成keystore.jks文件
这个需要分两步完成:
- 把用户证书转换成P12格式
$ openssl pkcs12 -export -in cert.pem -inkey cert.key -out keystore.p12 -passout pass:<passvalue>
- 把p12格式文件加入到JKS格式
$ keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -destkeystore keystore.jks \
-srcstorepass <passvalue> -deststorepass <passvalue>
- 查看结果
$ keytool --list -keystore keystore.jks -storepass <passvalue>
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
1, Dec 13, 2018, PrivateKeyEntry,
Certificate fingerprint (SHA1): 7D:38:3C:9E:B6:DC:4B:D1:A9:EC:D9:5C:C8:DF:01:E1:D2:C4:01:00
此时看到的别名是"1",不知道为什么。
另外,如果需要使用别名alias,类似的:
$ openssl pkcs12 -export -name myalias -in cert.pem -inkey cert.key -out keystore.p12 -passout pass:<passvalue>
$ keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -destkeystore keystore.jks \
-srcstorepass <passvalue> -deststorepass <passvalue>
$ keytool --list -keystore keystore.jks -storepass <passvalue>
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 2 entries
1, Dec 13, 2018, PrivateKeyEntry,
Certificate fingerprint (SHA1): 7D:38:3C:9E:B6:DC:4B:D1:A9:EC:D9:5C:C8:DF:01:E1:D2:C4:01:00
mynewalias, Dec 13, 2018, PrivateKeyEntry,
Certificate fingerprint (SHA1): 7D:38:3C:9E:B6:DC:4B:D1:A9:EC:D9:5C:C8:DF:01:E1:D2:C4:01:00
注意别名alias是在第一步生成P12文件的时候通过-name参数执行,第二步没有别名相关参数。
另外,如果需要在keystore里面包含CA证书,则需要:
$ openssl pkcs12 -export -name myalias2 -in cert.pem -inkey cert.key -chain -CAfile ca.pem -out keystore.p12 -passout pass:<passvalue>
即在创建P12文件的时候指定CAfile参数,后面步骤就一样。