openssl을 사용하여 서버에서 인증서 가져 오기
원격 서버의 인증서를 얻으려고하는데 키 저장소에 추가하고 Java 응용 프로그램 내에서 사용할 수 있습니다.
선임 개발자 (휴일 :()는 내가 이것을 실행할 수 있다고 알려줍니다.
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
그리고 이것은 (데비안 마음에서 실행)
-CApath /etc/ssl/certs/
그러나 같은 오류가 발생합니다.
이 소스 는 해당 CApath 플래그를 사용할 수 있지만 도움이되지 않는 것 같습니다. 나는 쓸모없는 여러 경로를 시도했다.
내가 잘못 가고있는 곳을 알려주십시오.
SNI로
원격 서버가 SNI를 사용하는 경우 (즉, 단일 IP 주소에서 여러 SSL 호스트를 공유하는 경우) 올바른 인증서를 얻으려면 올바른 호스트 이름을 보내야합니다.
openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null
SNI없이
원격 서버가 SNI를 사용하지 않는 경우 -servername
매개 변수 를 건너 뛸 수 있습니다 .
openssl s_client -showcerts -connect www.example.com:443 </dev/null
사이트 인증서의 전체 세부 정보를 보려면이 명령 체인도 사용할 수 있습니다.
$ echo | \
openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
openssl x509 -text
Ari의 대답에 동의하고 찬성했습니다. : Windows에서 Java와 함께 작동하려면 추가 단계를 수행해야했습니다 (배포해야 함).
openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der
openssl x509 -outform DER
변환을 추가하기 전에 Windows의 keytool에서 인증서 형식에 대해 불평하는 오류가 발생했습니다. .der 파일 가져 오기가 정상적으로 작동했습니다.
여기에는 더 복잡한 것이 있습니다.이 롤링을 얻으려면 더 많은 세부 정보를 제공해야했습니다. 클라이언트 인증이 필요한 연결과 행크 쉐이크에는 인증서가 덤프 된 단계로 계속 진행하기 위해 더 많은 정보가 필요하다는 사실과 관련이 있다고 생각합니다.
작업 명령은 다음과 같습니다.
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
-servername 옵션은 SNI를 지원하고 활성화하는 것입니다 있는 OpenSSL에서는 X509 -text 사람이 읽을 수있는 형식으로 인쇄 인증서를.
이번에는 다음을 사용하여 PEM 형식의 원격 서버에서 인증서를 추출하는 단일 라이너 sed
.
openssl s_client -connect www.google.com:443 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
원격 서버의 인증서를 얻으려면 당신이 사용할 수있는 openssl
도구를 당신이 사이를 찾을 수 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.crt
파일에 파일을 추가 (및 실행 sudo update-ca-trust force-enable
)하거나 CentOS 6에서 복사하여 /etc/pki/ca-trust/source/anchors/
실행할 수 sudo update-ca-trust extract
있습니다.
우분투에서 복사하여 /usr/local/share/ca-certificates
실행하십시오 sudo update-ca-certificates
.
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
다음 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 $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'
필요한 변수를 덮어 쓰십시오.
서버의 인증서가 아닌 인증서 체인 만 인쇄하려면 :
# 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}'
CentOS / RHEL 6/7에서 CA 신뢰를 업데이트하는 방법 :
# 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
서버가 전자 메일 서버 (MS Exchange 또는 Zimbra) 인 경우 starttls
및 smtp
플래그 를 추가해야합니다 .
openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem
어디,
HOST_EMAIL 은 서버 도메인입니다 (예 : mail-server.com).
SECURE_PORT 는 통신 포트입니다 (예 : 587 또는 465).
CERTIFICATE_NAME 출력 파일 이름 (BASE 64 / PEM 형식)
참고 URL : https://stackoverflow.com/questions/7885785/using-openssl-to-get-the-certificate-from-a-server
'Programing' 카테고리의 다른 글
$ 객체를보고 (0) | 2020.03.10 |
---|---|
Subversion에서 하나의 파일 체크 아웃 (0) | 2020.03.10 |
Emacs가 백업 파일을 만드는 방법을 어떻게 제어합니까? (0) | 2020.03.10 |
이진 트리와 이진 검색 트리의 차이점 (0) | 2020.03.10 |
Java에서 인터페이스 이름 지정 (0) | 2020.03.10 |