【问题标题】:Certificate is trusted by PC but not by Android证书受 PC 信任,但不受 Android 信任
【发布时间】:2012-07-05 14:52:08
【问题描述】:

从今天早上开始,我的证书在 Android 上不再受信任,然后我的应用程序无法再连接:

 Catch exception while startHandshake: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
 return an invalid session with invalid cipher suite of SSL_NULL_WITH_NULL_NULL
 javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
    at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:137)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
    at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:591)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:807)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:781)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:770)

如果我在 Google Chrome(PC 上)中尝试没有问题,并且证书是受信任的,但如果我在 Android 上的 Chrome 浏览器中尝试,它会告诉我证书不受信任。我能做什么?

【问题讨论】:

  • 您正在与受保护的服务器进行通信,即 (Https)?
  • 是的,只要试试这个链接,你就会看到证书

标签: android ssl-certificate


【解决方案1】:

可能是您的设备上缺少证书。

尝试查看此答案:How to install trusted CA certificate on Android device?,了解如何在您自己的设备上安装 CA。

【讨论】:

  • 我的证书是由 PositiveSSL CA / Comodo CA Limited 颁发的,在我手机上的可信凭证中我可以看到 3 Comodo CA Limited(AAA 证书颁发机构、COMODO 证书颁发机构和 COMODO ECC 证书颁发机构)跨度>
【解决方案2】:

您的证书文件中可能缺少中间证书。如果您已经访问过具有相同证书销售商的另一个网站,则中间证书会被记住在您的浏览器中。对于您网站的每个访问者来说,这可能不会,甚至更好。要解决 SSL 连接中缺少中间证书的问题,您需要将中间证书添加到您自己的证书文件中。

GoDaddy 有一些关于中间证书的信息(但最好的来源始终是您的证书提供者): http://support.godaddy.com/help/article/868/what-is-an-intermediate-certificate

我曾经遇到过中间证书的问题(Commodo 也有),我必须将我自己的证书文件与中间 CA 结合起来才能工作。完成后,不再发生错误。

Godaddy 每个网络服务器的安装说明:http://support.godaddy.com/help/article/5346/installing-an-ssl-server-instructions?locale=en

以下是 Commodo 自己最常用的安装指南列表: https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/1145/0/how-do-i-make-my-own-bundle-file-from-crt-files

根据您使用的网络服务器,您需要指定所有证书(域证书、中间证书和根证书)或按顺序将它们组合成一个(例如对于 Nginx):

  1. 域证书
  2. 中级证书
  3. 根证书

在 SSH 终端中执行此操作的一种简单方法是键入:

cat domainfile intermediatefile rootfile > targetfile

证书测试工具

如果您遇到更多问题或不确定证书是否正确,请尝试使用在线工具验证您的 SSL 证书。例如:networking4all.com/en/ssl+certificates/quickscan

SNI 支持 android 2.2 及更低版本

请注意 android 2.2(可能更早版本)不支持 SNI,它允许不同主机名的多个 SSL 证书在一个 IP 地址上正常工作而不会出现问题。感谢@technyquist 提供该信息。请查看this SO question about SNI 了解有关此问题的更多信息。

【讨论】:

  • +1,这适用于我使用 2.3.X 设备的问题,因为它们似乎在链式验证顺序方面存在问题(在证书方面我很菜鸟)并且有了这个新设备以正确的顺序捆绑(通过@Luceos 建议的组合)就像一个魅力。谢谢
  • 不客气,我们也经常使用它。特别是因为它验证的不仅仅是中间证书。很高兴我能帮上忙。
  • comodo 的链接已失效
  • 感谢您的解释。我有一个 Thawte 证书,我必须登录他们的网站,点击“查看订单信息”。发送的电子邮件包含一个链接,可以在“附加证书”中下载中间证书。
  • 这适用于我的 OpenMediaVault NAS 和运行 Marshmallow 的手机。编辑服务器上的证书,附加中间证书,保存它,然后重新启动网络界面,我手机上的 Chrome 从“颁发者不受信任”变成了对证书很满意。谢谢!
【解决方案3】:

你必须创建一个 crt 包然后它就可以了。您将收到三个 crt 文件。全部使用!如果你只使用了 domain.crt 那么在 android 上会有警告,但在 PC 上不会。

我在 nginx 上。我打开domain_name.crt,然后打开positivesslca2.crt,全选复制到domain_name.crt的末尾。然后打开AddTrustExternalCARoot.crt,再次复制到domain_name.crt的末尾。然后安装 domain_name.crt

效果很好。

【讨论】:

  • 这看起来像是我正在寻找的解决方案,但它仍然对我不起作用。我也在使用 Godaddy 证书的 nginx 上。 godaddy 有 3 个证书:domain.crt、intermediate.crt 和 bundle.crt。根据您的答案,您知道哪个是正确的顺序吗?即域>中间>捆绑或域>捆绑>中间?出于某种原因,它们都不适合我。
  • 显然 bundle.crt 是串联的 [intermediate.crt + root.crt] ,所以这似乎是正确的顺序。但我仍然无法让它工作。有任何想法吗?谢谢。
  • 您不需要根目录,它已经捆绑到操作系统中。你只需要中间链。订单应该是您的 + 中间订单。
【解决方案4】:

当我尝试为每个中间证书使用多个 SSLCertificateChainFile 指令时,我在 Apache 2.2 下遇到了同样的问题;相反,我需要将所有三个连接到一个文件中。来自 GoDaddy,他们为我做了一个“捆绑”,这个额外的步骤对我来说是新的,但是重新阅读 the Apache documentation 使这一点变得明显。

值得注意的是,该指令是 deprecated as of Apache 2.4.8,因为您现在可以将所有中间体与实际证书连接起来。

【讨论】:

    【解决方案5】:

    我希望我还不算太晚,这里的解决方案对我有用,我正在使用 COMODO SSL,随着时间的推移,上述解决方案似乎无效,我的网站 lifetanstic.co.ke

    您可以执行以下操作,而不是联系 Comodo 支持并获取 CA 捆绑文件:

    当您从 Comodo(通过邮件)获得新的 SSL 证书时,他们会附上一个 zip 文件。 您需要解压缩 zip 文件并在记事本等文本编辑器中打开以下文件:

    AddTrustExternalCARoot.crt
    COMODORSAAddTrustCA.crt
    COMODORSADomainValidationSecureServerCA.crt
    

    然后复制每个“.crt”文件的文本并将文本粘贴在“证书授权包(可选)”字段中。

    之后,只需像往常一样在“证书”字段中添加 SSL 证书,然后单击“Autofil by Certificate”按钮并点击“安装”。

    【讨论】:

      【解决方案6】:

      我有一个类似的问题,并写了一篇关于它的详细文章。如果有人有同样的问题,请随时阅读我的​​文章。

      https://developer-blog.net/administration/ssl-zertifikat-installieren/

      这是一个详细的德语问题描述。

      【讨论】:

        【解决方案7】:

        在此处添加此内容可能会对某人有所帮助。我在使用 Android 时遇到问题,显示弹出窗口和无效证书错误。

        我们有一个 Comodo 扩展验证证书,并且我们收到了包含 4 个文件的 zip 文件:

        • AddTrustExternalCARoot.crt
        • COMODORSAAddTrustCA.crt
        • COMODORSAExtendedValidationSecureServerCA.crt
        • www_mydomain_com.crt

        我将它们全部连接在一行上,如下所示:

        cat www_mydomain_com.crt COMODORSAExtendedValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >www.mydomain.com.ev-ssl-bundle.crt

        然后我在 nginx 中使用该捆绑文件作为我的ssl_certificate_key。就是这样,现在可以工作了。

        受此要点启发:https://gist.github.com/ipedrazas/6d6c31144636d586dcc3

        【讨论】:

        • 我已经尝试了所有其他建议的步骤。这对我有用。谢谢!
        • 干得好,一直在疯狂搜索,这解决了它。
        • 谢谢,如果其他人在使用 Namecheap,请确保它采用以下格式:cat *yourdomainname*.crt *yourdomainname*.ca-bundle > cert_chain.crt
        【解决方案8】:

        使用 Comodo PositiveSSL,我们收到了 4 个文件。

        • AddTrustExternalCARoot.crt
        • COMODORSAAddTrustCA.crt
        • COMODORSADomainValidationSecureServerCA.crt
        • our_domain.crt

        当我们按照 comodo 网站上的说明进行操作时 - 我们会收到错误消息,指出我们的证书缺少中间证书文件。

        基本上语法是

        cat our_domain.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt  AddTrustExternalCARoot.crt > domain-ssl_bundle.crt
        

        【讨论】:

          【解决方案9】:

          使用 Godaddy 证书,您很可能会拥有 domain.keygd_bundle_something.crt 和(随机字母数字字符串)4923hg4k23jh4.crt

          您需要:cat gd_bundle_something.crt >> 4923hg4k23jh4.crt

          然后,在 nginx 上,您将使用

          ssl                  on;
          ssl_certificate      /etc/ssl/certs/4923hg4k23jh4.crt;
          ssl_certificate_key  /etc/ssl/certs/domain.key;
          

          【讨论】:

            【解决方案10】:

            我遇到了同样的问题。另一种生成正确 .crt 文件的方法如下:

            有时您会得到一个包含整个证书链的 .PEM 文件。该文件可能看起来像这样......

            -----BEGIN RSA PRIVATE KEY-----
            blablablabase64private...
            -----END RSA PRIVATE KEY-----
            -----BEGIN CERTIFICATE-----
            blablablabase64CRT1...
            -----END CERTIFICATE-----
            -----BEGIN CERTIFICATE-----
            blablablabase64CRT2...
            -----END CERTIFICATE-----
            ...
            

            如果您删除整个 private key 部分,您将拥有一个有效的链式 .crt

            【讨论】:

              【解决方案11】:

              我最近用我在 ssls.com 上购买的 Commodo 证书解决了这个问题,我有 3 个文件:

              domain-name.ca-bundle domain-name.crtdomain-name.p7b

              我必须在 Nginx 上设置它,这是我运行的命令:

              cat domain-name.ca-bundle domain-name.crt > commodo-ssl-bundle.crt
              

              然后我在 Nginx 配置文件中使用了 commodo-ssl-bundle.crt,效果非常好。

              【讨论】:

                【解决方案12】:

                我遇到了同样的问题,我的问题是设备没有正确的日期和时间。一旦我确定证书是受信任的。

                【讨论】:

                  【解决方案13】:

                  我遇到了同样的错误,因为我没有为 www.my-domain.com 颁发 Let's Encrypt 证书,仅针对 my-domain.com

                  也为 www. 发布并配置虚拟主机以在重定向到 https://my-domain.com 之前为 www.my-domain.com 加载证书。

                  【讨论】:

                    【解决方案14】:

                    确保您还使用了中间 crt(带有捆绑包的 .crt 文件。一些提供商也将其称为捆绑包或 ca 证书)。 然后在你的 ssl.conf 中,

                    SSLCertificateFile </path/for/actual/certificate>
                    
                    SSLCACertificateFile </path/for/actual/intermediate_certificate>
                    

                    然后重新启动您的网络服务器:ex for apache 使用:

                    sudo service httpd restart
                    

                    【讨论】:

                      猜你喜欢
                      • 2020-04-13
                      • 2019-02-26
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-01-15
                      • 2019-05-20
                      • 2013-11-01
                      • 2021-01-09
                      • 1970-01-01
                      相关资源
                      最近更新 更多