我遇到以下问题:我使用Verisign SSL证书,并试图从我的android应用程序连接到我的tomcat 7服务器。在我看来,证书安装正确,因为我可以成功连接到适用于iphone的同一应用程序、firefox浏览器、verisign的ssl工具和其他ssl检查工具。
但安卓应用程序显示: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 and finally [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根证书下载页面,手动下载了版本1证书的.pem文件,在我的情况下,它是3级公共初级证书颁发机构。
下载证书文件后,我只是按照安卓开发者指南添加未知CA。就这样,错误消失了。
确保您在web/app服务器上只安装了一个证书。删除所有过期的证书。