安装 [OpenFire] 的时候,在安全一项中加上了 TLS/SSL 的支持,这样它就会生成 DomainName_rsa 和 DomainName_dsa 两份证书,当然这是自己签发的。那么在连上去以后就必须使用 TLS/SSL 来进行验证。但是中间抛了异常如下:
-
[java] Caused by: sun.security.validator.ValidatorException: PKIX path building failed:
-
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
-
certification path to requested target
-
[java] at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
-
[java] at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
-
[java] at sun.security.validator.Validator.validate(Validator.java:218)
-
[java] at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
-
[java] at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
-
[java] at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
-
[java] at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
-
[java] ... 10 more
-
[java] Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find
-
valid certification path to requested target
-
[java] at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
-
[java] at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
-
[java] at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
-
[java] ... 16 more
然后 Google 了一下这个错,发现不少人都碰到了,就是必须要把自己签发的证书加到本地的 TrustStore 中,可以加到系统缺省的地方,也是在命令行中指定。寻找的顺序是:
-
javax.net.ssl.trustStore系统属性所指定的 TrustStore 文件 -
$JAVA_HOME/lib/security/jssecacerts -
$JAVA_HOME/lib/security/cacerts
如果安装的是 JDK,那么就在 $JAVA_HOME/jre/lib/security,如果是 JRE,那么就在 $JAVA_HOME/lib/security/。详细的信息可以在 [SUN JSSE Reference Guide] 中找到。
那如何把 OpenFire 中的证书给导出来,它的证书是在 [url][$OPEN_FIRE_HOME/resources/security/keystore][/url],可以使用 JDK 自带的工具 keytool 来导出来。OpenFire 生成的证书有两个,可以在它的 "Admin Console/Server Certificates" 中找到。
-
# 列出一个 KeyStore 中的密钥
-
keytool.exe -list -keystore $OPEN_FIRE_HOME/resources/security/keystore
-
-
结果:
-
-
Keystore 类型: JKS
-
Keystore 提供者: SUN
-
-
您的 keystore 包含 2 输入
-
-
DomainName_rsa, 2007-10-27, PrivateKeyEntry,
-
认证指纹 (MD5): 5D:15:91:68:42:BD:AD:82:C2:3A:0D:C0:3E:A8:FF:3B
-
DomainName_dsa, 2007-10-27, PrivateKeyEntry,
-
认证指纹 (MD5): 1F:7D:A9:63:C7:16:8C:38:6E:D9:AA:A4:2A:B4:E5:FE
-
-
# 导出两个密钥
-
keytool.exe -export -alias DomainName_dsa -keystore $OPEN_FIRE_HOME/resources/security/keystore -rfc -file DomainName_dsa
-
keytool.exe -export -alias DomainName_rsa -keystore $OPEN_FIRE_HOME/resources/security/keystore -rfc -file DomainName_rsa
-
-
# 导入到系统的 TrustStore 中
-
keytool -import -alias DomainName_rsa -file DomainNAME_rsa -keystore $JAVA_HOME/jre/lib/security/jssecacerts
-
keytool -import -alias DomainName_dsa -file DomainNAME_dsa -keystore $JAVA_HOME/jre/lib/security/jssecacerts
-
-
# 再验证一下
-
keytool.exe -list -keystore $JAVA_HOME/jre/lib/security/jssecacerts
-
-
结果:
-
-
Keystore 类型: JKS
-
Keystore 提供者: SUN
-
-
您的 keystore 包含 2 输入
-
-
supermmx.org_rsa, 2007-10-27, trustedCertEntry,
-
认证指纹 (MD5): 5D:15:91:68:42:BD:AD:82:C2:3A:0D:C0:3E:A8:FF:3B
-
supermmx.org_dsa, 2007-10-27, trustedCertEntry,
-
认证指纹 (MD5): 1F:7D:A9:63:C7:16:8C:38:6E:D9:AA:A4:2A:B4:E5:FE
这样就讲两个证书成功导入到系统缺省的 TrustStore 中,然后直接连就没有问题了。但是 [Pidgin] 直接就能连,也不需要任何设置,可能是其中使用的库的缘故吧。




Post new comment