알려진 CA에 대해 확인하지 않고 아파치가 클라이언트 SSL 인증서를 요청하도록하려면 어떻게해야합니까?


9

클라이언트가 인증서로 인증하려는 사이트를 제공하기 위해 apache2 (2.2.3)를 사용하고 있습니다. 특정 인증서를 제시하는 사용자가 과거에 해당 인증서를 제시 한 동일한 사용자인지 확인하기 만하면되므로 인증서에 서명하는 CA는 관련이 없습니다. 그러나 사용 SSLVerifyClient require하려면 SSLCACertificateFile ...(또는 SSLCACertificatePath ...) 필요하며 아파치는 해당 파일 / 경로에서 CA가 서명 한 인증서 만 허용합니다. 발급 / 발신 CA에 관계없이 아파치가 클라이언트 인증서를 수락하도록하는 방법이 있습니까? (즉, 클라이언트가 제시된 공개 키에 해당하는 개인 키를 가지고 있는지 확인하지만 발급 / 서명 CA를 확인하는 데 방해가되지 않음)


인증 된 인증서를 어떻게 추적 할 계획입니까?
Shane Madden

@ShaneMadden : 인증서를 내부 사용자 ID에 매핑하는 테이블과 같은 것. 공개 키 암호화 기법은 암호 교환을 대신합니다.
Isaac

2
맞아-내가 얻는 것은 Apache가 인증서를 내부 사용자 ID에 매핑하는 테이블을 수행 하지 않는다는 입니다. 사용자가 클라이언트 인증서로 인증하게하려면 서명 한 인증서를 사용자에게 제공하지 않겠습니까? 앞에서 언급했듯이 OpenID 제공 업체가 있습니다. Apache mod_ssl는 인증서 서명 관계를 기반으로 사용자를 인증하도록 설계되었습니다. 어떤 이유로 든 무시하고 싶다면 인증서 대 사용자 매핑을 처리하는 자체 코드로 인증서 인증을 구현해야합니다.
Shane Madden

@ShaneMadden : 인증서 발급을 피하고 발급 한 인증서 만 수락하면 스마트 카드 기반 인증서가 만료됩니다. 내가 무엇을하든 시스템의 일부는 응용 프로그램 수준에서 진행되지만 모든 mod_ssl기계가 있기 때문에 일부 작업을 처리 할 수 ​​있기를 바랐습니다.
Isaac

1
@ShaneMadden 하나의 장점은 optional_no_ca인증서에 문제가있는 경우 HTTP 오류 메시지를 표시 할 수 있기 때문에 UI에 더 좋을 수 있다는 것입니다. ). 인증서를 확인하는 다른 방법 (예 : WebID ) 을 시도하려는 경우에도 유용합니다 . 그래도 확인을 위해 무언가를 원할 것입니다. 요청이 파일 (예 : PHP / CGI / Java 내)로 처리 될 때만 실제로 작동합니다.
Bruno

답변:


10

아시다시피,을 사용하여 Apache Httpd 내의 SSL / TLS 핸드 셰이크 수준에서 인증서 확인을 비활성화 할 수 있습니다 SSLVerifyCLient optional_no_ca.

두 번째로하려는 문제는 클라이언트가 인증서를 보내도록하는 것입니다. 인증서는 PKI 내에 있지 않으므로 자체 서명되어 다양한 발급자가있을 수 있습니다.

클라이언트 인증서를 요청하면 서버는 핸드 셰이크 중에 클라이언트에 CertificateRequestTLS 메시지 를 보냅니다 . 이 메시지에는 다음 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하면 CertificateRequestTLS 메시지 CN=Dummy CAcertificate_authorities목록 에서 사용 됩니다 (이 단계에서는 인증서가 아닌 이름 일뿐입니다). 그러면 클라이언트는 발급자 DN을 사용하여 자체 인증서를 선택할 수 있습니다.CN=Dummy CA이 단계에는 서명 확인이 포함되지 않으므로 해당 인증서 (동일한 키)로 서명을 확인할 수 있는지 여부입니다.

이것은 SSLVerifyCLient optional_no_ca실제 인증서 확인이 이루어지지 않는다는 것을 기억 SSL_CLIENT_VERIFY하십시오 (수동 확인이 구성 한 PKI의 대체 솔루션 인 경우 변수를 확인할 수 있다고 가정 합니다). 이 단계에서 알 수있는 것은 클라이언트가 제시 한 공개 키 인증서 (TLS CertificateVerify메시지로 보증)에 대한 개인 키를 가지고 있다는 것입니다. 일부 인증을 받으려면 어떤 형태의 확인을 수행해야합니다. 종류. 인증서의 내용, 즉 공개 키와 인증서의 이름 / 속성 간의 바인딩을 신뢰할 수 없습니다.

이것은 파일에는 적합하지 않지만 응용 프로그램 (예 : PHP / CGI / ... 프록시를 프록시 된 Java 서버에 인증서를 전달하는 경우에도 Java)을 위해이 작업을 수행 할 수 있습니다. 하나의 기본 방법은 미리 알려진 공개 키 목록을 사용하거나 FOAF + SSL / WebID 의 아이디어를 볼 수 있습니다.


2

사용 SSLVerifyCLient optional_no_ca(대신하여 require) 아파치가 발급 CA를 확인하지됩니다 (따라서 CA 인증서 파일이나 경로를 필요가 없습니다). 클라이언트 / 사용자가 인증서를 제출하지 못하게하므로 인증서가 전혀 사용되지 않았는지 확인해야합니다.

(분명히 mod_ssl문서 를 완전히 읽지 못했습니다 .)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.