요청이 애플리케이션으로 전송될 때 SSL 인증서가 표시되지 않음

요청이 애플리케이션으로 전송될 때 SSL 인증서가 표시되지 않음

2개의 인증서 체인이 설치된 Java 키 저장소가 있습니다. CSR은 CA에 의해 생성 및 서명되었으며 해당 CA가 포함된 두 인증서가 모두 설치되었습니다. 그러나 포트의 애플리케이션에 요청을 보낼 때 하나의 인증서만 표시되지만 선호하는 인증서에 대해 인증할 수 있도록 키 저장소에 있는 두 인증서가 모두 표시되기를 원합니다.

이것에 대한 도움이 필요해요

답변1

여담: CA는 CSR에 서명하지 않습니다. 그것은 인증서에 서명합니다.부분적으로CSR을 기반으로 하지만 부분적으로는 그렇지 않습니다(두 부분 모두 중요함).

당신은 '라고 말해요CSR이 생성되었습니다'. 실제로 하나의 키에 대해 하나의 CSR을 생성하고 해당 CSR에 대해 두 개의 인증서(각각 잠재적으로 체인 포함)를 얻었고 두 인증서 체인을 모두 저장소의 하나의 개인 키 항목에 설치한 경우 두 번째 인증서가 첫 번째 인증서를 대체하고 사용자만 당신의 가게에 두 번째 것을 가지고 있습니다.

대신 두 개의 개인 키와 두 개의 CSR(각 키에 하나씩)을 생성하고 각 CSR에 대해 인증서 체인을 가져와 해당 개인 키에 설치했다고 가정합니다. 따라서 실제로 서로 다른 인증서 체인이 있는 두 개의 개인 키가 있고 둘 다 보고 싶어합니다. 의심스러운 경우 keytool -list [-v]확인하는 데 사용하십시오.

SSL(현재 TLS) 프로토콜은 이를 수행하지 않습니다.; 서버는 체인 인증서가 있는 경우 하나의 '엔티티'(서버) 인증서만 보내고 한 번의 핸드셰이크를 통해 해당 개인 키를 증명합니다.

5월두 가지 요청을 수행할 수 있으며 각 요청은 다음을 얻습니다.하나원하는 인증서 체인 중:

  • 인증서에 다른 제목/SAN 이름이 있고 클라이언트가 SNI 확장을 사용하는 경우(최근 브라우저에서는 사용하지만 다른 소프트웨어에서는 그럴 수도 있고 그렇지 않을 수도 있음) Java 8 서버는 SNI와 일치하는 인증서를 선호합니다. 대부분의 클라이언트(OpenSSL은 아님!)는 항상 SNI를 연결된 호스트 이름과 동일하게 만들기 때문에 여러 호스트 이름이 동일한 서버를 가리키도록 이름 확인을 (일시적으로?) 변경해야 할 수도 있습니다(예: 파일 hosts또는 바인딩되지 않은 또는 이와 유사한 경우). .

  • 인증서가 다른 키 유형(RSA, DSA, EC)에 대한 것이고 클라이언트가 하나의 키 유형을 사용하는 암호화 제품군만 제공하는 경우 Java 서버는 해당 키 유형에 대한 인증서를 사용합니다. 일부 클라이언트에서는 제공되는 암호화 제품군을 쉽게 제어할 수 있지만 일부 클라이언트에서는 그렇지 않습니다.

  • 마찬가지로, 인증서 체인이 다른 서명 알고리즘 세트를 사용하고 클라이언트가 SignatureAlgorithms 확장을 사용하여 TLS1.2를 구현하는 경우 Java 7+ 서버는 SigAlgs를 충족하는 인증서 체인을 선호합니다. 그러나 SigAlgs를 쉽게 선택할 수 있게 해주는 클라이언트는 없으며 어쨌든 CA는 발급한 인증서의 체인에 어떤 서명 알고리즘을 사용할지 거의 선택권을 제공하지 않습니다.

관련 정보