openssl: невозможно получить сертификат местного эмитента для accounts.google.com

Я получаю , что не могу получить сертификат местного эмитента для accounts.google.com через SSL. Я загрузил файл CA обновления с сайта https://curl.haxx.se/ca/cacert. pem и я использую openssl s_client для рендеринга:

➜  ~ openssl s_client -connect accounts.google.com:443 -CAfile ~/certs/cacert.pem
CONNECTED(00000003)
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=accounts.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEoTCCA4mgAwIBAgIIZMJyEcZ8LIAwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTcwMzE2MDkxNjU0WhcNMTcwNjA4MDg1NDAw
WjBtMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEcMBoGA1UEAwwTYWNj
b3VudHMuZ29vZ2xlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AI53MUFYpFrV3J+B6ZbblEh+MlLsVbDqwMwFNEG4c+IjVXGDuUDGp+C7jkdVmIn2
T8skXutZj6E14D7WZvakq4pvSMBRkmkuWZk4+nWUY2/+TXuMYZXV0fnKBcDXTUxm
Bbc7a9gKVPD/dUHjJFWfkGznyq9lP0taT2MYsYE8+am4GAykSEgF2e4dEE4TrqWM
BP0+M/QfreykfpO/BF0UyqWXwzp4oYUWUyv2g8TU+i5hlELnVLU/0/jxaDA01ucH
+z0IRXxLxZW3/HXGNxr3wd24fvBD0PBe45ftUIM1Hq5x0kf0iv18aFR9Uy1yDl5W
ie4V8cRNq1m8h+b+IDiiuWsCAwEAAaOCAWcwggFjMB0GA1UdJQQWMBQGCCsGAQUF
BwMBBggrBgEFBQcDAjA1BgNVHREELjAsghNhY2NvdW50cy5nb29nbGUuY29tghUq
LnBhcnRuZXIuYW5kcm9pZC5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAC
hh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9o
dHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBQ1jLhJdsYE
BiSt2vOb6DCTV5y+EjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZo
tXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHWeQIFATAIBgZngQwBAgIw
MAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcyLmNy
bDANBgkqhkiG9w0BAQsFAAOCAQEAi2c6nKtNZ5bHAG7mbBuqS2OA093euznd+d0q
0DG+LvgSFwOHeSZn0VHGDiQ8nGhvA/3W7cva+p2zO29zQDiFTUW3+Ni+vFLl1yY+
JXiTBqStVAihau9BLitvsFXT/3+NjxJ/TgDz9EkoDlEAnsofZ7amH2mA4+cMdN5P
eAMUjJgKc7iJdxgZMLYXC7oYoHDz2PqgKy+lgk4+mIxxLWfiYWRqMFVvIwFlY1eC
ORulBjAOdRkm1yLpMfmHcXxA4C7jtoxrtr1vJs7i061JF78grhuqYdKvSc5TEhD+
II5MNcN2ArQgWbA92Pv1YVk0COEDcJoVSZ4bJtOH+iEpLg7fRg==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=accounts.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
---
SSL handshake has read 3273 bytes and written 456 bytes
---
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES128-SHA
    Session-ID: 50C97032E3B74D2CC706CA939CC7FF5EFD40C8D590E8F2B084CD36F092721547
    Session-ID-ctx:
    Master-Key: 1F4565E7707F318C872DA80E1544501E2DA5E0F1508193762D8E61EFB69C2683AE7914D2117E150746F328FAA01CC499
    Key-Arg   : None
    Start Time: 1490708489
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

Не знаю, как разрешить

1
задан 28 March 2017 в 17:24
2 ответа

asonge правильно, что проблема связана с тем, что третий сертификат в цепочке сертификатов, GeoTrust Global CA ) был выпущен Equifax Центр сертификации безопасности , который не указан в качестве доверенного сертификата CA в файле, загруженном с веб-сайта Curl. Я подумал, что дополню его / ее ответ - и успокою bcardarella - объяснением, почему это так.

Список доверенных сертификатов CA с веб-сайта Curl фактически генерируется из используемых корневых сертификатов пользователя Mozilla. Причина, по которой сертификат Equifax не указан в нем, заключается в том, что: Equifax и другие сертификаты CA были удалены из списка доверенных сертификатов CA Mozilla в октябре 2016 года . См. Следующий отчет об ошибке, которая привела к этому изменению: Удалите неаудитированные корневые сертификаты Symantec из NSS .

Сертификат с перекрестной подписью

Сертификат GeoTrust на самом деле является сертификатом с перекрестной подписью . Это означает, что существует две версии сертификата GeoTrust, сгенерированного из одного и того же закрытого ключа (используемого для подписи сертификата Google Internet Authority G2 ).

  • самоподписанный (сейчас перечислен в большинстве корневых хранилищ ЦС) )
  • один, подписанный Equifax

Второй сертификат был полезен еще в те дни, когда GeoTrust CA был впервые запущен. В то время клиенты доверяли ему, так как доверяли сертификату Equifax, который использовался для его подписи. Такой сертификат известен как мостовой сертификат .

Для сертификатов с перекрестной подписью существует более одного возможного пути проверки:

1. Использование самозаверяющего сертификата

Это стандартное поведение последних версий OpenSSL.

$ echo | openssl s_client -connect accounts.google.com:443 -CAfile cacert.pem >/dev/null
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = accounts.google.com
verify return:1
DONE

2. Использование «мостового» сертификата

Вот демонстрация более длинной цепочки промежуточных сертификатов. Я использовал OpenSSL 1.0.2k и эмулировал его старое поведение по умолчанию, заключающееся в отказе от альтернативных цепочек сертификатов. Поскольку корневой сертификат CA Equifax больше не существует в моем системном хранилище сертификатов, я явно указываю его использование в качестве корневого хранилища CA для этой одной команды:

$ echo | openssl s_client -connect accounts.google.com:443 -CAfile Equifax_Secure_CA.pem  -no_alt_chains >/dev/null
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = accounts.google.com
verify return:1
DONE

Поведение OpenSSL

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

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

Эта конкретная проблема

В этом случае запуск s_client с параметром -showcerts показывает, что веб-сервер Google по-прежнему отправляет устаревший сертификат моста, подписанный закрытым ключом Equifax. Я подозреваю, что вы используете старую версию OpenSSL (до 1.0.2b) и что она использует их все при построении своей цепочки промежуточных сертификатов.

Решения

Вот несколько возможных решений для обеспечения s_client показывает, что все сертификаты в цепочке доверия проверяются правильно:

  1. Обновление до более новой версии (1.02b и выше), которая проверяет, может ли быть построена альтернативная (более короткая) цепочка, которая проверяет - если первая (длинная) цепочка не может быть проверена.

  2. Некоторые старые версии s_client принимают параметр -trusted_first , который приводит к проверке OpenSSL, может ли он построить более короткая цепочка с использованием сертификатов из списка доверенных корневых сертификатов ЦС ( до попытка построения длинной цепочки).

  3. Импортируйте Equifax Secure Certificate Authority в свое хранилище сертификатов - или сохраните как файл и обращайтесь к нему с помощью параметров -CAfile или -CApath для s_client .

4
ответ дан 3 December 2019 в 16:44

На самом деле это не ошибка. Это внизу доверенного сертификата (сертификат с темой s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA), но у этого доверенного сертификата есть эмитент i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority, который не входит в список доверенных. На самом деле это совершенно нормально. Если вы посмотрите на итоговый статус проверки внизу, вы будете проверены должным образом.

Некоторое время корневой ЦС может быть самоподписанным (issuer == subject), но это не так. До тех пор, пока один сертификат в цепочке находится в доверительном управлении, он надлежащим образом аутентифицирован

.
2
ответ дан 3 December 2019 в 16:44

Теги

Похожие вопросы