인증서 폴더에서 OpenSSL이 CA를 선택하지 않음 s_client -connect

curlHTTPS 서버에 연결하지 못하는 데 문제가 있습니다 .

$ curl https://the-problem-site.com    (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)

1112는 SSL_R_TLSV1_UNRECOGNIZED_NAME입니다 ssl.h.

openssl s_client -connect the-problem-site.com:443대신 시도하면 볼 수 있습니다.

CONNECTED(00000003)
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
verify error:num=20:unable to get local issuer certificate
verify return:0

Certificate chain
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

즉, 문제는 신뢰하지 않는 것 같습니다 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA. 그건 그러나 그 인증서가 설치되고 /etc/ssl/certs/GeoTrust_Global_CA.pem, 대신 내가 실행하는 경우

openssl s_client -problem-site.com 연결 : 443 -CA 파일 /etc/ssl/certs/GeoTrust_Global_CA.pem

그런 다음 모든 것이 작동합니다. 이 인증서는 또한 해시 이름이 지정된 파일로 존재하며 b0f3e76e.0ca-certificates.crt있습니다. 그러나 내가 아는 한 curl이나 openssl은 인증서를 읽으려고 시도하지 않습니다. 내가 strace그것들이라면 읽 /usr/lib/ssl/certs거나 전혀 시도 /etc/ssl/certs하지 않으며 오류조차도 없습니다. 비록 openssl.cnf를 읽습니다. 우리는 달렸다 update-ca-certificates.

이것은 openssl 0.9.8k가있는 Ubuntu 10.04입니다. 두 번의 개별 설치에서 문제를 재현 할 수 있습니다 (하나는 다른 복제본 일 수 있음). openssl 0.9.8e를 사용하여 CentOS VM에서 동일한 테스트를 시도하면 제대로 작동하며에서 인증서 파일을 읽는 것을 볼 수 있습니다 strace. 우분투 straces에서 같은 시점에 동등한 파일 액세스가 없습니다. openssl.cnfCentOS VM에서 Ubuntu 시스템으로 파일을 복사 해도 아무런 차이가 없습니다. 환경이나 .rc 파일에는이를 일으킬 수있는 명확한 것이 없습니다.

내가 잘못하고있는 아이디어가 있습니까? 이 작업이 작동해야합니까 (즉, openssl 및 curl이 명령 줄에서 설치된 CA를 자동으로 가져와야합니까?) 이것은 어떻게 구성됩니까? 감사!


또 다른 데이터 포인트 : 13 서버를 새로 설치 curl하면 인증서 파일을 가져 와서 잘 작동합니다. openssl s_client그래도 여전히 그렇지 않습니다. 왜 그런가요?



답변

시스템에는 여러 암호화 라이브러리가 있습니다.

  • OpenSSL (GPL 호환성을 방지하지만 GNU 환경에서 채택을 제한하는 “GPL 호환성은 방지하지만 다소 문제가없는”조항을 포함하는 BSD 스타일 (매우 무료) 라이센스가있는 금본위 제)
  • GnuTLS (FSF의 대체품) LGPLv2 라이센스 (유지되지는 않지만)와 LGPLv3 라이센스 (GPLv2 전용 프로그램과 호환되지 않음)의 두 가지 맛이 있습니다. 또한 보안을 강화합니다)
  • NSS (Netscape / Mozilla의 라이브러리, 외부에서 거의 사용되지 않음, 새로운 표준 채택 속도가 느림)
  • PolarSSL, MatrixSSL, NaCl / Salt와 같은 사소한 것들

그들 모두는 물론 유사점과 차이점이 있습니다. 그것들을 (암호화 목적으로 사용하거나 SSL / TLS를 사용하기 위해) 사용하는 소프트웨어는 때때로 이들 라이브러리 중 하나 이상의 사용을 지원합니다 (예 : 웹 브라우저 Lynx는 일반적으로 OpenSSL에 연결되어 있지만 GnuTLS도 지원합니다) GNU 사람들을 진정시키기 위해).

cURL은 또한 세 가지 주요 암호화 라이브러리 중 하나를 사용하도록 지원하는 프로젝트 중 하나입니다. 이것은 주로 cURL이 http, ftp 등의 연결을 사용하여 다운로드하거나 업로드 할 때 다른 프로그램에서 사용하기위한 라이브러리이기 때문입니다. curl명령 줄 도구는 이러한 변형 중 하나에서 올 수 있습니다.

이제 새로 설치하지 않은 시스템에서 발생하는 문제는 다음과 같습니다.

OpenSSL과 GnuTLS는 모두 /etc/ssl/certs/<hash>.<number>스타일 CA 디렉토리 사용을 지원 합니다. 그러나 OpenSSL 버전 0.x 및 GnuTLS는 OpenSSL 버전 1.x가 사용하는 것과 다른 알고리즘을 사용하여 위에서 언급 한 해시 를 계산 합니다. (시스템에서 둘 다 coëxist 할 수 있습니다. 다른 인증서에 동일한 해시 가있는 경우 다른 번호 를 사용하십시오 . 그러나 어떤 이유로 Debian / Ubuntu의 ca-certificates패키지는이 작업을 수행하지 않는 것 같습니다.) 또한 일부 버전의 GnuTLS는 그렇지 않습니다 디렉토리 사용을 지원하지만 파일 만 사용합니다 /etc/ssl/certs/ca-certificates.crt(일반적으로 ca-certificates패키지의 관리자 스크립트에 의해 관리 되지만 벗어날 수 있음). 이전 버전을 사용하고있는 것 같습니다.

openssl s_client(포함하지 않는 즉, 기본적으로 -CApath또는 -CAfile옵션) 보이지 않는 어디서나 인증서.

귀하의 curl업그레이드 된 설치에서 가장 가능성이 아닌 다른 암호화 라이브러리를 사용하여 curl새로 설치에서합니다.

이전 GnuTLS 버전의 동작을 모방하는 openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443것 외에도 시도하십시오 openssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443.

두 번 점검합니다 OpenSSL을 1.x에서의이 있다면 어디서든 시스템에은 (우분투 심지어 LTS 버전에 주요 업데이트를 몰래 알려져있다), 그리고 네 경우, 파일의 해시를 확인 :

openssl x509 -noout -hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem

일반적으로 두 번째 및 세 번째 명령은 실패하거나 (OpenSSL 0.x) 첫 번째 및 세 번째 명령은 동일한 해시를 표시해야하지만 두 번째 명령은 다른 해시 (OpenSSL 1.x)를 표시해야합니다. GnuTLS는 두 번째 명령의 출력을 사용합니다 (OpenSSL 1.x가 설치된 경우). OpenSSL 0.x가 설치된 경우 동일한 해시입니다. 이러한 심볼릭 링크를 수동으로 만들 수 있습니다.

디버깅 피드백을 제공하면이 게시물을 업데이트 할 수 있습니다.


답변