Как проверить двустороннее защищенное соединение https с помощью OpenSSL / Curl - PullRequest
0 голосов
/ 28 февраля 2019

Вопрос, кажется, задавался раньше:
OpenSSL Проверочный код возврата: 20 (невозможно получить сертификат местного эмитента) .
Однако разница в том, что оно местном сертификате эмитента.Кроме того, ответы не для компьютера с Windows.

Описание проблемы
На компьютере с Windows у меня есть программа, которая пытается связаться с защищенным сервером.Безопасность с сертификатами на обеих сторонах.

Проблема: я не могу связаться с ним, поэтому я попытался выяснить, правильно ли установлены сертификаты

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

В качестве примера, чтобы проверить, все ли сертификаты для соединения установлены правильно, мне посоветовалипроверить соединение с google.com:

openssl.exe s_client -connect google.com:443

(У моих браузеров нет проблем с подключением к этому серверу)

Первые строки ответа:

CONNECTED(00000184)
depth=1 C = US, O = Google Trust Services, CN = Google Internet Authority G3
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=*.google.com
   i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
 1 s:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
   i:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
...

И еще одна ошибка дважды:

Verification error: unable to get local issuer certificate
Verify return code: 20 (unable to get local issuer certificate)

Увы, документация OpenSSL о s_client не очень информативна в отношении этих ошибок.

Так что это значит?Я пропускаю некоторые сертификаты для связи с google.com или использую для этого неправильную программу?

Конечно, google.com - это только пример.Я выбрал это, чтобы я мог проверить, были ли обнаруженные проблемы из-за проблем с сертификатами или из-за команды, которую я использую.

Для моего фактического сервера, с которым я пытаюсь связаться, у меня есть соответствующие сертификаты (доroot) как файлы .CER.Корневой сертификат находится в магазине вин.

1 Ответ

0 голосов
/ 05 марта 2019

Патрик Мевзек указал мне на правильный ответ (Спасибо, Патрик!).Поскольку было необходимо провести некоторое расследование, я решил записать его как полный ответ.

Я работаю в Windows Server 2012. Более новые версии, вероятно, будут работать аналогично.Для проверки сертификатов и связи я использую:

Файлы:

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

  • Корневой сертификат, которому можно доверять: Root.Pem
  • Цепочка ненадежных сертификатоввыданный корневым сертификатом: A.Pem, B.Pem, C.Pem
  • Файл закрытого ключа MyPrivate.key и доверенный сертификат, выданный C.Pem для подтверждения моей личности: MyCertificate.pem

Если необходимо, Преобразовать файл сертификата в формат PEM

Если сертификаты не в формате PEM, нам нужно сначала преобразовать их.Чтобы проверить, есть ли они в PEM, откройте их в текстовом редакторе.Файл PEM выглядит следующим образом:

-----BEGIN CERTIFICATE-----
MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
...
-----END CERTIFICATE-----

Если это не так, мы можем использовать openSSL для преобразования файла:

openssl.exe x509 -inform DER -in myCertificate.cer -out myCertificate.Pem
  • inform: формат входного файла:DER / NET / PEM (ну, если уже PEM вам не нужно конвертировать)
  • in / out: входной файл, выходной файл

Проверка цепочки сертификатов

Для дополнительной безопасности я проверял каждый сертификат отдельно.Вероятно, это также безопасно сделать за один шаг.

  • Проверьте действительность корневого сертификата.Например, путем проверки отпечатка пальца с помощью опубликованного отпечатка пальца.
  • Проверьте действительность недоверенных сертификатов

(1) Выпускается ли A.pem Root.Pem?

openssl.exe verify -show_chain -CAfile root.pem A.pem

Параметр -CAfile содержит доверенный сертификат.Последний файл - это файл, содержащий сертификат для проверки.

Ответ должен быть похож на:

A.pem: OK
Chain:
depth=0: C = NL, ..., CN = <some text describing certificate A> (untrusted)
depth=1: C = NL, ..., CN = <some text describing the trusted root certificate>

(2) B.Pem выдан доверенным A.Pem?

Теперь, когда A.pem можно доверять, мы можем проверить B.Pem.Для этого мы упоминаем промежуточный сертификат A.Pem как ненадежный, как рекомендовано в этот ответ

openssl.exe verify -show_chain -CAfile root.pem -untrusted A.pem B.pem

Ответ:

B.pem: OK
Chain:
depth=0: C = NL, ..., CN = <some text describing certificate B> (untrusted)
depth=1: C = NL, ..., CN = <some text describing certificate A> (untrusted)
depth=2: C = NL, ..., CN = <some text describing the trusted root certificate>

(3) Можем ли мы доверятьОстальная часть цепочки сертификатов?

Так что теперь B можно доверять.Чтобы продолжить проверку цепочки, объедините ненадежные CA-файлы в один файл unrusrusted.pem.Не добавляйте MyCertificate.Pem

-----BEGIN CERTIFICATE-----
MIIGNjCCBB6gAwIBA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
jCCBB6gAwIBA34F..
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
dZBo31cAYsByRL...
-----END CERTIFICATE-----

И команду:

openssl.exe verify -show_chain -CAfile root.pem -untrusted untrusted.pem myCertificate.pem

Ответ:

MyCertificate.pem: OK
Chain:
depth=0: C = NL, ..., CN = <some text describing MyCertificate> (untrusted)
depth=1: C = NL, ..., CN = <some text describing certificate C> (untrusted)
depth=2: C = NL, ..., CN = <some text describing certificate B> (untrusted)
depth=3: C = NL, ..., CN = <some text describing certificate A> (untrusted)
depth=4: C = NL, ..., CN = <some text describing the trusted root certificate>

Я думаю, что все эти промежуточные шаги не были необходимы дляпроверьте правильность.

Проверьте соединение

Теперь, когда цепочка сертификатов является доверенной, мы можем использовать OpenSsl для проверки соединения.

  • Объединить все сертификаты, кроме MyCertificate.pem в одном файле AllTrusted.pem, используйте текстовый редактор или команду Copy Root.Pem + A.Pem + B.Pem ... Trusted.Pem

Команда:

openssl.exe s_client CAfile Trusted.Pem -connect google.nl:443

Замените google.nl:443 на правильный адрес и порт

Ответить, что-то похожее на:

CONNECTED(00000124)
depth=1 C = US, O = Google Trust Services, CN = Google Internet Authority G3
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=google.com
  i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
1 s:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
  i:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIhWDCCIECgAwIBAgIQaEMB4EOx3++GhdWADJfgEjANBgkqhkiG9w0BAQsFADBU
...
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google LLC/CN=google.com
issuer=/C=US/O=Google Trust Services/CN=Google Internet Authority G3

Сервер отправил сертификат для идентификации себя.Клиент должен использовать этот сертификат и его доверенную CA-цепочку для проверки личности сервера.

Чтобы продолжить общение, нам нужен файл PEM, который содержит упомянутого эмитента и его эмитентов вплоть до корня.Используйте процедуру, описанную выше, чтобы получить полную цепочку сертификатов и добавить все сертификаты в правильном порядке в файл trusted.pem.Если вы скопируете и вставите полученный сертификат в PEM-файл (текст), вы сможете проверить этот полученный сертификат так же, как я проверил MyCertificate.Pem, как описано выше.

После того, как CA сертификат дляполученные сертификаты были установлены, моя команда openssl s_client ответила:

...
SSL handshake has read 8945 by
Verification: OK
---
New, TLSv1.2, Cipher is ...
Server public key is 2048 bit

Start Time: 1551779993
Timeout   : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no

Итак, цепочка сертификатов для идентификации сервера принята.

Идентифицировать меня на сервере

Следующим шагом будет проверка, могу ли я идентифицировать себя на сервере, используя MyCertficate.pem.

Это первый раз, когда мне нужен мой файл закрытого ключа.Для этого мы будем использовать curl:

Команда:

curl.exe -v --cacert trusted.pem --cert MyCertificate.pem --key MyPrivate.key https://...
  • -v: verbose
  • - cacert: текстовый файл с объединениемцепочка доверенных ЦС до корня, как проверено с помощью openssl verify
  • - Cert: сертификат, который я буду использовать для идентификации себя
  • - Ключ: закрытый ключ для этого сертификата

Ответ:

...
* successfully set certificate verify locations:
*   CAfile: trustall.pem
...
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Request CERT (13):
* TLSv1.2 (IN), TLS handshake, Server finished (14):

* TLSv1.2 (OUT), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS handshake, CERT verify (15):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):

* TLSv1.2 (IN), TLS handshake, Finished (20):
...
* Server certificate:
*  subject: C=NL; ...
*  start date: Apr 19 12:10:31 2016 GMT
*  expire date: Apr 19 12:10:31 2019 GMT
...
*  issuer: C=NL; O= <description of certificate issuer; should be in trusted.pem>
*  SSL certificate verify ok.
> GET /exchange/ciot HTTP/1.1
> Host: ....
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 400 Bad Request

Что мы видим:

  • TrustAll.Pem содержит доверенные сертификаты
  • (Out) Client Hello -(In) Server Hello: очевидно, мы находимся на условиях разговора
  • Сервер отправляет сертификат и запрашивает один
  • Клиент отправляет свой сертификат для идентификации себя
  • Отображение полученного сертификата,тот, с которым сервер идентифицирует себя.Ожидается, что эмитент будет в доверенном. Пем
  • Полученный сертификат проверяется и принимается.Передача данных может начаться
  • Поскольку я не отправлял никаких данных, ответом является 400 Bad Request

Так что этого достаточно, чтобы знать, что и клиент, и сервер используют доверенные сертификаты ичто общение возможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...