让我们在Android上加密会产生java.security.cert.CertPathValidatorException:未找到证书路径的信任锚

时间:2017-08-03 15:43:44

标签: android certificate root lets-encrypt

您已经设置了一个小型服务,从Let的加密生成了免费证书,并配置了Nginx以使用该证书(fullchain.pem和privkey.pem)

然而,当我尝试从我的Android应用程序拨打电话时(使用OkHttp3) 我收到此错误

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found

是否允许加密根证书不受Android证书信任存储区信任?或者在设置nginx时我错过了什么? 解决这个问题的方法如果我还想使用Let的加密证书?

2 个答案:

答案 0 :(得分:1)

我不确定它是否有用,但/etc/letsencrypt/live/<your domain>/README文件说:

  

此目录包含您的密钥和证书。

     

privkey.pem:证书的私钥。

     

fullchain.pem:大多数服务器软件中使用的证书文件。

     

chain.pem:用于Nginx中的OCSP装订&gt; = 1.3.7。

     

cert.pem:将破坏许多服务器配置,不应使用                    无需阅读更多文档(参见下面的链接)。

     

我们建议不要移动这些文件。有关更多信息,请参阅   Certbot用户指南   https://certbot.eff.org/docs/using.html#where-are-my-certificates

所以也许你应该使用chain.pem

另一方面,对于那些甚至不使用Nginx的人,我从Android收到同样的错误,因为我错误地使用了chain.pem而不是fullchain.pem其中一个Android应用程序的解决方案要求您发送整个证书链(即:fullchain.pem),如下所述:

https://developer.android.com/training/articles/security-ssl.html#CommonHostnameProbs

  

有两种方法可以解决这个问题:

     
      
  • 配置服务器以在服务器中包含中间CA.   链。大多数CA提供了有关如何为所有常见操作执行此操作的文档   网络服务器。如果您需要该站点工作,这是唯一的方法   默认Android浏览器至少通过Android 4.2。

  •   
  • 或者,将中间CA视为任何其他未知CA,并创建一个   TrustManager直接信任它,就像前两个一样   部分。

  •   

希望它有所帮助。

答案 1 :(得分:0)

在让我们加密用户指南中:

If you’re using OCSP stapling with Nginx >= 1.3.7, chain.pem should be provided as the ssl_trusted_certificate to validate OCSP responses.

对于其他使用Apache的人,请检查您的apache版本。 对于我的服务器之一,我进行了设置。我正在使用Apache <2.4.8。在我们加密用户指南中:

cert.pem contains the server certificate by itself, and chain.pem contains the additional intermediate certificate... 
Apache < 2.4.8 needs these for SSLCertificateFile and SSLCertificateChainFile, respectively.

因此,对于 SSLCertificateFile ,请使用 cert.pem ; 对于 SSLCertificateChainFile ,请使用 chain.pem

我最初仅将 fullchain.pem 用于 SSLCertificateFile 。它适用于大多数浏览器和iOS。但是Android抱怨上述错误。

在Apache中分别配置证书和链,所有平台都可以正常工作。