MTLS 적용

신현기·2023년 5월 22일
0

MTLS

목록 보기
1/2

MTLS란

mtls는 상호 인증 프로토콜입니다.
일반적인 tls는 서버측 인증서만 검증이 필요하지만
mtls는 클라이언트측의 인증서도 검증이 필요하게 됩니다.

TLS 핸드셰이크 과정에서 상호 인증이 완료된 경우에만 암호화 통신을 시작합니다.

위 사진은 MTLS를 위한 인증서 저장소 구조입니다.
이 글에서는 JKS 형식을 사용합니다.

클라이언트는 자신의 TrustStore에 신뢰하는 인증서를 저장해두고 서버의 인증서를 검증합니다.
검증단계에서는 자신이 신뢰하는 CA에게 발급받은 인증서인지, 유효기간은 지나지 않았는지 등 여러 항목을 검사합니다.
KeyStore에는 핸드셰이크에서 사용할 자신의 개인키와 인증서를 보관합니다.

서버 또한 KeyStore에는 자신의 개인키와 인증서, TrustStore에는 신뢰하는 인증서를 저장해둡니다.

위 과정을 위한 인증서를 만들어보겠습니다.


루트 인증서 발급

이 포스팅에서 루트 인증서는 저의 자체발급 인증서를 사용합니다.

우선 루트 인증서를 만들기 위해 개인키를 발급받습니다.

openssl genrsa -aes256 -out [개인키 파일명].key 2048

위 개인키를 이용해 csr(인증서 발급 요청)을 만들어야 합니다.

인증서에 v3 extension을 적용하기 위해 openssl 설정파일을 새로 만들어주었습니다.

[ req ] 
default_bits = 2048 
default_md = sha1 
default_keyfile = <루트 개인키 파일>.key 
distinguished_name = req_distinguished_name 
extensions = v3_ca 
req_extensions = v3_ca 

[ v3_ca ] 
basicConstraints = critical, CA:TRUE, pathlen:0 
subjectKeyIdentifier = hash
keyUsage = keyCertSign, cRLSign 
nsCertType = sslCA, emailCA, objCA 
[req_distinguished_name ] 
countryName = Country Name (2 letter code) 
countryName_default = KR 
countryName_min = 2 
countryName_max = 2 
# 회사명 입력 
organizationName = Organization Name (eg, company) 
organizationName_default = <조직명> 

# SSL 서비스할 domain 명 입력 
commonName = Common Name (eg, your name or your server's hostname) commonName_default = <CN 기본값>
commonName_max = 64

위 설정파일을 적용해 csr을 생성합니다.

openssl req -new -key [Root private key 파일].key -out [csr 파일명].csr -config [openssl config 파일명].conf

생성이 완료되었다면 이제 10년짜리 인증서를 발급받습니다.

openssl x509 -req -days 3650 \ 
-extensions v3_ca \ 
-set_serial 1 \ 
-in [csr 파일명].csr \ 
-signkey [루트 개인키].key \ 
-out [루트 인증서 파일명].crt \ 
-extfile [openssl config 파일].conf

인증서가 제대로 되었는지 확인해보려면 다음 명령어를 사용하면 됩니다.

openssl x509 -text -in [루트 인증서 파일명].crt

도메인 인증서 발급

이제 발급한 루트인증서를 CA로 두는 도메인 인증서를 발급합니다.

루트인증서와 다른 부분은 자체발급이 아닌 위에 CA가 존재한다는 것입니다.

개인키 발급

openssl genrsa -aes256 -out [개인키 파일명].key 2048

개인키 비밀번호 제거

키에 암호가 걸려있으면 웹 서버 구동때마다 비밀번호를 입력해야 하므로 암호를 제거해야 합니다.

openssl rsa -in [개인키 파일명] -out [추출 파일명].key

openssl 설정파일 생성

[ req ] 
default_bits = 2048 
default_md = sha1 
default_keyfile = lesstif-rootca.key 
distinguished_name = req_distinguished_name 
extensions = v3_user 

[ v3_user ] 
# Extensions to add to a certificate request 
basicConstraints = CA:FALSE 
authorityKeyIdentifier = keyid,issuer 
subjectKeyIdentifier = hash 
keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
## SSL 용 확장키 필드 
extendedKeyUsage = serverAuth,clientAuth 
subjectAltName = @alt_names 

[ alt_names] 
## Subject AltName의 DNSName field에 SSL Host 의 도메인 이름을 적어준다. 
DNS.1 = <도메인>

[req_distinguished_name ] 
countryName = Country Name (2 letter code) 
countryName_default = KR 
countryName_min = 2 
countryName_max = 2 
# 회사명 입력 
organizationName = Organization Name (eg, company) 
organizationName_default = <조직명>
# 부서 입력
organizationalUnitName = Organizational Unit Name (eg, section) 
organizationalUnitName_default = <부서명>
# SSL 서비스할 domain 명 입력
commonName = Common Name (eg, your name or your server's hostname) 
commonName_default = <CN 기본값>
commonName_max = 64

csr 생성

openssl req -new -key [비밀번호가 없는 개인키 파일].key -out [추출 csr 파일명].csr -config [openssl config 파일명].conf

인증서 발급

openssl x509 -req -days 1825 -extensions v3_user -in [csr 파일].csr \ 
-CA [Root 인증서].crt -CAcreateserial \ 
-CAkey [Root 개인키].key \ 
-out [추출 파일명].crt -extfile [openssl config 파일].conf

이제 발급받은 인증서를 이용해 KeyStore를 만들어줍니다.

우선 도메인인증서부터 루트인증서까지 한 번들로 만들어줍니다.

cat [도메인 인증서] [체인 인증서] [루트 인증서]  > [추출 파일명].crt

PKCS12 파일을 생성합니다.

openssl pkcs12 -export -in [인증서].crt -inkey [개인키].key -out [추출 파일명].p12 -name "some alias"

JKS 파일을 생성합니다.

keytool -importkeystore -deststorepass [비밀번호] -destkeypass [비밀번호] -destkeystore [추출 파일명].jks -srckeystore [PKCS12 파일].p12 -srcstoretype PKCS12 -srcstorepass [비밀번호] -alias “some alias”

서버의 도메인 인증서는 만들어졌습니다.
이제 클라이언트가 서버 인증서를 신뢰하도록 해야합니다.

클라이언트의 TrustStore가 이미 존재한다면 만들어둔 루트인증서를 import하고,
존재하지 않는다면 새로 만들어줘야 합니다.

저는 새로 만들어줄 필요가 있었습니다.

우선 JKS 파일을 만듭니다.

keytool -genkeypair -keystore [추출 파일명] -storetype jks

이 파일에 루트인증서를 넣어주면 작업이 끝납니다.

keytool -import -alias “some alias” -keystore [JKS 파일].jks -file [Root 인증서].crt

이제 모든 작업이 완료되었습니다.
인증서가 잘 등록되었는지 테스트를 해봐야 합니다.
테스트 과정은 다음 포스팅에 담도록 하겠습니다.


참고
https://www.lesstif.com/system-admin/openssl-root-ca-ssl-6979614.html
https://xaida.tistory.com/42
https://www.sslcert.co.kr/guides/kb/54
https://www.sslcert.co.kr/guides/SSL-Certificate-Convert-Format
https://www.lesstif.com/java/java-keytool-keystore-20775436.html

profile
구르는거 좋아하는 개발자

0개의 댓글