이로 인해 몇 시간 동안 바빴습니다. 다른 기사와 Stackexchange 질문을 많이 읽었고 다른 방법을 시도했지만 지금까지 긍정적인 결과는 없습니다.
Ubuntu20/Nginx/Openssl v1.1.1 실행.
일반 웹 리소스에서 wget, openssl s_client 또는 컬을 사용할 때 "인증 반환 코드: 20(로컬 발급자 인증서를 얻을 수 없음)" 또는 이에 상응하는 메시지가 표시됩니다.
$ openssl s_client -connect google.com:443
CONNECTED(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
verify return:1
depth=0 CN = *.google.com
verify return:1
---
Certificate chain
0 s:CN = *.google.com
i:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
1 s:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
i:C = US, O = Google Trust Services LLC, CN = GTS Root R1
2 s:C = US, O = Google Trust Services LLC, CN = GTS Root R1
i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIN...
약간의 배경. 이러한 공통 웹 리소스에 대해 작동하는 데 사용되는 SSL 핸드셰이크입니다. 하지만 신뢰할 수 있는 CA 인증서 저장소에 자체 서명된 인증서를 추가해야 하는 애플리케이션이 있습니다. 나는 이 일을 20시간 동안 하고 많은 것을 시도했습니다. 마지막으로 "다시 시작"하고 신뢰할 수 있는 인증서 저장소 전체를 삭제하기로 결정했습니다./etc/ssl/인증서/그리고/usr/(로컬/)공유/ca-인증서/) 및 이러한 폴더에 있는 일반 CA 인증서의 백업을 복원하고 백업을 복원합니다./etc/ca-certificates.conf. 그러다가 도망갔어CA 인증서 업데이트. 또한: OpenSSL을 v1.1.1에서 1.0.2로 다운그레이드한 다음 1.0.2에서 1.1.1로 다시 업그레이드했습니다.
아래 출력은 문제가 없다는 것을 증명합니다.
$ update-ca-certificates -f
Clearing symlinks in /etc/ssl/certs...
done.
Updating certificates in /etc/ssl/certs...
129 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
내가 알 수 있는 한, 내 신뢰할 수 있는 인증서 저장소는 괜찮은 것 같습니다. 체인에 요청된 루트 인증서가 포함되어 있습니다. 위의 예에는 두 개의 루트 인증서가 있습니다. (1)C = 미국, O = Google Trust Services LLC, CN = GTS 루트 R1및 (2)C = BE, O = GlobalSign nv-sa, OU = 루트 CA, CN = GlobalSign 루트 CA.
이 두 루트 인증서가 신뢰할 수 있는 CA 저장소에 있다고 확신합니다. 다음은 제안된 기술의 출력 일부입니다.말론존재하다"발급자 인증서를 얻을 수 없습니다"라는 메시지와 함께 NginX 클라이언트 인증서 인증이 실패합니다.
$ awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
...
subject=OU = GlobalSign ECC Root CA - R4, O = GlobalSign, CN = GlobalSign
subject=OU = GlobalSign ECC Root CA - R5, O = GlobalSign, CN = GlobalSign
subject=C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
subject=OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
subject=OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
subject=OU = GlobalSign Root CA - R6, O = GlobalSign, CN = GlobalSign
...
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R1
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R2
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R3
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R4
따라서 내 예의 호스트(google.com)는 신뢰할 수 있는 CA 저장소에 있는 루트 인증서를 사용합니다. "유효성 검사 오류: 로컬 발급자 인증서를 얻을 수 없습니다"라는 메시지가 계속 나타나는 이유는 무엇입니까?
또한 신뢰할 수 있는 CA 인증서 저장소에 대한 경로를 명시적으로 정의할 때 출력을 추가하겠습니다. SSL 핸드쉐이크 성공! 내가 무엇을 간과하고 있습니까?
$ openssl s_client -CApath /etc/ssl/certs -connect google.com:443
CONNECTED(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify return:1
depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
verify return:1
depth=0 CN = *.google.com
verify return:1
---
Certificate chain
0 s:CN = *.google.com
i:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
1 s:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
i:C = US, O = Google Trust Services LLC, CN = GTS Root R1
2 s:C = US, O = Google Trust Services LLC, CN = GTS Root R1
i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIN...
...
-----END CERTIFICATE-----
subject=CN = *.google.com
issuer=C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 6523 bytes and written 392 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
결론: 재설정되었을 수 있는 일부 설정 또는 매개변수를 간과했거나 시스템 패치에서 무언가가 잘못 설정되었을 수 있습니다. 그러나 나는 그것을 볼 수 없으며 지금까지 읽고 시도한 소스에는 신뢰할 수 있는 CA 인증서 저장소가 완전한지 확인하는 내용이 대부분 언급되어 있습니다. 내가 무엇을 간과하고 있습니까? 이 문제를 해결하려면 어디서 확인해야 합니까? 아니면 어떻게 해야 합니까?
답변1
내 문제를 해결했으며 여기에서 솔루션을 공유하겠습니다. 신뢰할 수 있는 CA 저장소의 인증서는 실제로 괜찮습니다. 내 문제는 OpenSSL을 제거하고 다시 빌드하여 발생했습니다.
"새로운" OpenSSL 설치 디렉토리에는 무엇보다도 다음이 포함되어 있습니다./자격증그리고/사적인폴더 및 openssl.cnf 파일.
$ ll
total 68
drwxr-xr-x 9 root root 4096 Jul 28 12:10 ./
drwxr-xr-x 11 root root 4096 Jul 26 21:58 ../
drwxr-xr-x 2 root root 4096 Jul 26 21:59 bin/
drwxr-xr-x 2 root root 4096 Jul 26 21:59 certs/
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf.dist
drwxr-xr-x 3 root root 4096 Jul 26 21:59 include/
drwxr-xr-x 4 root root 4096 Jul 26 21:59 lib/
drwxr-xr-x 6 root root 4096 Jul 26 21:58 man/
drwxr-xr-x 2 root root 4096 Jul 28 12:10 misc/
-rw-r--r-- 1 root root 10835 Jul 26 21:59 openssl.cnf
-rw-r--r-- 1 root root 10909 Jul 28 12:10 openssl.cnf.dist
drwxr-xr-x 2 root root 4096 Jul 26 21:59 private/
하지만 이 서버("새로운 기본 Ubuntu20"이 아닌 타사에서 제공)는 신뢰할 수 있는 CA를 다음 위치에 저장합니다./etc/ssl/인증서. 간단히 말해서 OpenSSL이 모든 공통 인증서가 있는 CA 저장소를 "찾지" 못한 이유입니다.해결책은 이 원본 폴더를 삭제하고 실제 신뢰할 수 있는 CA 저장소에 심볼릭 링크를 추가하는 것이었습니다.
$ rmdir certs
$ ln -s /etc/ssl/certs ./certs
또한 추가되었습니다:
$ rm openssl.cnf
$ rmdir private
$ ln -s /etc/ssl/openssl.cnf ./openssl.cnf
$ ln -s /etc/ssl/private ./private
이제 다음과 같습니다:
$ ll
total 48
drwxr-xr-x 7 root root 4096 Jul 30 17:02 ./
drwxr-xr-x 11 root root 4096 Jul 26 21:58 ../
drwxr-xr-x 2 root root 4096 Jul 26 21:59 bin/
lrwxrwxrwx 1 root root 14 Jul 30 16:57 certs -> /etc/ssl/certs/
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf.dist
drwxr-xr-x 3 root root 4096 Jul 26 21:59 include/
drwxr-xr-x 4 root root 4096 Jul 26 21:59 lib/
drwxr-xr-x 6 root root 4096 Jul 26 21:58 man/
drwxr-xr-x 2 root root 4096 Jul 28 12:10 misc/
lrwxrwxrwx 1 root root 20 Jul 30 17:02 openssl.cnf -> /etc/ssl/openssl.cnf
-rw-r--r-- 1 root root 10909 Jul 28 12:10 openssl.cnf.dist
lrwxrwxrwx 1 root root 16 Jul 30 17:02 private -> /etc/ssl/private/
동일한 방식으로 구성된 다른 서버에 로그인하고 OPENSSLDIR(OpenSSL 설치 디렉터리)을 찾아 솔루션을 찾았습니다.
openssl version -d
이 두 서버에는 차이점이 있습니다. 이 폴더 안을 살펴보세요. 작동하는 서버의 폴더에서 심볼릭 링크를 찾으십시오. 서버에서 빈 "certs" 폴더가 발견되었지만 존재하지 않습니다. 심볼릭 링크를 추가했습니다. 해결되었습니다.