当您需要使用Java的客户端证书身份验证时,问题甚至从证书开头就开始,因为通常它不是您想要的方式。
最近,我不得不使用PFX证书进行客户端身份验证(也许还会有其他帖子),因此我不得不将其转换为Java密钥库(JKS)。
我们将同时创建一个信任库和一个密钥库,因为根据您的需求,您可能需要一个或另一个。 如果您不知道,则信任库和密钥库之间的区别是(摘自JSSE参考指南: TrustManager:确定是否应该信任远程身份验证凭据(以及连接)。 KeyManager: Determines which authentication credentials to send to the remote host.
Ok that’s enough what you will need is openssl and Java 7 or newer !
首先让我们从pfx文件生成一个密钥,然后将该密钥用于p12密钥库。
openssl pkcs12 -in example.pfx -nocerts -out example.key
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying — Enter PEM pass phrase:
如此处所示,将要求您输入pfx文件的密码,稍后将要求您输入PEM密码,例如,此处使用123456进行所有操作。
第二个命令几乎相同,但是这次是nokey和crt
openssl pkcs12 -in example.pfx -clcerts -nokeys -out example.crt
Enter Import Password:
MAC verified OK
Now we have a key and and a crt file
下一步是创建信任库。
keytool -import -file example.crt -alias exampleCA -keystore truststore.jks
Enter keystore password:
Re-enter new password:
Owner: CN=…..
…….
Trust this certificate? [no]: yes
Certificate was added to keystore
如您所见,您只需将此crt文件导入jks信任库并设置一些密码。 对于您是否信任此证书的问题,您说是,因此将其添加到信任库中。
We are done if you only need a truststore !
最后一个步骤是创建密钥库
openssl pkcs12 -export -in example.crt -inkey example.key -certfile example.crt -name “examplecert” -out keystore.p12
Enter pass phrase for example.key:
Enter Export Password:
Verifying — Enter Export Password:
在许多情况下,此p12密钥库就足够了,但是即使您需要JKS密钥库,也需要一个附加命令
keytool -importkeystore -srckeystore keystore.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype JKS
Importing keystore keystore.p12 to keystore.jks…
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Entry for alias examplecert successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using “keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12”.
让我们验证一下我们到底有什么!
ls
example.pfx example.key keystore.p12
example.crt keystore.jks truststore.jks
就这些了 ! 我希望这可以帮助别人 :)
第二篇文章将介绍如何使用此密钥库进行Java的客户端身份验证。
如果需要,还可以使用信任库。