특정 서버에 대한 SSL 인증서의 주체 해시 발급자를 확인할 수 있는 방법이 있나요?
나는 curl
특정 해시를 기반으로 또는 (또는 다른 배포 특정 위치)에서 wget
일치하는 루트 인증서를 검색한다는 것을 알고 있습니다./var/lib/ca-certificates/openssl
/etc/ssl/certs
제가 묻는 이유는 인증서가 만료되는 경우가 있어서 새 인증서를 다운로드하려면 어떤 인증서 파일이 만료되었는지 알아야 하기 때문입니다. 하지만 strace
업데이트해야 할 인증서를 확인하는 방법( 을 사용하는 것 외에)을 찾을 수 없는 것 같습니다 .
curl
명령( 또는 get
) 을 실행하면 strace
어떤 루트 인증서가 열리는지 확인할 수 있습니다.
$ strace -e trace=open /usr/bin/curl https://git.kernel.org
...
open("/var/lib/ca-certificates/openssl/4042bcee.0", O_RDONLY) = 7
...
루트 인증서에 대한 정보를 얻을 수 있습니다.
$ readlink -f /var/lib/ca-certificates/openssl/4042bcee.0
/var/lib/ca-certificates/openssl/ISRG_Root_X1.pem
$ openssl x509 -noout -issuer -subject -hash -in /var/lib/ca-certificates/openssl/ISRG_Root_X1.pem
issuer= /C=US/O=Internet Security Research Group/CN=ISRG Root X1
subject= /C=US/O=Internet Security Research Group/CN=ISRG Root X1
4042bcee
서버의 인증서가 다음과 같이 제공되는 것을 확인했습니다."암호화하자", 그러나 관련 루트 인증서를 찾는 데 도움이 되는 정보가 포함되어 있지 않은 것 같습니다.
curl -sv https://git.kernel.org 2>&1 > /dev/null |sed -n '/SSL/,/SSL/p'
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Server certificate:
* subject: CN=ams.source.kernel.org
* start date: Jan 15 18:02:38 2023 GMT
* expire date: Apr 15 18:02:37 2023 GMT
* subjectAltName: host "git.kernel.org" matched cert's "git.kernel.org"
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
또한 다음 명령을 통해 주제 해시를 확인하려고 시도했지만(내 환경은 프록시 뒤에 있음) 내가 보고 있는 것과 일치하지 않습니다.
$ openssl s_client -proxy myproxy:myport -connect git.kernel.org:443 -servername git.kernel.org < /dev/null 2>/dev/null | openssl x509 -noout -issuer -subject -hash
issuer=C = US, O = Let's Encrypt, CN = R3
subject=CN = ams.source.kernel.org
1c27cb82
서버 인증서의 해시(1c27cb82) 내 인증서의 해시(4042bcee).
그러면 찾아야 하는 루트 인증서의 해시를 어떻게 curl
알 수 있습니까? wget
명령줄을 사용하여 동일한 작업을 어떻게 수행할 수 있습니까?
답변1
나는 답을 찾았습니다. 사이트의 인증서만 확인했지만 전체 인증서 체인, 가장 중요한 루트 CA 인증서는 확인하지 않았습니다.
이 문제를 해결하려면 먼저 명령 -showcerts
의 플래그를 사용하여 openssl s_client
전체 인증서 체인을 표시해야 했습니다.
그런 다음 openssl
제공된 모든 인증서를 확인하기 위해 루프를 실행합니다. " -issuer_hash
제외" -hash
(" "의 동의어 ) 도 확인했습니다 -subject_hash
.
openssl s_client -showcerts -proxy myproxy:myport -connect git.kernel.org:443 -servername git.kernel.org < /dev/null 2>/dev/null | (while openssl x509 -noout -issuer -subject -subject_hash -issuer_hash 2>/dev/null; do true; done)
issuer=C = US, O = Let's Encrypt, CN = R3
subject=CN = ams.source.kernel.org
1c27cb82
8d33f237
issuer=C = US, O = Internet Security Research Group, CN = ISRG Root X1
subject=C = US, O = Let's Encrypt, CN = R3
8d33f237
4042bcee
issuer=O = Digital Signature Trust Co., CN = DST Root CA X3
subject=C = US, O = Internet Security Research Group, CN = ISRG Root X1
4042bcee
2e5ac55d
그런 다음 예상되는 해시( )를 세 번째 인증서의 주체 해시로 볼 수 있고 4042bcee
, 체인에 있는 두 번째 인증서의 발급자 해시를 볼 수 있습니다.