중간 인증서가 없는 웹사이트용 컬

중간 인증서가 없는 웹사이트용 컬

웹사이트에 요청하는 데 사용해야 하는데 curl웹사이트에서 TLS의 중간 인증서를 제공하지 않습니다.

내가 말하고 싶은 건:

TLS를 사용하여 서버에 연결할 때 다음을 수행해야 합니다(rfc5246 F.1.1, rfc5246 7.4.2)는 서버의 인증서를 확인하는 데 충분한 모든 인증서를 클라이언트에 제공합니다. 이는 다음에 연결될 때를 의미합니다.www.google.com, 호스트 인증서(*.google.com)와 중간 인증서(GTS CA 1C3) 및 루트 인증서(GTS Root R1)를 제공했습니다. 문제 사이트에 접속 시 호스트 인증서만 제공합니다.

예: openssl s_client -connect google.com:443 -showcerts 2>&1 < /dev/null- 3개의 인증서가 제공됩니다.

이는 대부분의 브라우저에서는 괜찮지만 CURL에서는 그렇지 않습니다.

curl --insecure따라서 사이트용 번들을 사용하거나 수동으로 업데이트해야 합니다 .

연결을 안전하게 만들고 싶지만 자동입니다.

URL에서 완전한 인증서 체인을 구축하고, 루트 CA 번들에 대해 유효성을 검사하고, curl --insecure --pinnedpubkey <value>유효성 검사에 실패할 경우 사용할 값을 출력할 수 있는 도구가 있습니까?

답변1

이 경우 컬 처리는 빌드에 따라 다릅니다.

컬은 무엇이든 사용할 수 있습니다여러 TLS 구현는 컴파일 타임에 결정되며, 컬의 TLS 구현 동작이 컬의 TLS 구현에 따라 달라진다는 것은 놀라운 일이 아닙니다.

컬에 schannel을 사용하면 손실된 체인 인증서를 검색할 수 있습니다.(RFC의 요구에 따라 서버에서 전송되지 않음) AIA를 사용하여 결과를 확인합니다. 또한 누락된 체인 인증서가 Windows 인증서 저장소에 있는 경우 schannel을 사용한 컬은 누락된 체인 인증서를 채웁니다(예:언제나확인하다뿌리Windows 인증서 저장소에 있음), 이러한 체인 인증서를 언제 얻었는지 쉽게 확인할 수는 없지만푸틴내(Win 10 Home) 시스템인 Windows Store는 많은 웹 검색에 매일 사용되며 때로는 컬 및 Powershell iwr과 같은 작업(실제로는 약 12개)에 사용됩니다. 물론, 컬과 schannel은 Windows에서만 사용할 수 있습니다. schannel이 지원하지 않는 기능을 사용하라고 제안하셨으므로 --pinnedpubkeyschannel을 사용하지 않으실 수도 있습니다.

OpenSSL은 이를 위해 확실히 AIA를 사용하지 않으므로 많은(전부는 아님) Linux 배포판에서 널리 사용되는 OpenSSL 컬도 AIA를 사용하지 않습니다. Frederic이 발견한 것처럼 OpenSSL은~ 할 것이다제공된 파일에서 체인 인증서(루트 포함)를 입력하십시오. --cacert따라서 어떤 체인 인증서가 필요한지 알고 있거나 추측할 수 있으면 미리 다운로드하면 됩니다.

NSS 자체가 AIA를 수행할 수 있다고 확신하지만(Firefox가 할 수 있는 것처럼), 컬이 AIA에 액세스하거나 활성화할 수 있는지 여부와 방법을 알지 못하며 NSS를 사용하여 쉽게 테스트할 수 있습니다(WSL의 Ubuntu 16.04에서는 물론입니다). 좀 낡았음) 그러지 마세요..

GnuTLS에 대해서는 모르지만 CentOS 7에서 GnuTLS를 사용하는 컬은 이 작업을 수행하지 않습니다.

그러나 실제 문제의 경우 이 작업을 수동으로 수행하고 결과를 저장할 수 있는 도구가 없습니다.

https://www.ssllabs.com/ssltest/브라우저와 같은 방식으로 인증서/체인을 작성 및 확인하고 결과를 표시하는 것을 포함하여 SSL/TLS 기능 및 호환성에 대한 매우 광범위한 테스트많은 종류의경로가 발견되면 해당 경로는 신뢰할 수 있지만 브라우저는 이를 수행하지 않습니다. 이러한 결과를 긁어낼 수도 있습니다.https://whatsmychaincert.com/체인 빌드/수정을 수행했을 때 좋은 PEM이 생성된 것을 기억하는 것 같지만 제가 알고 있는 유일한 공개 테스트가 현재 손상되었기 때문에 확인할 수 없습니다(Frederic이 인용한 것과 동일한 불완전 체인). badssl.com).

Java(보다 정확하게는 "표준" 암호화 제공자를 사용할 때 Java에서 SSL/TLS 구현인 JSSE)는 인증의 일부로 가져오기 위해 AIA를 사용할 수 있습니다(기본적으로 활성화해야 하는 것은 아님). 웹사이트에 연결하고, AIA.caIssuers가 활성화된 인증서를 확인하고, 성공하면 생성된 인증서 및/또는 고정용 키를 작성하는 간단한 Java 프로그램입니다. 더 나은 솔루션이 없다면 20~30줄만 소요될 것으로 예상됩니다. 제공되며 나중에 시간이 있으면 시도해 보겠습니다. (또는 이것은 스택입니다. 다른 사람도 이 작업을 수행할 수 있습니다.)

답변2

curl자체 서명된 인증서를 처리할 수 있습니다.

신뢰할 수 있는 경로를 통해 다운로드한 인증서의 위치를 ​​입력하기만 하면 됩니다 curl --cacert fullchain.pem URL.fullchain.pem

curl적절한 루트를 사용하지 않으면 curl서버를 신뢰할 수 없으며 --insecure이를 만족시킬 수 있는 옵션이 필요합니다.

주의하시기 바랍니다https://regery.com/en/security/ssl-tools/self-signed-certificate-generator(또는 기타 도구)를 사용하면 누구나 모든 서버에 대해 자체 서명된 인증서를 만들 수 있습니다. curl자체 서명된 인증서가 있는 서버는 다른 방법을 통해 이 인증서를 제공하지 않으면 신뢰할 수 없습니다.

curl다른 인증서를 사용하면 임시 루트 인증서(Verisign, DigiCert, LetsEncrypt...참조 /etc/ssl/certs/)를 신뢰하고 curl루트 인증서를 서버 인증서에 연결할 수 있기 때문에 더 쉽습니다 . 서버 인증서를 사용하면 다른 루트를 제안해야 합니다.

관련 정보