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

时间:2012-07-05 08:12:37

标签: android ssl-certificate

从今天早上开始,我的证书在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浏览器,它会告诉我证书不受信任。我该怎么办?

14 个答案:

答案 0 :(得分:90)

您可能缺少证书文件中的中间证书。如果您已访问过具有相同证书销售商的其他网站,则会在您的浏览器中记住中间证书。对于您网站的每位访问者来说,这可能不会 - 甚至更好 - 不会出现这种情况。要解决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. 根证书
  4. 在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 :(得分:19)

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

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

效果很好。

答案 2 :(得分:8)

在此处添加此内容可能有助于某人。我遇到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

答案 3 :(得分: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

答案 4 :(得分:1)

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

domain-name.ca-bundle domain-name.crt domain-name.p7b

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

var myJSON = 
{
  data: [
    {"project":"4","value":"5"},
    {"project":"2","value":"3"},
    {"project":"4","value":"5"},
    {"project":"4","value":"4"},
    {"project":"1","value":"8"},
  ]
}

var sum = 0;
for(var i = 0; i< myJSON.data.length; i++)  {
  var project = myJSON.data[i];
  if (project.project === "4"){
    sum += parseInt(project.value, 10);
  }
}

然后我在Nginx配置文件中使用了commodo-ssl-bundle.crt,就像魅力一样。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我遇到了同样的错误,因为我没有为 www .my-domain.com颁发Let的加密证书,仅适用于my-domain.com

还发布了 www。,并在重定向到https://my-domain.com之前配置vhost以加载 www .my-domain.com的证书。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

我希望我不会太迟,这个解决方案对我有用,我使用的是COMODO SSL,上述解决方案随着时间的推移似乎无效,我的网站lifetanstic.co.ke

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

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

AddTrustExternalCARoot.crt
COMODORSAAddTrustCA.crt
COMODORSADomainValidationSecureServerCA.crt

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

之后,只需在“证书”字段中添加SSL证书,然后单击“按证书自动填充”按钮并点击“安装”。

答案 9 :(得分: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;

答案 10 :(得分: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

答案 11 :(得分:0)

确保你也使用你的中间crt(.crt文件与一个包..一些提供商也称它为bundle或ca证书)。 然后在你的ssl.conf中,

SSLCertificateFile </path/for/actual/certificate>

SSLCACertificateFile </path/for/actual/intermediate_certificate>

然后重启你的网络服务器:ex for apache use:

sudo service httpd restart

答案 12 :(得分:-1)

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

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

答案 13 :(得分:-1)

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

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

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