Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- HandlerMethodArgumentResolver
- try - with - resources
- WildFly
- tomcat jndi
- graphql
- Java Rest
- Java Singleton
- AfterMapping
- 이중정렬
- 개방 폐쇄 원칙
- Tomcat DBCP
- mapstruct
- Open Close Principal
- Java Graphql
- Srping MVC
- Request Body 여러 번 사용
- Checked Exception
- 상호 인증
- Sub Bytes
- 데이터 압축
- Unchecked Exception
- Socket is closed
- Jndi DataSource
- 바이트 절삭
- java
- Reading HttpServletRequest Multiple Times
- mTLS
- Graphql Client
- NoUniqueBeanDefinitionException
- requestheaderdto
Archives
- Today
- Total
Developer Sang Guy
[Apache] 서버 MTLS(상호 인증) 적용 (서버) 본문
쇼피파이 앱 스토어 결제 앱 개발 작업을 진행하면서 서버 측 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 중간 인증서 묶음 파일 설정 |
'Others' 카테고리의 다른 글
프로젝트 패키지 구조 (0) | 2024.02.20 |
---|---|
[ELK] 키바나 서버 내 설치 후 외부 접근 (0) | 2024.01.04 |
[Tomcat] 여러 애플리케이션 실행 시 Tomcat jndi Datasource 이슈(Tomcat DBCP) (1) | 2023.12.08 |
[리눅스 Java] jstat를 활용한GC 모니터링 (0) | 2023.06.16 |
[Wildfly] 로그가 안나와요(sl4j 충돌) (0) | 2023.03.30 |
Comments