以下java代码都来自ibm官网的大神,此处只是借用代码测试我们生成的证书好不好用。首先我们的证书有下面几个:
Client.p12 - Client端keystore,不包含CA证书,通过openssl生成
ClientTrust.p12 - Client端可信任keystore,只导入Server的证书,通过keytool生成
Client_wc.p12 - Client端keystore,包含CA证书链,通过openssl生成
Server.p12 - Server端keystore,不包含CA证书,通过openssl生成
ServerTrust.p12 - Server端可信任keystore,只导入Client的证书,通过keytool生成
Server_wc.p12 - Server端keystore,包含CA证书链,通过openssl生成
借用ibm的代码,通过下面方式使用这几个不同的证书,都是可以通过:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/opt/jdk/bin/java -Djavax.net.ssl.keyStore=Server.p12 \ -Djavax.net.ssl.keyStorePassword=Aa123456 \ -Djavax.net.ssl.trustStore=ServerTrust.p12 \ -Djavax.net.ssl.trustStorePassword=Aa123456 \ SSLServer /opt/jdk/bin/java -Djavax.net.ssl.keyStore=Client.p12 \ -Djavax.net.ssl.keyStorePassword=Aa123456 \ -Djavax.net.ssl.trustStore=ClientTrust.p12 \ -Djavax.net.ssl.trustStorePassword=Aa123456 \ SSLClient |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/opt/jdk/bin/java -Djavax.net.ssl.keyStore=Client.p12 \ -Djavax.net.ssl.keyStorePassword=Aa123456 \ -Djavax.net.ssl.trustStore=Server_wc.p12 \ -Djavax.net.ssl.trustStorePassword=Aa123456 \ SSLClient /opt/jdk/bin/java -Djavax.net.ssl.keyStore=Server.p12 \ -Djavax.net.ssl.keyStorePassword=Aa123456 \ -Djavax.net.ssl.trustStore=Client_wc.p12 \ -Djavax.net.ssl.trustStorePassword=Aa123456 \ SSLServer |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/opt/jdk/bin/java -Djavax.net.ssl.keyStore=Client.p12 \ -Djavax.net.ssl.keyStorePassword=Aa123456 \ -Djavax.net.ssl.trustStore=Server.p12 \ -Djavax.net.ssl.trustStorePassword=Aa123456 \ SSLClient /opt/jdk/bin/java -Djavax.net.ssl.keyStore=Server.p12 \ -Djavax.net.ssl.keyStorePassword=Aa123456 \ -Djavax.net.ssl.trustStore=Client.p12 \ -Djavax.net.ssl.trustStorePassword=Aa123456 \ SSLServer |
keystore和trustkeystore的区别是keystore里面有证书的私钥,而trustkeystore里面只有证书信息,从运行的结果来看,这两者都可以相互通用并没有区分,但是使用上应该不会把受信证书连同它的私钥一起发不出去,所以用trustkeystore来存储可信证书信息是比较靠谱的做法。
如果在java程序运行时增加 -Djavax.net.debug=ssl 参数可以查看更加详细的信息,今天主要准备一个方便使用的证书环境,方便后续验证其他证书组合和SSL交互信息。
ibm官网链接:https://www.ibm.com/developerworks/cn/java/j-lo-ssltls/index.html