openssl: 일부 버전에서는 로컬 발급자 인증서를 얻을 수 없습니다.

openssl: 일부 버전에서는 로컬 발급자 인증서를 얻을 수 없습니다.

OpenSSL 1.0.2g(OS X의 MacPorts)를 사용하여 Google의 인증서를 확인할 수 있습니다(OS X에서는 일반적으로 키체인에 인증서 번들을 저장하므로 인증서 번들을 지정해야 합니다).

$ echo Q |  /opt/local/bin/openssl s_client   -connect www.google.com:443 -servername www.google.com -verify 6 -CAfile test/cabundle.crt > /dev/null 
verify depth is 6
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = www.google.com
verify return:1
DONE

모든 것이 괜찮습니다. 이제 시스템 버전(0.9.8zg)을 사용하면완전히 동일한 CA 번들 보유오류가 발생합니다.

$ echo Q |  /usr/bin/openssl s_client   -connect www.google.com:443 -servername www.google.com -verify 6 -CAfile test/cabundle.crt > /dev/null 
verify depth is 6
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=27:certificate not trusted
verify return:1
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority G2
verify return:1
depth=0 /C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
verify return:1
DONE

CA 번들을 수동으로 지정하기 때문에 어디에서 문제가 발생할 수 있는지 알 수 없습니다.

답변1

~에서https://trac.macports.org/ticket/47805

문제는 Apple이 Google(및 다른 웹사이트) 인증서의 트러스트 앵커로 사용되었던 Yosemite의 1024비트 루트를 제거했다는 것입니다. 일반적으로 체인의 중간 인증서 중 하나가 OS X의 신뢰할 수 있는 루트 CA(Google의 경우 GeoTrust Global CA)가 아니기 때문에 이는 인증서의 유효성에 영향을 미치지 않습니다.

그러나 1.0.2 이전의 OpenSSL은 이를 감지하지 못했고(중개자가 신뢰할 수 있는 루트 CA인지 확인하여) 항상 신뢰 체인을 끝까지 따라갔습니다. 이 경우 인증서 체인의 끝이 실제로 신뢰할 수 없기 때문에 인증서를 확인할 수 없습니다. OpenSSL 1.0.2는 이 문제를 해결하기 위해 스위치를 추가했지만(openssl s_client에서 -trusted_first에 의해 활성화됨) 이 옵션은 각 소프트웨어에서 개별적으로 활성화해야 합니다.

관련 정보