한 가상 서버에서 ssl_verify_client = ON을 사용하고 다른 가상 서버에서 ssl_verify_client = OFF를 사용하는 방법은 무엇입니까?


9

가상 호스트에서 SSL 클라이언트를 강제로 확인하고 싶습니다. 그러나 "필요한 SSL 인증서가 전송되지 않았습니다"오류가 발생하여 무언가를 가져 오려고합니다.

테스트 구성은 다음과 같습니다.

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

첫 번째 서버는 200 개의 http 코드로 응답하지만 두 번째 서버는 "400 잘못된 요청, 필요한 SSL 인증서를 보내지 않았습니다. nginx / 1.0.4"를 반환합니다.

아마도 같은 IP에서 ssl_verify_client를 사용하는 것은 불가능합니까? 이 서버를 다른 IP에 바인딩해야합니까? 문제가 해결됩니까?

답변:


4

비슷한 문제가 발생했지만 ssl_verify_clients서버 블록이 아닌 서버 블록 내의 위치 블록 을 구별하려고했습니다 . 기본 ssl 구성 항목을 두 서버로 이동하여 문제를 해결할 수 있습니다 (복제하거나 확실하게 하나의 서버 블록에 배치하고 여러 하위 도메인을 수락하고 위치를 사용함).

위치 기반 솔루션의 경우 다음과 같이 작동합니다. 사용하다

ssl_verify_client optional;

서버 블록에서 다양한 위치에서 if 문을 사용하십시오. 예 :

if ($ssl_client_verify != SUCCESS) { return 403; }

관리자에게 webapp에 대한 액세스 권한을 부여하기 위해이 작업을 수행해야했지만 github에 클라이언트 SSL 인증서를주지 않고 github에서 webhook을 계속 허용합니다.


2

동일한 IP 주소 및 포트에 여러 호스트 이름 기반 가상 호스트 (SNI 사용)를 사용하지만 ssl_verify_client이러한 호스트에 대해 다른 설정을 사용하려면 최소한 nginx> = 1.0.9로 업그레이드해야 합니다.

이전 nginx 버전에서는 ssl_verify_client기본 가상 호스트에 대한 설정이 동일한 IP + 포트 조합의 다른 모든 이름 기반 가상 호스트에 사용되었습니다. 다른 SSL 옵션 ( ssl_verify_depth, ssl_prefer_server_ciphers)도 같은 방식으로 처리되었습니다. 업그레이드 할 수없는 경우 별도의 IP 또는 포트를 사용하는 것이 해결 방법이 될 수 있습니다.

1.0.9에 대한 nginx 변경 로그 에서 참고하십시오 .

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

의 nginx 소스의 관련 변경 : r4034 트렁크, r4246 1.0 분기입니다.


0

브라우저에서 CA "/etc/certs/allcas.pem"이 서명 한 클라이언트 인증서 (PKCS12 형식)를로드 했습니까? Firefox에서는 환경 설정-> 고급-> 암호화-> 인증서보기-> 인증서로 이동하여 클라이언트 인증서를 확인할 수 있습니다.

기본적으로 "off"인 경우 "ssl_verify_client"매개 변수의 값입니다. SSL 클라이언트 인증서가 필수가 아닌 경우 "선택적"값을 사용할 수도 있습니다.


curl --cert ...를 동일한 결과로 사용했습니다.
Alexander Artemenko

nginx의 오류 로그에 흥미로운 것이 있습니까? (아마도 /var/log/nginx/error.log)
user1025596 2013

0

저는 nginx 전문가는 아니지만 SSL 및 가상 호스트를 사용하는 아파치와 비슷한 문제를 겪었습니다. 문제는 서버가 SSL 협상과 가상 호스트의 선택을 처리하는 순서입니다. 첫 번째 단계는 암호화 된 연결을 설정하는 것이며, 그 후에 만 ​​서버가 요청한 호스트 이름을 확인합니다. 알 때까지 기본 설정 (이 경우 첫 번째 호스트)을 사용하며 SSL 연결을 설정하기 위해 클라이언트 인증서가 필요합니다.

따라서 짧은 대답-이 경우 별도의 포트 또는 별도의 IP 주소를 사용하는 것이 좋습니다.


-1

나는 같은 문제가 발생하여 해결책을 찾았습니다.

default_server두 번째 서버에 플래그를 추가하십시오

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