Как сохранить SSL-сертификат удаленного сервера локально в виде файла

319

Мне нужно скачать SSL-сертификат удаленного сервера (не HTTPS, но SSL-рукопожатие должно быть таким же, как в Google Chrome / IE / wget и curl все дают ошибки проверки сертификата) и добавить сертификат в качестве доверенного в моих ноутбуках Windows. хранилище сертификатов, поскольку я не могу заставить своих ИТ-специалистов выдать мне сертификат CA.

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

Как мне это сделать, у меня Windows 7 и куча Linux под рукой, поэтому подойдет любой инструмент / язык сценариев.

Kimvais
источник
Чтобы получить сертификат почтового сервера , см. Security.stackexchange.com/questions/70528/…
тот бразильский парень
Скорее всего, ваш браузер имеет встроенную функцию для этого - возможно, в разделе «Инструменты разработчика».
Нобар

Ответы:

316

Если у вас есть доступ к OpenSSL, попробуйте

openssl s_client -connect {HOSTNAME}:{PORT} -showcerts

заменив {HOSTNAME} и {PORT} на ваши значения.

gbroiles
источник
2
Я предпочитаю эту опцию, так как мне не нужно открывать графический интерфейс, и я могу сделать это через SSH с наших серверов.
браво
2
Плюс это работает для протоколов, отличных от HTTP.
Мэтт
15
Решение elec3647 полностью автоматизирует извлечение PEM в конвейере оболочки.
тел.
4
443 порт по умолчанию для HTTPS.
Флим
4
Мне нужна была -servernameвозможность получить сертификат виртуального хоста. gist.github.com/Artistan/5219484efb2fe51cd064175b3d0d5971
Artistan
241

Быстрый способ получения и загрузки сертификата заключается в запуске следующей команды, которая направляет вывод команды -showcerts в команду x509 ssl, которая просто удаляет все постороннее. Например:

openssl s_client -showcerts -connect server.edu:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem

Чтобы использовать сертификат, с помощью wget,

wget https:/server.edu:443/somepage --ca-certificate=mycertfile.pem
elec3647
источник
5
Я попробовал это (на другом веб-сайте) - но ожидалось, что вся цепочка сертификатов: кажется, это вернуло только первое в цепочке - этого ожидать?
monojohnny
8
Это не работает для меня: невозможно загрузить сертификат 27262: ошибка: 0906D06C: процедуры PEM: PEM_read_bio: нет строки запуска: /SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/pem/pem_lib.c: 648: Ожидается: TRUSTED СЕРТИФИКАТ
Януш
4
Я согласен с monojohnny, это не дает вам полную цепочку.
Майкл Манси
4
Поздно, но @monojohnny: openssl s_client -showcertsотображает все сертификаты в полученной цепочке (если соединение установлено), но при прохождении по конвейеру openssl x509берется только первый, а остальные отбрасываются. Чтобы получить все из них, вместо этого используйте ...| sed -n '/^-----BEGIN CERT/,/^-----END CERT/p'или. ...| awk '/^-----BEGIN CERT/,/^-----END CERT/'Вы также можете использовать несколько более сложный способ, awkчтобы поместить каждый сертификат в отдельный файл, что облегчает их использование с opensslнекоторыми другими инструментами.
dave_thompson_085
3
используя wget, кажется, только сохранить index.html=>HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html.1’
OZZIE
126

Если честно, я никогда не пробовал это раньше (никогда не нужно), однако, я только что попробовал в Firefox, и, похоже, он работает для сохранения:

  1. Нажмите на иконку SSL-сертификата вверху / Замок внизу.
  2. Нажмите View Certificate
  3. Нажмите на Detailsвкладку
  4. Выберите, какой сертификат вы хотите из иерархии [не обведено в картинке]
  5. Нажмите Export

альтернативный текст

Уильям Хилсум
источник
Полезно знать - но для моего любопытства, можете ли вы объяснить немного больше, чего вы пытаетесь достичь? Мне никогда не нужно было экспортировать клиентский сертификат SSL, и мне очень любопытно, почему у вас действительно есть необходимость это делать ...
Уильям Хилсум
1
Это сертификат сервера, а не сертификат клиента. Основной причиной экспорта закрытого ключа и сертификата клиента является сохранение резервной копии или проверка подлинности с использованием другого браузера или компьютера.
gbroiles
@gbroiles - прочитайте вопрос, он использовал неверную терминологию, но это решило его проблему.
Уильям Хилсум
1
правильно, и я ответил на ваш вопрос - почему кто-то хочет сохранить сертификат клиента? «Сертификат клиента SSL» был вашим термином, а не его.
gbroiles
1
Не похоже, что есть способ сделать это в Chrome, верно ?!
фатухоку
50

Экспорт сертификата с помощью браузера Chrome

  1. Подключитесь к сайту с помощью SSL ( https: // что угодно )

2. Нажмите на символ замка и затем нажмите на Детали

  1. Начиная с Chrome версии 56, вы делаете следующее: перейдите в меню «Три точки» -> «Дополнительные инструменты» -> «Инструменты разработчика», затем нажмите на вкладку «Безопасность». Это даст вам обзор безопасности с кнопкой Просмотр сертификата .

  2. Нажмите на кнопку Просмотр сертификата .

    Модальное окно откроется. У него есть две панели. Верхний показывает иерархию доверия сертификата сайта (последний в списке), промежуточный сертификат (ы) и корневой сертификат (самый верхний).

    Вторая, более крупная панель, показывает детали одного из сертификатов.

    Может быть ноль или более промежуточных сертификатов.

    Обратите внимание, что корневой сертификат имеет значок с золотой каймой. У остальных синяя рамка.

    Смотрите скриншот ниже.

  3. Чтобы экспортировать сертификат:

    1. Сначала нажмите на значок сертификата в иерархии доверия.
    2. Сертификат будет показан в основной части мода.
    3. Нажмите на большую иконку сертификата в основной части мода. Перетащите значок на рабочий стол. Chrome скопирует сертификат на ваш рабочий стол.

введите описание изображения здесь

Ларри К
источник
1
Мне пришлось перетащить значок в текстовый редактор, рабочий стол у меня не работал.
Кори Кляйн
2
Для Chrome в Windows после нажатия «Просмотреть сертификат» модальный режим отличается от Mac. Перейдите на вкладку «Подробности», а затем «Копировать в файл». Затем выберите формат и имя файла, что довольно просто.
PolyTekPatrick
1
Когда я использую Chrome v63 в Mac OS, текстовый файл, который я получаю при перетаскивании сертификата, читается человеком, но не в любом структурированном формате, который я могу выяснить, как преобразовать в машиночитаемую форму, такую ​​как X.509 .crt.
Джим DeLaHunt
нет разницы, если открыть из адресной строки или из этой вкладки разработчика, и все еще не может загрузить crt ...
user25
1
Больше не работает над Chrome 72.0.3626.121
A. D'Alfonso
20

Это ответ gbroiles , но я хотел бы отметить, что у проекта cURL есть страница с несколькими дополнительными сведениями об использовании opensslдля сохранения SSL-сертификата удаленного сервера:

  • openssl s_client -connect {HOSTNAME}: {PORT} | Тройник
  • Введите QUITи нажмите клавишу ввода / возврата.
  • Сертификат будет указан между маркерами «BEGIN CERTIFICATE» и «END CERTIFICATE».
  • Если вы хотите увидеть данные в сертификате, вы можете использовать:

    openssl x509 -информ PEM -в certfile -text -out certdata

    где certfileсертификат извлечен из logfile. Посмотри certdata.

Даниэль Треббиен
источник
Это сработало для меня. Чтобы быть немного более явным, я отредактировал файл журнала и обрезал все, что было за пределами BEGIN CERTIFICATE и END CERTIFICATE, и сохранил результат как certfile.pem (не уверен, что расширение необходимо).
Майкл Уэлч
16

автоматизированный

-servername было необходимо, чтобы я получил правильный сертификат от виртуального хоста на нашем сервере.

openssl s_client -showcerts -connect host.name.com:443 -servername host.name.com </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > host.name.com.pem

Вы также можете конвертировать в сертификат для рабочего стола

openssl x509 -inform PEM -in host.name.com.pem -outform DER -out host.name.com.cer

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

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain host.name.com.cer

Artistan
источник
Обратите внимание, что в некоторых приложениях возникают проблемы с цепочками ключей System и SystemRoot (Golang, я смотрю на ВАС), поэтому после установки и настройки доверия для этих уровней вы также можете скопировать его для своего собственного пользователя login.keychainчерез Keychain Accessприложение. можно просто перейти к сертификату в System / SystemRoot и нажать и перетащить его в свою loginцепочку для ключей.
dragon788
1
@ dragon788 - я собирался автоматизировать это с помощью командной строки, и это работает для меня. Пожалуйста, поделитесь здесь, если вы найдете решение для login.keychain через CLI! Спасибо!
Artistan
Судя по тому, что я прочитал в Интернете, я полагаю, что простое исключение -dиз команды применимо только к цепочке ключей пользователя, а не к цепочке ключей системы.
dragon788
Если вы также добавляете промежуточный сертификат (ы), вы захотите использовать его trustAsRootвместо trustRootтого, чтобы правильно добавить его.
dragon788
2

Это даст результаты, содержащие только сертификаты

echo QUIT | \
openssl s_client -showcerts -connect hostname:port | \
awk '/-----BEGIN CERTIFICATE-----/ {p=1}; p; /-----END CERTIFICATE-----/ {p=0}' "
Архимед Траяно
источник
0

Нашел гораздо более простой способ, если на Windows. Попробовал Microsoft Edge (pre-chromium) и щелкнул по замку в адресной строке -> Просмотр сертификата Диалог всплывает с кнопкой "Экспорт в файл", которая сохраняет его в виде файла .crt.

Не много я бы использовал Edge для, но это был кусок пирога.

Дейл Уилбэнкс
источник