웹 사이트에서 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너무 서버 / 잎 인증서를 보여? 스위치가 포함되었을 때 중간체 만 표시한다고 생각했습니다.
Mike B

대답에서 알 수 있듯이 s_client항상 서버 인증서를 표시합니다 (있는 경우 서버가 hello에 응답하고 익명 제품군을 선택하지 않음). -showcerts표시 모든 인증서 표시는 먼저 중간체 및 / 또는 루트 인증서, 서버를 받았다.
dave_thompson_085

4
그러나 프록시가있는 경우에는 작동하지 않습니다.
Frederick Nord

2
또한 SNI (단일 IP 주소의 여러 인증서 / 도메인)를 사용하는 서버에서는 작동하지 않습니다. 문제를 피하려면 openssl의 servername 매개 변수를 지정하십시오. openssl s_client -connect HOST : PORTNUMBER -servername CN
verhage

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핵을 건너 뜁니다 .
phs

이것은 하나의 인증서 만 검사합니다. 서비스가로드 밸런싱 된 서버 그룹의 일부인 경우 각각 다른 루트 CA에 의해 서명 된 서로 다른 인증서를 가진 서버는 무엇입니까? 즉, mitm 공격으로 인해이 요청이 실제 사이트로 이동 한 다음 다른 요청을 그의 서버로 보낼 수 있습니다. 이것을 확인하는 방법이 있습니까? 그리고 도메인에 실제로있는 모든 인증서 목록을 얻으려면?
Jens Timmerman

@JensTimmerman "즉, mitm 공격은이 요청을 실제 사이트로 보낸 다음 다른 요청을 그의 서버로 보낼 수 있습니다." Man-in-the-middle에 대상 서버에 대한 유효한 인증서가 없거나 클라이언트가 서버 인증서를 확인하지 않는 한 불가능합니다. 서버가 때때로 다른 인증서를 제공하는 경우 연결 시도를 반복하여 인증서를 모두 얻을 수 있기를 바랍니다.
David Tonhofer

22

GNUTLS의 클라이언트 도구는 gnutls-cli,이 쉽게 할 수 있습니다 :

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

이 프로그램은 사이트에 대화식 클라이언트를 제공하도록 설계되었으므로 /dev/null대화식 세션을 종료하려면 빈 입력 (이 예에서는 from )을 제공해야합니다 .


1
어떻게 gnutls가 (시스템 전체 구성) https 프록시를 통해 연결하고 그것이 확장 한 인증서를 인쇄합니까?
Frederick Nord

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오류를 막습니다 (선택 사항) /dev/stdin. 셸 파이프를 입력 파일로 사용하도록 지정하여 전체 출력을 x509 파서에 전달할 수 있습니다 . 그리고 그것은 출력의 -----BEGIN CERTIFICATE-----to -----END CERTIFICATE-----부분 만을 출력 할 것 s_client입니다. > google.com.pem명령 끝에 추가 하여 파일로 리디렉션 할 수 있습니다 .


내가 알 수 있듯이 인증서 체인을 확인하지는 않으며 최종 서버가 제공하는 SSL ID 만 알려줄 수 있습니다.


2
(1) 6 년 전의 답변을 실제로 개선하지는 않습니다. (2) x509기본적으로 stdin을 읽으므로 -in /dev/stdin중복됩니다 (3) s_client서버 인증서가 로컬 신뢰 앵커 (루트)에 올바르게 연결되어 있고 만료되지 않았 는지 확인합니다. (4) 해지 확인하지 않음 (5) 1.0.2에서만 서버 인증서 의 이름 을 확인 한 다음 기본적으로는 확인하지 않습니다 (그러나 인증서를 보면 쉽게 확인할 수 있습니다) 이후)
dave_thompson_085

@ dave_thompson_085, 질문은 인증서를 다운로드하는 방법이지만 체인 정보는 표시하지 않습니다. 다른 답변에서 sed보다 openssl x509가 훨씬 좋습니다.
Der_Meister

0

Ex 및 프로세스 대체를 사용하는 대체 구문 :

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.