证书是由PC信任,但不是由Android

从今天上午开始,我的证书在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浏览器,它告诉我证书不受信任。 我能做什么?

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

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

我曾经有过一个中级证书的问题(与Commodo一样),不得不把我自己的证书文件和中间的CA结合起来工作。 一旦完成,没有发生错误了。

Godaddy的每个web服务器的安装说明: 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. 根证书

在SSHterminal中执行此操作的简单方法是键入:

 cat domainfile intermediatefile rootfile > targetfile 

证书testing工具

如果您遇到更多问题或者不确定证书是否正确,请尝试在线工具来validation您的SSL证书。 例如: https : //www.networking4all.com/en/support/tools/site+check/

SNI支持android 2.2及更低版本

请注意,android 2.2(也可能更旧)不支持SNI,它允许不同主机名的多个SSL证书在一个IP地址上工作,而不会出现问题。 感谢@technyquist提供这些信息。 有关此问题的更多信息,请查看关于SNI的SO问题。

你必须创build一个crt包,那么它会没事的。 您将收到三个crt文件。 全部使用它们! 如果你只使用了domain.crt,那么在android上会有警告,但在PC上不会。

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

工作很好。

在这里添加,因为它可能有助于某人。 Android出现popup窗口和无效证书错误时遇到问题。

我们有一个Comodo扩展validation证书,我们收到了包含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

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

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

当我们按照comodo网站上的指示 – 我们会得到一个错误,certificate我们的证书缺less中间证书文件。

基本上,语法是

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

我最近用ssl.com上的Commodo cert来解决这个问题,我有三个文件:

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

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

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

然后,我在Nginxconfiguration文件中使用了commodo-ssl-bundle.crt,就像一个魅力。

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

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

值得注意的是,这个指令从Apache 2.4.8开始已经被弃用了,因为你现在可以连接所有的中间体和实际的cert。

我希望我不会太晚,这里的解决scheme为我工作,我使用COMODO SSL,上述解决scheme似乎无效,我的网站lifetanstic.co.ke

而不是联系科摩多支持和获得CA包文件您可以执行以下操作:

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

 AddTrustExternalCARoot.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt 

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

之后,像往常一样在“证书”字段中添加SSL证书,然后点击“通过证书自动填写”button,然后点击“安装”。

随着Godaddy证书,你很可能会有一个domain.keygd_bundle_something.crt和(随机字母数字string) 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; 

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

有时候你会得到一个带有整个证书链的.PEM文件。 该文件可能看起来像这样….

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

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

我有同样的错误,因为我没有为www .my-domain.com发出Let's Encrypt证书,只有my-domain.com

也发行的www。 并configuration虚拟主机加载到www .my-domain.com的证书之前redirect到https://my-domain.com做了窍门。;

确保你也使用你的中间crt(.crt文件与捆绑..一些提供商也称之为捆绑或ca证书)。 那么在你的ssl.conf中,

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

然后重新启动你的web服务器:ex用于apache的使用:

 sudo service httpd restart 

可能是因为您错过了设备上的证书。

尝试看这个答案: 如何在Android设备上安装可信CA证书? 了解如何在您的设备上安装CA.

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

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

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