본문 바로가기
IT Knowledge/보안

Nginx client authentication with multiple certificates

by Seok. 2021. 9. 17.
반응형

[이슈(ISSUE)]

Nginx 에서 상호인증(Client 인증) 지원한다.

Client 인증서가 서로 다른 RootCA 가졌거나, 서로 다른 self-signed 인증서인 경우.

Nginx 서로 다른 여러 인증서를 인증해줄 있을것인가?

 

 

[검증 결과]

* 항목 : nginx의 SSL Config의 "ssl_client_certificate" 

* 항목 : nginx.ingress의 "nginx.ingress.kubernetes.io/auth-tls-secret" (Kubernetes)

 

Nginx forum, trac 따르면...

위의 항목은 "하나의 파일에 여러 인증서를 포함할 수 있습니다."  

&&  "여러 클라이언트 인증서를 인증해줄 수 있습니다. "

예를들어, (인증서2개를 하나의 인증서 파일로 합침)

-----BEGIN CERTIFICATE-----

<인증서1 content>

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

<인증서2 content>

-----END CERTIFICATE-----

 

그러나, '동일한 subject'를 가진 인증서는 작동하지 않습니다. 

만약 동일한 subject를 가진 인증서가 한 파일에 묶인다면!? 앞에 작성된 인증서만 인증이 됩니다.

(subject가 다르다면 둘 다 인증 가능)

 

Q. 추가 확인 필요 이슈.

몇 개의 인증서를 한 파일에 묶을 수 있나? > 확인이 필요합니다. 

 


[검증 테스트 과정]

Client.crt Client3.crt 같은 Subject 가진다.

 

Client1.crt (Subject: C=KR, CN=iUpdate)

Client2.crt (Subject: C=KR, L=Default City, O=Default Company Ltd, CN=iUpdate)

Client3.crt (Subject: C=KR, CN=iUpdate)

 

ALL_CA.crt (cat client1.crt client2.crt client3.crt > ALL_CA.crt)

ALL_CA2.crt(cat client2.crt client3.crt client1.crt > ALL_CA2.crt)

 

[서버 설정]

Ingress 생성 설정

nginx.ingress.kubernetes.io/auth-tls-verify-client"on"

nginx.ingress.kubernetes.io/auth-tls-secret"namespace/secret_file"

 

Secret 파일 설정

Ca.crt ALL_CA.crt or ALL_CA2.crt파일을 base64 encoding

apiVersionv1

data:

  ca.crt<ALL_CA.crt or ALL_CA2.crt base64 encoding>

kindSecret

metadata:

  namesecret_file

  namespacenamespace

typeOpaque

 

 

[클라이언트 설정]

[Test Case]

서버 적용 인증서 Client1.crt Clien2t.crt Client3.crt
ALL_CA.crt (Client1>Client2>Client3) 성공 성공 실패
ALL_CA2.crt (Client2>Client3>Client1) 실패 성공 성공

 

여러개의 인증서를 합친 인증서를 사용하면, 

여러 인증서를 인증해줄 수 있다!!

(단, Subject가 동일하면 앞에 설정된 인증서만 인증 해줄수 있다.)

 

 

참고자료.

https://github.com/kubernetes/ingress-nginx/issues/4234

https://trac.nginx.org/nginx/ticket/1871#ticket

https://github.com/kubernetes/ingress-nginx/issues/4948

반응형

댓글