Вопрос: как загрузить сертификат ssl с веб-сайта?


Я хочу загрузить сертификат ssl, скажем, https://www.google.com, используя wget или любые другие команды. Любая командная строка unix? wget или openssl?


152
2018-05-07 21:01


Источник




Ответы:


Чтобы загрузить сертификат, вам необходимо использовать клиент, встроенный в 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' удаляет информацию о цепочке сертификатов и деталях подключения. Это предпочтительный формат для импорта сертификата в другие хранилища ключей.


207
2017-10-19 22:59



что вы не только дали хороший ответ, но и точное объяснение. - marco.m
Есть ли -showcerts показать сертификат сервера / листа? Я думал, что он только отображал промежуточные продукты, когда этот переключатель был включен. - Mike B
Как сказал ответ, s_client всегда показывает сертификат сервера (если есть один, то есть сервер отвечает на приветствие и не выбирает анонимный пакет). -showcerts шоу все полученные сертификаты, серверный сертификат сначала, а затем промежуточные и / или корневые. - dave_thompson_085
однако это не работает в присутствии прокси. - Frederick Nord
Это также не работает с серверами, использующими SNI (несколько сертификатов / доменов на одном IP-адресе). Чтобы избежать проблем, укажите параметр servername openssl: openssl s_client -connect HOST: PORTNUMBER -servername CN - verhage


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

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


54
2018-05-07 21:05



также openssl x509 -text <<EOF cert-text EOF просмотреть сведения о сертификате - mpapis
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 хак. - phs
Это просто проверяет один сертификат, что, если служба является частью балансированной нагрузки группы серверов, каждая из которых имеет другой сертификат, возможно, подписанный другим корневым центром сертификации? Или, другими словами, атака mitm может позволить этому запросу перейти на реальный сайт, а затем направлять другие запросы на его серверы. Есть ли способы проверить это? А чтобы получить список всех сертификатов, которые действительно имеют домен? - Jens Timmerman
@JensTimmerman «Или, другими словами, атака mitm может позволить этому запросу пройти через реальный сайт, а затем направлять другие запросы на его серверы». Это невозможно, если у человека-в-середине нет действительного сертификата для целевого сервера (или клиент глупо не проверяет сертификат сервера). Очевидно, что если сервер иногда предлагает другой сертификат, вы можете только надеяться, что, возможно, в конечном итоге все их получите, повторив попытки подключения. - David Tonhofer


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

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

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


20
2017-10-07 06:19



как бы он запустил gnutls через (настроенный системой) https-прокси и распечатал сертификат, который он обменивает? - Frederick Nord


основанный на ответе @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

8
2018-05-27 09:31





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 предоставляет конечный сервер.


5
2018-01-12 10:38



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


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

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

0