Назад | Перейти на главную страницу

CertPathValidatorException с сервером Windows и клиентом Android

Я установил новый сертификат PositiveSSL от Comodo на компьютер с Windows Server 2008 R2. Я успешно подключился от следующих клиентов

на следующие серверы

Однако, когда я использую K-9 Mail для Android для подключения к MDaemon, я получаю сообщение об ошибке

java.security.cert.CertPathValidatorException: Trust Anchor for certificate path not found

Я предполагаю, что Chrome и K-9 ведут себя по-разному на одном и том же телефоне, потому что Chrome для Android имеет собственное хранилище корневых центров сертификации и не полагается на хранилище корневых центров сертификации ОС Android или, по крайней мере, имеет разную логику проверки доверия.

Я установил сертификаты прямо из ZIP-файла, который Comodo прислал мне по электронной почте:

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)

Когда я установил их в хранилище сертификатов Windows для использования RDP и MDaemon, я преобразовал эти сертификаты в файл PKCS12, используя

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 Certificates для учетной записи компьютера, используя автоматическое место назначения. Я выбрал новый сертификат в диалоговом окне «Настройки безопасности MDaemon» в разделе «SSL и TLS»> «MDaemon» и нажал «Перезагрузить серверы». Используя OpenSSL, я вижу, что правильный сертификат обслуживается вместе с промежуточными сертификатами.

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 и на то, находится ли корневой ЦС в магазине ЦС Android.

Вот ожидаемая полная цепочка сертификатов. Приведенные ниже имена являются общими именами (CN).

AddTrust External CA Root
└─COMODO RSA Certification Authority
  └─COMODO RSA Domain Validation Secure Server CA
    └─www.myserver.com

Я видел, что внешний корень CA AddTrust действительно существует в хранилище сертификатов Android с правильным отпечатком.

Почему K-9 Mail выдает ошибку о том, что нет пути от сертификата TLS моего сервера к доверенному корневому ЦС?

Ответ пришел из статьи базы знаний Comodo: Ошибка ненадежного сертификата на Android.

Причина ошибки - существующие сертификаты Comodo в хранилище сертификатов Windows по умолчанию. Один из промежуточных сертификатов, COMODO RSA Certification Authority, по умолчанию присутствует в папке Trusted Root Certification Authorities в качестве сертификата CA, выданного самостоятельно. Туда не устанавливал, в винде есть в стоковой установке. Я не уверен, почему он там, потому что настоящий центр сертификации COMODO RSA выдается AddTrust, а не им самим, и отпечатки пальцев не совпадают. Кроме того, этот поддельный самовыданный Comodo Root CA отсутствует в корневом хранилище Android 4.4, хотя есть три других Comodo CA с CN, достаточно похожими, чтобы ввести в заблуждение, если вы не проверите отпечатки пальцев. Возможно, существует какая-то историческая причина, связанная с реорганизацией CA между Comodo и AddTrust.

Решение из статьи базы знаний исправило ошибку в K-9: удалите самостоятельно созданный центр сертификации COMODO RSA из доверенных корневых центров сертификации Windows (я фактически вырезал и вставил его в другую папку на случай, если мне нужно отменить изменение , вместо того, чтобы удалить его навсегда).

Этот поддельный сертификат заставил MDaemon предположить, что промежуточный сертификат Comodo более высокого уровня на самом деле был корневым сертификатом, и он не отправлял его в квитировании SSL на K-9. Это было указано, но недостаточно очевидно для меня в выводе s_client. До исправления MDaemon отправлял только два нижних сертификата в цепочке, а у Android не было пути доверия от третьего сертификата (проверка домена Comodo) до AddTrust, поскольку второй сертификат отсутствовал в ответе. После исправления MDaemon отправил три нижних сертификата в цепочке, и Android смог успешно найти путь от Comodo Certification CA к AddTrust.

Один нерешенный вопрос - это автоматические обновления корневого центра сертификации Windows. Comodo предупреждает, что эти обновления восстановят нежелательный сертификат в хранилище доверенного корневого ЦС, и рекомендует отключить все обновления корневого ЦС. Я думаю, что это не лучшее решение, потому что я хочу, чтобы список корневых центров сертификации оставался актуальным за одним исключением. Я подумываю о попытке найти или написать программу, которая может удалить данный сертификат из хранилища сертификатов компьютера и периодически запускать его. Может быть, я могу написать сценарий на основе PowerShell или certmgr.exe. По крайней мере, может быть, я смогу добавить некоторый автоматический мониторинг, когда список корневых ЦС обновлен и нежелательный сертификат восстановлен, так что я знаю, что пора удалить его вручную.