wget을 사용하여 사용자 정의 서버 SSL 인증서를 검증하는 데 문제가 있습니다.
wget -O- --ca-certificate=myservercert.pem https://www.google.com
이는 실패해야 하지만 그렇지 않습니다. 이유는 wget
from 을 포함하여 효과가 예상한 것과 동일하기 때문입니다 /etc/ssl
.curl
서로를 인증하는 두 개의 SSL 포인트를 어떻게 가질 수 있습니까?아니요신뢰의 위반?
답변1
대답은 wget이 연결된 SSL 라이브러리에 따라 다릅니다. 버전에 따라 다를 수도 있지만 wget 1.13과 1.15 사이에서는 동작이 변경되지 않았습니다.
wget이 GnuTLS(예: Debian)와 연결된 경우
Wget은 파일이나 디렉터리의 파일에서 인증서를 읽을 수 있습니다. 모든 기본 신뢰할 수 있는 CA(에서 /etc/ssl/certs
) 를 끄려면 --ca-certificate
및 를 모두 전달합니다 --ca-directory
.
wget -O- --ca-directory=/empty --ca-certificate=myservercert.pem https://www.google.com
( /empty
오류 메시지를 피하기 위해 생성되었지만 디렉토리가 존재하지 않아도 wget은 계속 실행됩니다.)
wget이 OpenSSL(예: Ubuntu)과 연결된 경우
/usr/lib/ssl/certs
Wget은 OpenSSL의 기본 위치( Ubuntu에서는 옵션 ./configure
에 따라 결정됨 --openssldir
) 에서 인증서를 무조건 확인합니다 . 이 외에도 명령줄에 지정된 파일과 디렉터리가 검사됩니다(있는 경우). 기본 위치를 비활성화하는 옵션은 없습니다.
SSL_CTX_set_default_verify_paths
wget은 무조건 OpenSSL에서 함수를 호출하므로 기본 위치가 확인됩니다. 당신은 그것을 사용할 수 있습니다LD_PRELOAD
통화를 무효화합니다.
$ cat no_openssl_default_verify_paths.c
int SSL_CTX_set_default_verify_paths(void *ctx) {
return 0;
}
$ gcc -Wall -fPIC -shared -o no_openssl_default_verify_paths.so no_openssl_default_verify_paths.c
$ wget -nv -O /dev/null https://www.google.com
2015-05-04 14:31:02 URL:https://www.google.fr/?gfe_rd=cr&ei=hmZHVa_DD5Tu8wex3IC4BQ [18613] -> "/dev/null" [1]
$ LD_PRELOAD=~/no_openssl_default_verify_paths.so wget -nv -O /dev/null https://www.google.com
ERROR: cannot verify www.google.com's certificate, issued by ‘/C=US/O=Google Inc/CN=Google Internet Authority G2’:
Unable to locally verify the issuer's authority.
To connect to www.google.com insecurely, use `--no-check-certificate'.