как скачать ssl сертификат с сайта?

Ответы:

246

Чтобы скачать сертификат, вам нужно использовать клиент, встроенный в openssl, например:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Это сохранит сертификат в /tmp/$SERVERNAME.cert.

Вы можете использовать, -showcertsесли вы хотите скачать все сертификаты в цепочке. Но если вы просто хотите скачать сертификат сервера, указывать не нужно-showcerts

echo -n дает ответ серверу, чтобы освободилось соединение

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'удаляет информацию о цепочке сертификатов и детали подключения. Это предпочтительный формат для импорта сертификата в другие хранилища ключей.

Шон Рейфшнайдер
источник
9
Спасибо, что вы дали не только хороший ответ, но и точное объяснение.
marco.m
-showcertsПоказывает ли сервер / лист сертификат тоже? Я думал, что он отображал только промежуточные звенья, когда этот переключатель был включен.
Майк Б
Как сказано в ответе, s_clientвсегда показывает сертификат сервера (если он есть, то есть сервер отвечает на привет и не выбирает анонимный набор). -showcertsпоказывает все полученные сертификаты, сначала серверный сертификат, затем промежуточные и / или root.
dave_thompson_085
4
это не работает в присутствии прокси, хотя.
Фредерик Норд
2
Это также не работает с серверами, которые используют SNI (несколько сертификатов / доменов на одном IP-адресе). Чтобы избежать проблем, укажите параметр servername в openssl: openssl s_client -connect HOST: PORTNUMBER -servername CN
verhage
60

Я нашел ответ. Openssl предоставляет это.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}

RainDoctor
источник
2
также, openssl x509 -text <<EOF cert-text EOFчтобы видеть детали свидетельства
mpapis
2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemПредоставлено serverfault.com/questions/139728/…
pulkitsinghal
это выполняет то же самое и пропускает sedвзломать.
тел.
Это просто проверяет один сертификат, что если служба входит в группу серверов с балансировкой нагрузки, каждый из которых имеет свой сертификат, возможно, подписанный другим корневым центром сертификации? Или, другими словами, атака MITM может позволить этому запросу пройти через реальный сайт, а затем направить другие запросы на его серверы. Есть ли способы проверить это? И получить список всех сертификатов, которые действительно есть у домена?
Дженс Тиммерман,
@JensTimmerman "Или, другими словами, митм-атака может позволить этому запросу пройти через реальный сайт, а затем перенаправить другие запросы на его серверы". Это невозможно, если у человека-посредника нет действительного сертификата для целевого сервера (или клиент глупо не проверяет сертификат сервера). Очевидно, что если сервер иногда предлагает другой сертификат, вы можете только надеяться, что в конечном итоге получите их все, повторив попытки подключения.
Дэвид Тонхофер,
22

GnuTLS клиентский инструмент, gnutls-cliтакже может сделать это легко:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Программа предназначена для предоставления интерактивного клиента сайту, поэтому необходимо /dev/nullзавершить интерактивный сеанс пустым вводом (в данном примере с ).

большой нос
источник
1
как это заставит gnutls соединиться через (настроенный в масштабе всей системы) https прокси и распечатать сертификат, который он обменивает?
Фредерик Норд
9

основанный на ответе @bignose, вот отдельная версия, которая хорошо вписывается, например, в рецепт шеф-повара:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates
oDDsKooL
источник
6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

этот режим openssl ожидает ввода stdin, поэтому мы предоставляем его через него true |, он подключается к серверу, указанному в параметре -connect. 2>/dev/nullПриглушая ошибки (необязательно), мы можем передать весь вывод в синтаксический анализатор x509, указав /dev/stdinв качестве входного файла использовать оболочку канала. И что будет выводить только -----BEGIN CERTIFICATE-----в -----END CERTIFICATE-----части s_clientвывода. Вы можете перенаправить это в файл, добавив > google.com.pemв конец команды.


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

ThorSummoner
источник
2
(1) это на самом деле не улучшает ответы от 6 лет назад (2) x509читает stdin по умолчанию, поэтому -in /dev/stdinизбыточно (3) s_clientпроверяет, правильно ли сертификат сервера соединен с локальным доверительным якорем (root) и не устарел, но вы скрыл информацию, которая показала бы это (4) он НЕ проверяет на отзыв (5) он проверяет имя в сертификате сервера только в 1.0.2, а затем не по умолчанию (но вы можете легко проверить это самостоятельно, посмотрев сертификат) потом)
dave_thompson_085
@ dave_thompson_085, вопрос в том, как загрузить сертификат, но не показывать информацию о цепочке. Мне нравится openssl x509 намного лучше, чем sed в другом ответе.
Der_Meister
0

Альтернативный синтаксис с использованием Ex и подстановки процесса:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
kenorb
источник