Developer Sang Guy

[Apache] 서버 MTLS(상호 인증) 적용 (서버) 본문

Others

[Apache] 서버 MTLS(상호 인증) 적용 (서버)

은크 2024. 2. 8. 12:55

쇼피파이 앱 스토어 결제 앱 개발 작업을 진행하면서 서버 측  MTLS(상호 인증) 환경을 구성하게 되었다.

 

내가 작업한 서버 환경은 WEB - WAS 분리 구조였으며 WEB에서 요청 최초 수신하고 특정 확장자 또는 URI Path만 WAS 로 전달하여 처리하도록 했다.

 

당시 사용한 미들웨어는 WEB 서버 - Apache 2.4.53, WAS 서버 - Wildfly 26 이였다.

Client(쇼피파이)와 MTLS를 하기 위해 우리 측 WEB 서버 구성에 변경이 필요했다.

일단 최종적으로 작성된 설정 파일은 아래와 같다.

 

Apache 2.4.53 인증서 설정 파일(httpd-ssl.conf)

<VirtualHost *:443>
	.
	.
	.
	
#	특정 End Point 적용 필요할 경우 아래와 LocationMatch 지시어를 통하여 적용 가능하다. 	
#	모든 Endpoint에 적용 필요할 경우엔 그냥 SSLVerifyClient, SSLVerifyDepth만 설정하면 된다.
	<LocationMatch "(^/payment$|^/refund$)">
		SSLVerifyClient require
		SSLVerifyDepth 10
	</LocationMatch>
	
	
#	인증서 경로는 각 서버 환경마다 다름
	SSLCertificateFile          /app/apache/conf/ssl/server.pem (서버 인증서 파일)
	SSLCertificateKeyFile       /app/apache/conf/ssl/server_key.pem (서버 개인 키 파일)
	SSLCertificateChainFile     /app/apache/conf/ssl/server_ca_bundle.crt (서버 인증서 묶음)
	SSLCACertificateFile        /app/apache/conf/ssl/client_ca_bundle.crt (클라이언트 인증서 묶음)
	
	.
	.
	.
</VirtualHost>

 

Apache 2.4.53의 경우 SSLCertificateChainFile을 사용하여 서버 인증서 묶음과 클라이언트 인증서 묶음을 분리하였지만

Apache 2.4.8 부터는 SSLCertificateChainFile 지시어가 deprecated되어 사용할 수 없다.

 

하여 Apache 2.4.8 부터는 서버 인증서 묶음과 클라이언트 인증서 묶음을 하나의 bundle 파일에 구성하여 경로를 설정해야 한다.

 

Apache 2.4.8 이상 인증서 설정 파일(httpd-ssl.conf)

<VirtualHost *:443>
	.
	.
	.
	
#	특정 End Point 적용 필요할 경우 아래와 LocationMatch 지시어를 통하여 적용 가능하다. 	
#	모든 Endpoint에 적용 필요할 경우엔 그냥 SSLVerifyClient, SSLVerifyDepth만 설정하면 된다.
	<LocationMatch "(^/payment$|^/refund$)">
		SSLVerifyClient require
		SSLVerifyDepth 10
	</LocationMatch>
	
	
#	인증서 경로는 각 서버 환경마다 다름
	SSLCertificateFile          /app/apache/conf/ssl/server.pem (서버 인증서 파일)
	SSLCertificateKeyFile       /app/apache/conf/ssl/server_key.pem (서버 개인 키 파일)
	SSLCACertificateFile        /app/apache/conf/ssl/ca_bundle.crt (서버, 클라이언트 인증서 묶음)
	
	.
	.
	.
</VirtualHost>

 

ca_bundle 파일 내부

-----BEGIN CERTIFICATE-----
(서버의 CA 루트 인증서의 Base64로 인코딩된 데이터)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(서버의 중간 인증서의 Base64로 인코딩된 데이터)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(클라이언트의 CA 중간 인증서의 Base64로 인코딩된 데이터)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(클라이언트의 CA 루트 인증서의 Base64로 인코딩된 데이터)
-----END CERTIFICATE-----

 

중간 인증서 없으면 그냥 루트 인증서만 기재하면 되며 인증서 체인이 올바르다면 루트, 중간 인증서 기재 순서는 중요하지 않은 것 같다.

 

지시어 정리

지시어 설명
SSLVerifyClient 클라이언트 인증서 확인 수준 설정

none : 인증 안함
optional : 클라이언트가 인증서를 제공하면  하는데 없어도 연결 허용
require: 반드시 올바른 인증서를 제공 
optional_no_ca : 클라이언트가 인증서를 제공해도 CA 인증서로 검증하지 않음
SSLVerifyDepth 클라이언트가 제공한 인증 체인에서 검증에 사용할 최대 인증서 수

" 2 " : 루트 인증서, 중간 인증서 검증
" 3 " : 루트 인증서, 중간 인증서, 클라이언트 인증서 검증

위 예시에서는 루트, 중간만 있어 " 2 "로 설정해도 됨

잘 모르겠으면 10으로 해도 되긴되는데 올바른 값보다는 성능이 좋지 않을 수 있음
SSLCertificateFile 서버 인증서 파일
SSLCertificateKeyFile 서버 개인 키 파일
SSLCertificateChainFile 서버 CA 루트 인증서, CA 중간 인증서 묶음 파일 설정
Apache 2.4.8 이상부터 지원하지 않음
SSLCACertificateFile 클라이언트 CA 루트 인증서, CA 중간 인증서 묶음 파일 설정

 

 

Comments