як завантажити сертифікат 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відображається також сервер / лист cert? Я думав, що він відображає проміжні продукти лише тоді, коли цей комутатор був включений.
Майк Б

Як сказано у відповіді, s_clientзавжди відображається серверний серт (якщо такий є, тобто сервер відповідає на привіт і не вибирає анонімний набір). -showcertsпоказує всі отримані certs, серт cert спочатку, потім проміжні та / або root.
dave_thompson_085

4
це не працює в присутності проксі.
Фредерік Норд

2
Це також не працює з серверами, які використовують SNI (кілька сертифікатів / доменів на одній IP-адресі). Щоб уникнути проблем, вкажіть параметр імені сервера openssl: openssl s_client -connect HOST: PORTNUMBER
ім'я

60

Я знайшов відповідь. Openssl забезпечує це.

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


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злом.
ph

Це просто перевіряє один сертифікат, що робити, якщо служба є частиною навантаженої групи серверів, з яких кожен має інший сертифікат, можливо, підписаний іншим кореневим CA? Інакше кажучи, атака mitm може відпустити цей запит на реальний сайт, а потім направити інші запити на його сервери. Чи є способи це перевірити? І щоб отримати список усіх сертифікатів, які насправді має домен?
Йенс Тіммерман

@JensTimmerman "Або іншими словами, атака mitm може дозволити цьому запиту перейти на реальний сайт, а потім направити інші запити на його сервери." Це неможливо, якщо чоловік-посередник має дійсний сертифікат для цільового сервера (або клієнт нерозумно не перевіряє сертифікат сервера). Очевидно, що якщо сервер іноді пропонує інший сертифікат, ви можете сподіватися, що, можливо, в кінцевому підсумку їх можна отримати, повторивши спроби з'єднання.
Девід Тонхофер

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

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 надає кінцевий сервер.


2
(1) це насправді не покращує відповіді від 6 років тому (2) x509читає stdin за замовчуванням, тому -in /dev/stdinнадлишком (3) s_clientперевіряє, як серт-сервер правильно прив’язується до локального якоря довіри (root) і не закінчився, але ви придушив інформацію, яка б це показала (4) вона НЕ перевіряє на скасування (5) вона перевіряє ім'я в серті cert лише в 1.0.2, а потім не за замовчуванням (але ви можете легко перевірити це самостійно, подивившись на cert згодом)
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.