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

OpenSSL не может обнаружить просроченный промежуточный сертификат CA в тесте s_client SSL-соединения

Случайно у меня есть просроченный промежуточный сертификат в конце моего файла цепочки в конфигурации SSL моего сервера Dovecot. Достаточно большой проблемы, что мой почтовый клиент Android отказывается его использовать, хотя Apple Mail его отпускает (??!). Действительно, истечение срока произошло несколько часов назад. openssl x509 -in ... показывает:

    Serial Number:
        13:ea:28:70:5b:f4:ec:ed:0c:36:63:09:80:61:43:36
    Signature Algorithm: sha384WithRSAEncryption
    Issuer: C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
    Validity
        Not Before: May 30 10:48:38 2000 GMT
        Not After : May 30 10:48:38 2020 GMT
    Subject: C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority

Но эта команда:

openssl s_client -showcerts -verify_return_error -connect imap.example.com:993

не может указать на проблему (при выводе просроченного сертификата!). Версия пакета OpenSSL: 1.1.1g-1+ubuntu18.04.1+d

CONNECTED(00000003)
depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = Sectigo Limited, CN = Sectigo RSA Domain Validation Secure Server CA
verify return:1
depth=0 CN = imap.example.com
verify return:1

Как мне создать проверочный тест OpenSSL, чтобы найти и отметить это? Я уже довольно много поискал в Интернете и не нашел ничего, что могло бы устранить истечение срока действия на нескольких ступенях в публичной цепочке. Ближайший вопрос: Почему мой сертификат SSL не является доверенным на Android? но это касается только недостающего звена в цепочке из 4 сертификатов. Я предполагаю, почему Apple Mail принимает эту ошибку, заключается в том, что MacOS кэшировала свою собственную версию того же промежуточного центра сертификации с истекшим сроком действия.

РЕДАКТИРОВАТЬ

На сервере следующее:

/usr/share/ca-certificates/mozilla/USERTrust_RSA_Certification_Authority.crt

теперь самоподписан, поэтому openssl должен молча подставлять этот (редактировать: проверено путем скрытия этого сертификата; срок действия теперь обнаружен!), но моя цель - быть достаточно чувствительной, чтобы обнаружить жалобу Android. У меня Android 10, но одно обновление (от 4 мая) отстает от последнего.

Кредит на SSLMate за отличное объяснение.

В основном Корневой сертификат внешнего ЦС AddTrust теперь не соответствует требованиям, и по состоянию на 30 мая 2020 года срок действия этого сертификата истек. Вероятно, есть Другой сертификаты в вашем пакете CA, которые можно использовать для проверки основного сертификата, который у вас есть, но более старое программное обеспечение (OpenSSL 1.0 и т.п.) не работает, потому что оно выбирает цепочку сертификатов, срок действия которой только что истек, а не ту, которая будет работать. Решение состоит в том, чтобы удалить просроченный сертификат из файла сертификата, но вы, вероятно, уже знали об этом.

Однако знание того, что уязвимо, является ключом к написанию необходимого теста - вам нужно обернуть старую уязвимую версию OpenSSL во что-то, что можно использовать как часть вашего теста. Я использовал curl на MacOS, потому что он отказывается проверять сертификат с сертификатом AddTrust в цепочке, но мы видели командную строку openssl также обнаруживаем его, не зная, какую именно версию мы используем.

Конечно, если вы знаете, что плох именно этот сертификат, вы всегда можете найти его по подписи:

openssl x509 -noout -fingerprint -in ../AddTrust\ External\ CA\ Root-2020.crt`

и сравните ответ с

SHA1 Fingerprint=02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68

что это за плохой сертификат.

я надеясь эта конкретная уязвимость сертификата с истекшим сроком действия является редкостью, но если вы хотите провести более общий тест, вы должны найти случай, когда существует более одной возможной цепочки, и одна допустима, а другая нет.