证书受PC信任,但不受Android信任


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上使用Google Chrome浏览器,就没有问题,并且证书是受信任的,但是如果我尝试在Android上的Chrome浏览器中尝试,则表明证书不受信任。我能做什么?


您正在与安全服务器(即(Https))通信?
Mohsin Naeem

是的,确实,只需尝试链接,您就会看到证书
Alexis

Answers:


92

您可能在证书文件中缺少中间证书。如果您已经访问了另一个具有相同证书卖方的网站,则中间证书将在您的浏览器中记住。并非每个网站访问者都可能会(甚至更好)。要解决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文件

根据所使用的Web服务器,您需要按顺序指定所有证书(域证书,中间证书和根证书)或将它们组合为一个证书(例如,对于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,SNI允许针对不同主机名的多个SSL证书在一个IP地址上正常工作。感谢@technyquist提供该信息。请查看有关SNI的SO问题,以获取有关此问题的更多信息。


+1,这对于我使用2.3.X设备的问题很有用,因为它们似乎存在链式验证顺序的问题(关于证书,我是非常菜鸟),并且具有正确顺序的新捆绑包(通过组合)就像@Luceos建议的一样)就像一个魅力。谢谢
Armando 2014年

不客气,我们也会定期使用它。特别是因为它不仅可以验证中间证书,还可以验证更多信息。很高兴能为您提供帮助。
Luceos 2014年

comodo的链接已死
露脸的话,2015年

1
感谢您的解释。我有Thawte证书,我必须登录他们的网站,然后单击“查看订单信息”。发送的电子邮件包含一个链接,可以在“附加证书”中下载中间证书。
Guillaume Renoult,2015年

1
这适用于我的OpenMediaVault NAS和运行棉花糖的手机。在服务器上编辑证书,附加中间证书,保存它,然后重新启动Web界面,我手机上的Chrome浏览器从“发行人不受信任”变为对证书感到满足和满意。谢谢!
Doktor J

19

您必须创建一个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。您知道根据您的回答正确的顺序吗?即域>中间>捆绑或域>捆绑>中间?由于某种原因,它们都不适合我。
isapir 2014年

显然bundle.crt是[intermediate.crt + root.crt]的并置,因此这似乎是正确的顺序。但是我仍然无法正常工作。有任何想法吗?谢谢。
isapir 2014年

您不需要根目录,它已经捆绑在操作系统中。您只需要中间链。订单应该是您的+中级。
dalore 2014年

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


1
我已经尝试了所有其他建议的步骤。这对我有用。谢谢!
ericbae 2015年

1
很好的工作,像个疯子一样一直在谷歌搜索,这已经解决了。
Olafur Tryggvason

谢谢,如果有人使用Namecheap,请确保它采用以下格式: cat *yourdomainname*.crt *yourdomainname*.ca-bundle > cert_chain.crt
哈里(Harry)

1

使用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

1

我最近在ssls.com上购买了Commodo cert来解决这个问题,我有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,它的工作原理像一个超级按钮。


1

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



0

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

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


0

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

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

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

AddTrustExternalCARoot.crt
COMODORSAAddTrustCA.crt
COMODORSADomainValidationSecureServerCA.crt

然后复制每个“ .crt”文件的文本,并将这些文本粘贴在“证书颁发机构捆绑包(可选)”字段的上方。

之后,只需像往常一样在“证书”字段中添加SSL证书,然后单击“按证书自动过滤”按钮,然后单击“安装”即可。


0

与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;

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


0

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

SSLCertificateFile </path/for/actual/certificate>

SSLCACertificateFile </path/for/actual/intermediate_certificate>

然后重新启动您的webserver:ex以供apache使用:

sudo service httpd restart

-1

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

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


我的证书是由PositiveSSL CA / Comodo CA Limited颁发的,在我信任的电话凭据中,我可以看到3 Comodo CA Limited(AAA证书颁发机构,COMODO证书颁发机构和COMODO ECC证书颁发机构)
Alexis

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.