首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Windows和Android的CertPathValidatorException

带有Windows和Android的CertPathValidatorException
EN

Server Fault用户
提问于 2017-05-21 07:07:58
回答 1查看 797关注 0票数 1

我在Windows 2008 PositiveSSL计算机上安装了Comodo的新R2证书。我成功地从下列客户端连接

  • Chrome for Windows
  • 用于Android的Chrome
  • Firefox for Windows
  • Internet Explorer
  • Vivaldi for Windows
  • 面向Windows的Opera ( HTTPS和IMAP)
  • Windows远程桌面连接

发送到以下服务器

  • Apache与mod_ssl
  • 远程桌面服务
  • MDaemon

但是,当我使用K-9Mail为Android连接到MDaemon时,我会得到错误

代码语言:javascript
复制
java.security.cert.CertPathValidatorException: Trust Anchor for certificate path not found

我假设Chrome和K-9在同一部手机上的行为不同,因为Chrome为Android提供了自己的根CA存储,并且不依赖Android OS根CA存储,或者至少有不同的信任验证逻辑。

我安装的证书直接来自Comodo发送给我的ZIP文件:

代码语言:javascript
复制
AddTrustExternalCARoot.crt (this is the root CA)
COMODORSAAddTrustCA.crt (this is a higher-level intermediate CA)
COMODORSADomainValidationSecureServerCA.crt (this is a lower-level intermediate CA)
www_myserver_com.crt (this is my server's cert)

将这些证书安装到以供RDP和MDaemon使用时,我将这些证书转换为一个PKCS12文件

代码语言:javascript
复制
cat "./www_myserver_com.crt" "./COMODORSADomainValidationSecureServerCA.crt" "./COMODORSAAddTrustCA.crt" "AddTrustExternalCARoot.crt" > "./fullchain.crt"
openssl pkcs12 -in "./fullchain.crt" -inkey "./www_myserver_com.key" -out "./fullchain.pfx" -export

然后使用自动存储目的地将PFX文件导入到计算机帐户的证书MMC管理单元中。我在MDaemon的对话框中选择了SSL & TLS >MDaemon下的新证书,然后点击重新启动服务器。使用OpenSSL,我可以看到正确的证书与中间证书一起提供。

代码语言:javascript
复制
C:\>openssl s_client -connect myserver.com:993
CONNECTED(00000003)
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN
= COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN
= COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = www.myserver.com
verify return:1
---
Certificate chain
 0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=www.myserver.com
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Dom
ain Validation Secure Server CA
 1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Dom
ain Validation Secure Server CA
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Cer
tification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MII..8hg==
-----END CERTIFICATE-----
subject=/OU=Domain Control Validated/OU=PositiveSSL/CN=www.myserver.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA D
omain Validation Secure Server CA
---
No client certificate CA names sent
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3401 bytes and written 450 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: F04A0000068E4DC91357783440DA44EEB39DA3C813C3C646EBCE29DDD3E8C139

    Session-ID-ctx:
    Master-Key: FF3D72A03F1F93686AC6EAB38198036C7AF1780250ED3F510A83CE6DC166778F
A726DBC2AA4ED6C5277A0969D175E419
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1495135778
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

我查看了Android中的证书链,以及根CA是否位于Android的CA商店中。

以下是预期的完整证书链。以下名称为通用名称(CN)。

代码语言:javascript
复制
AddTrust External CA Root
└─COMODO RSA Certification Authority
  └─COMODO RSA Domain Validation Secure Server CA
    └─www.myserver.com

我看到AddTrust外部CA根确实存在于中,具有正确的拇指指纹。

为什么K-9邮件会抛出错误,说明从我的服务器的TLS证书到受信任的根CA没有路径?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2017-05-21 07:07:58

答案来自Comodo知识库的一篇文章:Android上的不可信证书错误

错误的原因是默认Windows证书存储区中的现有Comodo证书。默认情况下,中间证书之一COMODO RSA Certification Authority作为自颁发的CA证书显示在“受信任根证书颁发机构”文件夹中。我不是在那里安装的,Windows是在股票安装中安装的。我不知道为什么会出现这种情况,因为真正的COMODO RSA认证机构是由AddTrust颁发的,而不是它本身,而且指纹不匹配。此外,这个伪造的自己发行的Comodo并不存在于Android4.4‘S的根存储中,尽管还有另外三家Comodo CA与CNs非常相似,除非你检查拇指指纹,否则会让人感到困惑。可能与Comodo和AddTrust之间的CA重组有关的历史原因。

KB文章中的解决方案修复了K-9中的错误:从Windows受信任的根证书颁发机构中删除自颁发的COMODO RSA证书颁发机构(实际上,我将其剪切并粘贴到另一个文件夹,以防需要还原更改,而不是永久删除它)。

这个假证书导致MDaemon假设高级中间Comodo证书实际上是根证书,并且它没有在SSL握手中将其发送到K-9。在s_client输出中,这是指示的,但对我来说不够明显。在修复之前,MDaemon只发送链中的最后两个证书,并且Android没有从第三个证书(Comodo域验证)到AddTrust的信任路径,因为响应中缺少第二个证书。修复后,MDaemon发送了链中的最后三个证书,Android成功地找到了从Certification到AddTrust的路径。

一个未解决的项目是Windows自动根CA更新。Comodo警告说,这些更新将将不需要的证书还原到受信任的根CA存储区,并建议禁用所有根CA更新。我认为这不是最好的解决方案,因为我希望根CA列表在这个例外情况下保持最新。我正在考虑寻找或编写一个程序,该程序可以从计算机证书存储中删除给定的证书,并定期运行。也许我可以编写一个基于PowerShell或certmgr.exe的脚本。至少,在更新根CA列表和还原不需要的证书时,我可以添加一些自动监视,所以我知道是时候手动删除它了。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/851355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档