클라이언트가 인증서로 인증하려는 사이트를 제공하기 위해 apache2 (2.2.3)를 사용하고 있습니다. 특정 인증서를 제시하는 사용자가 과거에 해당 인증서를 제시 한 동일한 사용자인지 확인하기 만하면되므로 인증서에 서명하는 CA는 관련이 없습니다. 그러나 사용 SSLVerifyClient require
하려면 SSLCACertificateFile ...
(또는 SSLCACertificatePath ...
) 필요하며 아파치는 해당 파일 / 경로에서 CA가 서명 한 인증서 만 허용합니다. 발급 / 발신 CA에 관계없이 아파치가 클라이언트 인증서를 수락하도록하는 방법이 있습니까? (즉, 클라이언트가 제시된 공개 키에 해당하는 개인 키를 가지고 있는지 확인하지만 발급 / 서명 CA를 확인하는 데 방해가되지 않음)
답변
아시다시피,을 사용하여 Apache Httpd 내의 SSL / TLS 핸드 셰이크 수준에서 인증서 확인을 비활성화 할 수 있습니다 SSLVerifyCLient optional_no_ca
.
두 번째로하려는 문제는 클라이언트가 인증서를 보내도록하는 것입니다. 인증서는 PKI 내에 있지 않으므로 자체 서명되어 다양한 발급자가있을 수 있습니다.
클라이언트 인증서를 요청하면 서버는 핸드 셰이크 중에 클라이언트에 CertificateRequest
TLS 메시지 를 보냅니다 . 이 메시지에는 다음 certificate_authorities
목록 이 포함 됩니다.
허용 가능한 인증 기관의 고유 이름 목록. 이러한 식별 이름은 루트 CA 또는 하위 CA에 대해 원하는 식별 이름을 지정할 수 있습니다. 따라서이 메시지는 알려진 루트와 원하는 권한 부여 공간을 모두 설명하는 데 사용될 수 있습니다. certificate_authorities 목록이 비어있는 경우, 반대의 외부 배열이없는 한, 클라이언트는 적절한 ClientCertificateType의 인증서를 보낼 수 있습니다 (MAY).
브라우저는이를 사용하여 보낼 클라이언트 인증서를 선택합니다 (있는 경우).
(빈 목록에 대한 부분은 TLS 1.1 이후의 사양에만 있습니다. SSL 3.0 및 TLS 1.0은 이것에 대해서는 침묵하며 실제로 작동합니다.)
이에 대한 두 가지 옵션이 있습니다.
-
클라이언트 인증서에 자체 서명이 필요한 경우 모두 발급자가 다릅니다. 무엇을 기대해야할지 모르기 때문에 서버는 빈 목록을 보내야합니다. 이렇게하려면
SSLCADNRequestFile
지시문을 사용하고 빈 줄만 포함 된 파일을 가리 키십시오 (잘 기억하면 완전히 빈 파일에서는 작동하지 않습니다). -
두 번째 (덜 깨끗함) 옵션. 해당 CA 인증서에서 실제로 발급했는지 또는 해당 CA가 존재하는지 여부에 관계없이 모든 클라이언트 인증서에 공통적 인 발급자 DN에 동의해야합니다. 그렇게하면 PKI 모델을 상당히 깨뜨릴 수 있습니다.
CN=Dummy CA
(예를 들어) 와 같은 발급자 DN에 동의하는 경우 누구나CN=Dummy CA
다른 키를 사용 하여 주체 DN (및 발급자 DN)으로 자체 서명 된 인증서를 작성할 수 있습니다 .SSLCADNRequestFile
지시문은 목록을 작성하기 위해 인증서로 구성 될 것으로 예상 되지만, 이는 클라이언트 인증서를 전혀 검증하는 데 사용되지는 않지만 목록을 구성하는 복잡한 방법이지만 다른 지시문의 맥락에서는 자연 스럽습니다certificate_authorities
. 서비스로서 이러한 이름을 가진 자체 서명 인증서를에 입력SSLCADNRequestFile
하면CertificateRequest
TLS 메시지CN=Dummy CA
가certificate_authorities
목록 에서 사용 됩니다 (이 단계에서는 인증서가 아닌 이름 일뿐입니다). 그러면 클라이언트는 발급자 DN을 사용하여 자체 인증서를 선택할 수 있습니다.CN=Dummy CA
이 단계에는 서명 확인이 포함되지 않으므로 해당 인증서 (동일한 키)로 서명을 확인할 수 있는지 여부입니다.
이것은 SSLVerifyCLient optional_no_ca
실제 인증서 확인이 이루어지지 않는다는 것을 기억 SSL_CLIENT_VERIFY
하십시오 (수동 확인이 구성 한 PKI의 대체 솔루션 인 경우 변수를 확인할 수 있다고 가정 합니다). 이 단계에서 알 수있는 것은 클라이언트가 제시 한 공개 키 인증서 (TLS CertificateVerify
메시지로 보증)에 대한 개인 키를 가지고 있다는 것입니다. 일부 인증을 받으려면 어떤 형태의 확인을 수행해야합니다. 종류. 인증서의 내용, 즉 공개 키와 인증서의 이름 / 속성 간의 바인딩을 신뢰할 수 없습니다.
이것은 파일에는 적합하지 않지만 응용 프로그램 (예 : PHP / CGI / … 프록시를 프록시 된 Java 서버에 인증서를 전달하는 경우에도 Java)을 위해이 작업을 수행 할 수 있습니다. 하나의 기본 방법은 미리 알려진 공개 키 목록을 사용하거나 FOAF + SSL / WebID 의 아이디어를 볼 수 있습니다.
답변
사용 SSLVerifyCLient optional_no_ca
(대신하여 require
) 아파치가 발급 CA를 확인하지됩니다 (따라서 CA 인증서 파일이나 경로를 필요가 없습니다). 클라이언트 / 사용자가 인증서를 제출하지 못하게하므로 인증서가 전혀 사용되지 않았는지 확인해야합니다.
(분명히 mod_ssl
문서 를 완전히 읽지 못했습니다 .)