2014-05-08 2 views
2

SSL 클라이언트 인증서를 기반으로하는 PHP 로그인 모듈이 있습니다. 아파치와 잘 작동한다. 이제 어떻게 그것을 nginx로 포팅하는지 알아 내려고 노력 중입니다.SSL 클라이언트 인증서 및 PHP : nginx와의 Apache 호환 정보

Apache를 사용하면 많은 환경 변수 세트를 사용하여 cert의 컨텐츠에 액세스하는 것이 매우 편리합니다. 메일 주소는 예를 들어 $_SERVER['SSL_CLIENT_S_DN_Email']입니다.

나는 fastcgi_param을 통해 PHP에 전달할 수있는 nginx 변수 $ssl_client_s_dn을 발견했습니다. 그러나, 나는 전체 DN 문자열을 얻을 것이다.

  • 제공된 DN 문자열을 구문 분석해야합니까, 아니면 더 좋은 방법이 있습니까?
  • 구문 분석이 필요한 경우 포맷을 올바르게 사용하기 위해 어떤 사양을 사용할 수 있습니까?
  • nginx는 SSL_CLIENT_S_DN에 대해 Apache와 동일한 문자열을 제공합니까?

답변

1

Nginx는 OpenSSL의 X509_NAME_oneline() 함수를 사용하여 문자열을 생성합니다. X509_NAME_oneline()X509_NAME_print() 여러 단점과 불일치를, 그들은 멀티 문자 필드를 처리하지 않는 비 표준 출력 양식을 생산하고있는 기존의 함수이다

기능 :이 기능의 documentation는 다음과 같은 상태. 그들의 사용은 새로운 어플리케이션에서 강력하게 권장되지 않습니다.

Apache 2.2는 SSL_CLIENT_S_DN과 동일한 기능을 사용합니다. 버전 2.3.11부터 Apache HTTPD는 기본적으로 RFC 2253 호환 형식을 사용합니다.

그래서 내 자신의 질문에 대답하기 :

  • 내가 내 자신에 제공된 DN 문자열을 구문 분석하거나 더 나은 방법이있다합니까?

    $ssl_client_s_dn 변수는 nginx가 제공하는 유일한 정보입니다. 대안으로 원시 인증서 데이터도 사용할 수 있습니다. 그러나이 경우 은 nginx가 각 호출에 대해 전체 인증서를 복사해야하므로 성능 문제가 발생할 수 있습니다.

  • 구문을 분석해야한다면 어떤 형식을 사용하여 형식으로 가져올 수 있습니까?

    문자열은 X509_NAME_oneline()으로 구현됩니다. 을 파싱하는 것 같습니다.이 문자열은 방탄 식으로 처리 할 수 ​​없습니다.

  • nginx는 Apache가 SSL_CLIENT_S_DN과 동일한 문자열을 제공합니까?

    2.3.11 이전의 Apache는 기본적으로 RFC 2253 형식을 사용합니다.그러나 레거시 형식을 사용하도록 구성 할 수 있습니다.

0

당신은 그럼 당신은 $ ssl_client_s_dn_cn 변수를 사용할 수 있습니다

map $ssl_client_s_dn $ssl_client_s_dn_cn { 
    default   ""; 
    ~/CN=(?<CN>[^/]+) $CN; 
}; 

같은지도 지시어를 사용할 수 있습니다. 마찬가지로 전자 메일에 정규식을 사용하십시오.