시스템: Ubuntu 14.04, apt-upgrade
d 최신 버전. openssl, ca 인증서, wget 설치
징후:
wget https://api.xxx.io
다음 오류가 발생합니다.
ERROR: cannot verify api.xxx.io's certificate, issued by '/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2':
Unable to locally verify the issuer's authority.
To connect to api.xxx.io insecurely, use `--no-check-certificate'.
어디 wget https://google.com
잘 작동합니다.
openssl s_client -connect api.xxx.io:443
결과는 다음과 같습니다.
CONNECTED(00000003)
depth=3 C = US, O = "The Go Daddy Group, Inc.", OU = Go Daddy Class 2 Certification Authority
verify error:num=19:self signed certificate in certificate chain
verify return:0
godaddy의 루트 인증서를 다시 설치해 보았습니다.
- CA cert crt 패키지를 다운로드하여
/usr/share/ca-certificates/extra
- 실행
dpkg-reconfigure ca-certificates
하고 프롬프트를 따르십시오.
불운.
또한 시도했지만 c_rehash
행운이 없습니다.
이 사이트는 ubuntu 16 시스템에서 성공적으로 확인되었습니다. 제가 시도해야 할 다른 것이 있나요?
편집: 실행하면 strace -e open openssl s_client -connect api.xxx.io:443
ca-certificates.crt도 열리지 않는 것으로 표시됩니다.
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libcrypto.so.1.0.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/ssl/openssl.cnf", O_RDONLY) = 3
open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3
open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 3
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
편집 2: CApath를 openssl에 전달하면 작동합니다.
openssl s_client -connect api.xxx.io:443 -showcerts -CApath /etc/ssl/certs
openssl.cnf를 편집하고 환경 변수로 재정의해 보았으나 여전히 작동하지 않습니다.
edit3: 2개의 서로 다른 인증서를 사용하는 2개의 서로 다른 호스트 대신 단일 호스트를 사용하여 질문을 업데이트했습니다.
답변1
편집한 대로 대부분의 질문은 아마도 교차 중복일 것입니다.https://superuser.com/questions/903247/ssl-root-ca-certificate-is-not-recognized-although-present-in-the-trust-store그리고https://serverfault.com/questions/607233/how-to-make-openssl-s-client-using-default-c.
Ubuntu 소스를 확인하지는 않았지만 Ubuntu 14.04는 명목상 OpenSSL 1.0.1f를 사용합니다. 업스트림에는 옵션이 지정되지 않은 경우 기본 신뢰 저장소를 사용하지 않게 만드는 버그가 있었고 16.04는 1.0을 사용했습니다 s_client
. -CA{path,file}
2g이 해결되었습니다. (분명히 16.10에서도 마찬가지지만 LTS가 아니며 더 이상 지원되지 않습니다.)
프로필은 관련이 없습니다. s_client
ENGINE 및 addedOID에 대해 "library-global" 이외의 프로필 설정을 사용하지 마십시오. 둘 다 이 문제와 관련이 없습니다.
www.tcell.io
그러나 ( wget
리다이렉션되는 곳)과 api.tcell.io
( openssl s_client
연결을 지시하는 곳)은 다른 시스템이라는 점에 유의하십시오 . www.ssllabs.com/ssltest에 따르면:
api.tcell.io
52.8.231.1 GoDaddy-SecureG2 인증서(일련 번호 00c8c641d43c76286c)를 필요한 체인 인증서로 올바르게 프로비저닝합니다(정확히 #2와 #3이 필요합니다. #4는 루트이며 필수는 아니지만 허용 가능함)www.tcell.io
13.57.73.170은 동일한 인증서를 제공하지만 체인 인증서는 제공하지 않음으로써 RFC를 위반합니다(다운그레이드되지만 B로 제한되는 DH-1024도 사용함). 체인 인증서가 없으면wget
인증서를 확인할 수 없습니다. 설치된 "번들"이 신뢰 저장소에 체인 인증서를 추가하는 경우wget
OpenSSL을 사용하십시오 (web-PKI가 작동하도록 의도된 방식이 아님).예체인을 구축하고 검증할 수 있습니다.