如何从JKS文件中取出PEM格式证书
两个概念:
truststore:一般用来存储CA证书,所以它没有私钥。
所有从truststore一般只能提取出CA根证书。
keystore:存储普通证书可以私钥。
所有从keystore里面一般能提取出用户证书和用户私钥。
从JKS中提取PEM证书
$ keytool -export -rfc -alias -file -keystore -storepass
alias是定义在keystore里面的entry,可以使用如下命令,查看当前包含哪几个entry:
$ keytool --list -keystore -storepass
例如:
$ keytool --list -keystore server.keystore.jks -storepass
Keystore type: jks
Keystore provider: SUN
Your keystore contains 2 entries
caroot, Dec 13, , trustedCertEntry,
Certificate fingerprint (SHA1): 6D:43:77:F4:42:91:A1:C7:EC:2E:B8:F4:9C:B5:6A:ED:E0:4D:CA:F6
myserver, Dec 13, , PrivateKeyEntry,
Certificate fingerprint (SHA1): 79:F1:B1:C3:DB:22:1D:8B:26:FC:EB:4A:43:C1:DE:F5:92:5C:5B:83
这个JKS包含两个entry,这样在提取证书的时候可以知道alias值为caroot或者myserver。
从JKS中提取KEY
JKS没有直接的办法提取KEY,所以整个过程分三步走:
把JKS转换成P12
$ keytool -importkeystore -srckeystore -destkeystore -deststoretype PKCS12 \
-srcstorepass -deststorepass
从P12文件中提取KEY
$ openssl pkcs12 -in -nodes -nocerts -out -passin pass:
删除多余的垃圾内容
$ sed -i "1,4d"
因为在第二步提出出来的KEY文件包含垃圾头信息:
Bag Attributes
friendlyName: myserer
localKeyID: 54 69 6D 65 20 31 35 34 34 36 39 37 32 32 33 35 31 35
Key Attributes:
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCUUDfdlHnAoAYE
DXluQZv64HNfrJzbUeD29OqQ+XWBKfz+6Sc8Ag4c3qEBezdqY6W06FqT8zkXYmOe
...
aBKlYCPpppexmuwTyRGWJxa3Mc0J4q9+EhDxE3XtmLE/2Wm0mm6vecjECHYXs8KZ
RiC8QuO7nMTFMVcWtgGDeA==
-----END PRIVATE KEY-----