Использование openssl для получения сертификата с сервера

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

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

openssl s_client -connect host.host:9999

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

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

Я также пробовал с этой опцией

-showcerts 

и этот (работает на debian mind ты)

-CApath /etc/ssl/certs/ 

но получите ту же ошибку.

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

пожалуйста, дайте мне знать, где я иду не так.

10 ответов


С SNI

если удаленный сервер использует SNI (то есть совместное использование нескольких хостов SSL на одном IP-адресе), вам нужно будет отправить правильное имя хоста, чтобы получить правильный сертификат.

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

без SNI

если удаленный сервер не использует SNI, то вы можете пропустить


хотя я согласен с ответом Ари (и поддержал его:), мне нужно было сделать дополнительный шаг, чтобы заставить его работать с Java в Windows (где его нужно было развернуть):

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

до openssl x509 -outform DER преобразование, я получал ошибку от keytool в Windows, жалуясь на формат сертификата. Импорт .der file работал нормально.


оказывается, здесь больше сложности: мне нужно было предоставить больше деталей, чтобы получить эту прокатку. Я думаю, что это как-то связано с тем, что его соединение, которое нуждается в аутентификации клиента, и hankshake нуждалось в дополнительной информации, чтобы продолжить этап, на котором сертификаты были сброшены.

вот моя рабочая команда:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

надеюсь, это толчок в правильном направлении для тех, кто может сделать с некоторой дополнительной информацией.


самая простая командная строка для этого, которая включает вывод PEM для добавления его в хранилище ключей, а также читаемый человеком вывод, а также поддерживает SNI, что важно, если вы работаете с HTTP-сервером:

openssl s_client -servername example.com -connect example.com:443 \
    </dev/null 2>/dev/null | openssl x509 -text

на -имя сервера опция должна включить поддержку SNI и в openssl x509-на-текста печать сертификата в удобочитаемом формате.


чтобы получить сертификат удаленного сервера, вы можете использовать и вы можете найти его между BEGIN CERTIFICATE и END CERTIFICATE который вам нужно скопировать и вставить в файл сертификата (CRT).

вот команда, демонстрирующая это:

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

чтобы вернуть все сертификаты из цепочки, просто добавьте g (глобальный), как:

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

затем вы можете просто импортировать файл сертификата (file.crt) в ваш брелок и сделать его надежным, поэтому Java не стоит жаловаться.

в OS X вы можете дважды щелкнуть по файлу или перетащить свой доступ к связке ключей, чтобы он появился в login/Certificates. Затем дважды щелкните по импортированному сертификату и сделайте его всегда доверяйте SSL.

на CentOS 5 Вы можете добавить их в /etc/pki/tls/certs/ca-bundle.crt file (и запустите:sudo update-ca-trust force-enable), или в CentOS 6 скопируйте их в /etc/pki/ca-trust/source/anchors/ и работать sudo update-ca-trust extract.

в Ubuntu скопируйте их в /usr/local/share/ca-certificates и работать sudo update-ca-certificates.


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

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS  > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

просто переписать необходимые переменные.


HOST=gmail-pop.l.google.com
PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

печатать только цепочку сертификатов, а не сертификат сервера:

# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'

для обновления доверия CA на CentOS / RHEL 6/7:

# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract

на CentOS / RHEL 5:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt

в интересах других, таких как я, которые пытались следовать хорошим советам здесь при доступе AWS CloudFront но не удалось, трюк состоит в том, чтобы добавить -servername domain.name...

источник:https://serverfault.com/a/780450/8972


однострочный для извлечения сертификата с удаленного сервера в формате PEM, на этот раз с помощью sed:

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'