我需要连接到我的服务器 APITLS_v1
,由 CA 签名的服务器证书不包含在旧版本的 Android 中,所以我使用这个谷歌的文档 http://developer.android.com/training/articles/security-ssl.html#UnknownCa实施定制TrustManager
。一切都适用于 API 18 及更高版本,但在 JELLY_BEAN(API 17) 中抛出 SSLHandshakeException:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
我有另一个服务器 URL 和证书(在本例中是自签名的),即使在具有相同 TrustManager 实现的 JELLY_BEAN 中也可以工作!
我正在使用 OkHttp 2.4HTTPS
客户。我很困惑出了什么问题?
更新:
这是结果SSLLabs https://www.ssllabs.com/ssltest/analyze.html :
中间和根 TurkTrust CA(如上所示)已添加到我的TrustManager
.
一个可能的解释是服务器需要服务器名称指示 (SNI) https://en.wikipedia.org/wiki/Server_Name_Indication发回正确的证书,如果不使用 SNI,则仅发送一些默认证书。因此,客户端将无法获得预期的证书,并且验证将失败。
根据文档 OkHTTP 应该支持 SNI,但是最近的一份报告 https://stackoverflow.com/questions/36480255/okhttp-with-sni-connection-reset-on-java-7否则表示。在变更日志中我看不到它是什么时候添加的。支持也可能取决于底层库。
编辑:根据添加到问题中的 SSLLabs 的报告,现在很明显问题是服务器上缺少中间证书。报告中显示了这一点
Chain Issues: Incomplete, Extra Download, ....
在这种情况下,如果客户端显式添加根 CA (Türktrust Elektronik Sertifika...) 将无济于事,因为由于缺少中间 CA (Türktrust SSL Sertifikasi Hizmitleri),无法从根 CA 的叶证书构建信任链。站点到根证书。从报告中还可以看出,服务器不仅没有包含链证书,而且还添加了一些根本不属于链的证书。因此,我的猜测是,曾尝试包含链证书,但使用了错误的证书,并且除此之外,还使用了错误的位置(在根证书之后而不是在主证书之后)。
虽然一些桌面浏览器可以解决此类问题,但大多数移动浏览器将无法解决此服务器端错误配置,并且 python、PHP、Java 等的 SSL api 也会失败。因此,这是一个需要在服务器上修复的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)