Использование 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-text печать сертификата в удобочитаемом формате.
для получения сертификата удаленного сервера вы можете использовать и вы можете найти его между
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 вы можете дважды щелкнуть файл или перетащить его в свой доступ к связке ключей, чтобы он появился в логине/сертификатах. Затем дважды щелкните на импортированном сертификате и сделайте его всегда доверяйте SSL.
на CentOS 5 Вы можете добавить их в
/etc/pki/tls/certs/ca-bundle.crtfile (и запустить: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.
вы можете получить и сохранить корневой сертификат сервера с помощью следующего скрипта bash:
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...
один лайнер для извлечения сертификата с удаленного сервера в формате PEM, на этот раз с помощью
sed:openssl s_client -connect www.google.com:443 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
Comments