82

从今天早上开始,我的证书在 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)

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

4

14 回答 14

95

您的证书文件中可能缺少中间证书。如果您已经访问过具有相同证书卖家的另一个网站,则中间证书会被记住在您的浏览器中。对于您网站的每个访问者来说,这可能不会 - 甚至更好 - 不会是这种情况。要解决 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-我自己的捆绑文件来自 crt 文件

根据您使用的网络服务器,您需要指定所有证书(域证书、中间证书和根证书)或按顺序将它们组合成一个(例如,用于 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 提供该信息。请查看有关 SNI的 SO question,以获取有关此问题的更多信息。

于 2012-07-05T08:26:34.667 回答
19

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

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

效果很好。

于 2012-12-02T20:49:45.590 回答
9

在此处添加此内容,因为它可能对某人有所帮助。我在使用 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

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

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

于 2015-06-18T15:44:35.200 回答
2

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

于 2017-01-27T20:42:27.100 回答
1

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

  • AddTrustExternalCARoot.crt
  • COMODORSAAddTrustCA.crt
  • COMODORSADomainValidationSecureServerCA.crt
  • 我们的域名.crt

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

基本上语法是

cat our_domain.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt  AddTrustExternalCARoot.crt > domain-ssl_bundle.crt
于 2015-09-29T10:11:59.753 回答
1

我最近使用在 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 并且像一个魅力一样工作。

于 2016-12-12T10:51:42.053 回答
1

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

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

于 2017-03-14T20:00:34.717 回答
0

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

值得注意的是,从 Apache 2.4.8 开始不推荐使用此指令,因为您现在可以将所有中间体与实际证书连接起来。

于 2014-09-22T17:15:23.407 回答
0

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

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

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

AddTrustExternalCARoot.crt
COMODORSAAddTrustCA.crt
COMODORSADomainValidationSecureServerCA.crt

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

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

于 2015-05-20T16:00:13.543 回答
0

使用 Godaddy 证书,您很可能会拥有一个domain.key,gd_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;
于 2016-03-30T13:31:00.980 回答
0

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

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

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

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

于 2016-04-12T06:31:24.220 回答
0

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

SSLCertificateFile </path/for/actual/certificate>

SSLCACertificateFile </path/for/actual/intermediate_certificate>

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

sudo service httpd restart
于 2017-06-02T22:11:19.993 回答
-1

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

试试看这个答案:如何在 Android 设备上安装受信任的 CA 证书?了解如何在您自己的设备上安装 CA。

于 2012-07-05T08:23:35.200 回答
-1

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

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

它是德语的详细问题描述。

于 2015-06-03T20:31:51.630 回答