openssl s_client가 일치하지 않는 CAfile에 대해 인증서를 확인하는 이유는 무엇입니까?


10

다음과 openssl s_client같은 인증서 확인 오류를 생성하려고합니다 .

$ openssl s_client -crlf -verify 9 \
  -CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
  -starttls smtp -host mx-ha03.web.de -port 25

web.de 서버의 인증서는 TURKTRUST가 아닌 Deutsche Telekom CA에 의해 인증되므로 위의 명령이 실패해야합니까?

그러나 그것은보고 :

    Verify return code: 0 (ok)

왜?

아날로그 gnutls-cli 명령이 예상대로 실패했음을 의미합니다.

$ { echo -e 'ehlo example.org\nstarttls' ; sleep 1 } | \
   gnutls-cli --starttls --crlf \
   --x509cafile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
   --port 25 mx-ha03.web.de
[..]
*** Verifying server certificate failed...

교차 검사를 수행하면 (즉, --x509cafile /etc/ssl/certs/ca-certificates.crtgnutls-cli 대신 사용)

[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted

(이 또한 예상됩니다)

ca-certificates.crt에 대한 Openssl s_client 인쇄 :

    Verify return code: 0 (ok)

TURKTRUST와 동일한 결과 ...

먼저 기본 설정 -CApath(예 : / etc / ssl / certs)을 사용하여 openssl을 의심 했지만 strace프로세스가 진행 open되면 인수에 대한 syscall 만 보입니다 CAfile.

(모든 테스트는 Ubuntu 10.04 서버에서 수행됨)

업데이트 : TURKTRUST 인증서를 Fedora 20 시스템에 복사하고 첫 번째 openssl 문을 실행했습니다. 다른 결과가 나타납니다.

Verify return code: 19 (self signed certificate in certificate chain)

답변:


10

그것은 밝혀 openssl s_client우분투 10.04에 여전히 시스템에 설치된 인증서에 대한 기본 위치를 조회,해도 -CApath -CAfile 지정됩니다

8466  open("/usr/lib/ssl/certs/4e18c148.0", O_RDONLY) = 4

(줄무늬 출력)

어디:

$ ls -l /usr/lib/ssl/certs/4e18c148.0
lrwxrwxrwx 1 root root 30 2014-04-11 21:50 /usr/lib/ssl/certs/4e18c148.0 ->
    Deutsche_Telekom_Root_CA_2.pem

디렉토리 /usr/lib/ssl/certs/etc/ssl/certsUbuntu 10.04에서 심볼릭 링크 이므로 open'/ etc / ssl'을 grepping 할 때 strace 로그 의 행이 선택되지 않습니다 ...

출처

에는 OpenSSL-0.9.8k 보면,에 위치하고 있으며이 문제의 원인 crypto/x509/by_dir.c, dir_ctrl():

dir=(char *)Getenv(X509_get_default_cert_dir_env());
if (dir)
    ret=add_cert_dir(ld,dir,X509_FILETYPE_PEM);
else
    ret=add_cert_dir(ld,X509_get_default_cert_dir(),
                     X509_FILETYPE_PEM);

어디서 X509_get_default_cert_dir반환 /usr/lib/ssl/certs하고 X509_get_default_cert_dir_env반환합니다 SSL_CERT_DIR.

해결 방법

따라서 Ubuntu 10.04 / openssl 0.9.8k에서 다음 해결 방법을 사용하여 예상되는 동작을 얻을 수 있습니다.

$ SSL_CERT_DIR="" openssl s_client -crlf -verify 9 \
    -CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.crt \
    -starttls smtp -host mx-ha03.web.de -port 25

확인이 실패하면 :

Verify return code: 19 (self signed certificate in certificate chain)

현재 상황

이것은 우분투 문제입니다. 예를 들어 Fedora 20의 openssl 1.0.1e 또는 Fedora 29의 openssl 1.1.1에서는 문제를 재현 할 수 없으므로이 해결 방법이 필요하지 않습니다. 이는 -CAfile또는 과 같은 옵션을 지정할 때 -CApath기본 인증서 시스템 디렉토리가 Fedora 시스템의 디렉토리 검색 목록에 추가되지 않음을 의미 합니다.

openssl 1.0.2g가 설치된 Ubuntu 16에서는 여전히 문제가 있습니다.

또한 openssl-1.0.2k-16과 함께 CentOS 7에도 존재합니다. 불행히도 위의 해결 방법은 도움이되지 않으며 알 수 없거나 예기치 않은 TLS 패킷 유형으로 인해 gnutls-3.3.29-8이 실패합니다.


버전 1.0.2g가 있으며 여전히이 버그가 있습니다. 설상가상으로, -verify_return_error 플래그는 전혀 영향을 미치지 않으며 인증서가 잘못되어도 TLS 연결이 진행됩니다.
takumar

@ takumar, openssl 1.0.2g-1ubuntu4.14로 우분투 16에서 이것을 다시 테스트 했으며이 해결 방법이 없으면 openssl 테스트가 여전히 실패한다는 것을 확인할 수 있습니다. 그러나 적어도 해결 방법으로 예상되는 오류 메시지가 표시되고 해결 방법과 -verify_return_error함께 명령이 종료 상태 1로 종료됩니다. Fedora 29 및 openssl-1.1.1-3.fc29.x86_64를 사용하면 모든 것이 여전히 예상대로 작동합니다. 필요하지 않습니다.
maxschlepzig

2019 년에도 여전히 macOS의 경우처럼 보입니다. 또한 일부 시스템은 -no-CAfile( 기본 파일 위치 에서 신뢰할 수있는 CA 인증서를로드하지 않음 ) 및 -no-CApath( 기본 디렉토리 위치에서 신뢰할 수있는 CA 인증서를로드하지 않음 )를 지원할 있지만 내 시스템은 그렇지 않으므로 테스트하지 않았습니다.
Arjan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.