我有以下问题:我使用 Verisign SSL 证书并尝试从我的 android 应用程序连接到我的 tomcat 7 服务器。在我看来,证书安装正确,因为我可以成功连接到适用于 iphone、firefox 浏览器的同一应用程序以及 verisign 的 ssl-tool 和其他 ssl 检查工具。
但是 android 应用程序说:java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Version 1 certs can't be used as intermediate certificates
我尝试按照许多答案中的描述对证书重新排序,并使用 EasySSLSocketFactory
和 EasyX509TrustManager
实现了解决方案,但我无法解决异常。版本 1 证书作为最后一个证书订购,所以我有 [0]-my cert
、[1]-intermediate1、[2]-intermediate2 最后是 [3]-the root Version 1
。出于安全原因,我不想允许所有证书。我不确定为什么会抛出此异常,但似乎是 verisign 颁发了错误的根证书,或者 android 尚未在其信任库中实现根证书。这怎么能解决?非常感谢您的帮助
最佳答案
我确实遇到了这个问题,昨天设法解决了。您是正确的,根证书未被接受,因为它是版本 1 证书。
我首先使用 openssl 找出证书链中的哪个证书是版本 1 证书(导致错误),从而解决了这个问题。
simonevertsson$ openssl s_client -connect my.secure.site.com:443
这给出了证书链。示例:
---
Certificate chain
0 s:/C=SE/ST=Uppsala/L=Uppsala/O=Example AB/CN=my.secure.site.com
i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Secure Server CA - G3
1 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Secure Server CA - G3
i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
2 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
3 s:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
然后我去了 VeriSign Root Certificate download page并手动下载版本 1 证书的 .pem 文件,在我的例子中是 3 类公共(public)主要证书颁发机构。
下载证书文件后,我只是按照 Adding unknown CAs 上的 Android 开发人员指南进行操作。 .就这样,错误消失了。
关于Android + 威瑞信 SSL 版本 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9467932/