一般来说访问一些自己的私有SSL服务器都会遇到SSL Exception,因为服务器证书不被信任。那么除了可以买一个公有证书外还有其它办法吗?如果你有对客户端的控制权的话,你可以自己生成一个证书,然后导入到客户端来使这个客户端信任这个证书。

至于Java可以怎么导入证书呢?

可以在虚拟机启动的时候告知证书的位置和密码:

java -Djavax.net.ssl.trustStore=/path/yourSelfSignedTruststore.jks -Djavax.net.ssl.trustStorePassword=yourPassword

我们知道-D参数是设置system的Property属性,然后其它类就可以通过system.getProperty()来拿到。

所以还有另一种方式,在你的应用main中刚启动的时候,设置system.setProperty(),如下:

Properties systemProps = System.getProperties();
systemProps.put( "javax.net.ssl.trustStore", "/path/yourSelfSignedTruststore.jks");
systemProps.put( "javax.net.ssl.trustStorePassword", "yourPassword");
System.setProperties(systemProps);

这样的方式是跟通过命令行方式设置原理是一样的。如果这个属性不设置,那么虚拟机就会从默认的路径读取证书( SunX509或者是SunPKIX ),不同的操作系统的虚拟机版本是不一样的。默认的证书是<JAVA_HOME>/lib/security/jssecacerts,如果没有,就会去读取<JAVA_HOME>/lib/security/cacerts

记住trustStore不是keyStore,不要弄混了。keystore和truststore本质上是一个东西,但是用途有区别:
keystore中一般保存的是服务器的私钥,用来加解密或者做签名。truststore中保存的是一些可信任的证书,比如访问SSL服务器的时候对之进行认证,以确保其是可信任的。

这是一种方式,我们还可以把需要的证书导入到Java的默认证书中:

cd /<JAVA_HOME>/jre/lib/security/

然后列出已有的证书:

keytool -list -keystore cacerts

会让你输入密码,输入changeit,这是Java的默认密码。

Keystore type: JKS
Keystore provider: SUN


Your keystore contains 104 entries


digicertassuredidrootca, Apr 16, 2008, trustedCertEntry,
Certificate fingerprint (SHA1): 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43

然后开始导入自己的证书:

keytool -import -alias zhc_certs -file akazam_email.cer -keystore cacerts -trustcacerts

最后输入y确认信任此证书。

然后在列入一下当前的所有可信任证书,就会发现多了一个。

如果不想用了还可以删除。

keytool -delete -alias zhc_certs -keystore cacerts

原文: http://blog.csdn.net/hongchangfirst/article/details/53894060

作者: hongchangfirst

hongchangfirst的主页: http://blog.csdn.net/hongchangfirst

一般来说访问一些自己的私有SSL服务器都会遇到SSL Exception,因为服务器证书不被信任。那么除了可以买一个公有证书外还有其它办法吗?如果你有对客户端的控制权的话,你可以自己生成一个证书,然后导入到客户端来使这个客户端信任这个证书。至于Java可以怎么导入证书呢?可以在虚拟机启动的时候告知证书的位置和密码:java -Djavax.net.ssl.trustStore= 2、命令行 open ssl s_client -connect <目标网址:端口号> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > 证书 名.crt 二、导入 证书 1. 将 证书 移动到$ JAVA _HOME/lib/security/c... 安全是一个复杂的话题。在本节中,我们将演示该主题的几个简单方面,因为它与网络有关。具体来说,我们将创建一个安全的回显服务器。创建安全回显服务器与我们之前开发的非安全回显服务器没有太大区别。然而,在幕后有很多事情要让它发挥作用。我们可以忽略许多这些细节现在,但我们会更深入地钻研它在第8章,网络安全。 我们将使用该类来实例化安全服务器套接字。此外,有必要创建底层 SSL 机制可用于加密通信的密钥。 SSL ServerSocketFactory