금융분야 마이데이터 및 오픈뱅킹 정보제공자의 mTLS 적용을 위한 웹서버(apache, nginx) 설정 및 테스트 튜토리얼
- mTLS 개요 (링크로 갈음?)
- 샘플 웹서버 설정 (Apache, Nginx + Flask)
- 서버 SSL 인증서 설정 (Let's encrypt)
- 웹서버 mTLS 설정 (Apache, Nginx)
- 테스트 방법 (curl 명령어)
- 오픈뱅킹 정보제공자 mTLS 설명 (DigiCert 등)
클라이언트 인증서를 검증할 때 사용할 (self-signed) CA 인증서를 2개 생성한다.
openssl req -newkey rsa:2048 -nodes -keyform PEM -keyout valid-ca.key -x509 -days 365 \
-outform PEM -out valid-ca.crt
# 실행 결과
# ...전략 (Country Name ~ Email Address의 값은 자유롭게 입력)
Country Name (2 letter code) []:KR
State or Province Name (full name) []:
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) []:KFTC
Organizational Unit Name (eg, section) []:Dev
Common Name (eg, fully qualified host name) []:kftc.io
Email Address []:dy.ryu@kftc.or.kr
현재 디렉토리에 valid-ca.crt
파일과 valid-ca.key
두 개의 파일이 생성된다.
이중 valid-ca.crt
파일은 웹서버에 업로드한다.
위와 동일한 방법으로 유효하지 않은 CA 인증서도 한 개 생성한다. (웹서버 업로드 X)
openssl req -newkey rsa:2048 -nodes -keyform PEM -keyout invalid-ca.key -x509 -days 365 \
-outform PEM -out invalid-ca.crt
아래와 같이 총 3개의 인증서를 발급한다.
원래 SerialNumber는 Subject DN 안에 기술되어 있으나, 여기에서는 편의상 OU(Organizational Unit Name)에 기재한다.
우선 공통으로 사용할 개인키 파일을 생성한다.
openssl genrsa -out pass.key 2048
# 실행 결과
Generating RSA private key, 2048 bit long modulus
..................+++
................................................................................
............................................................................+++
e is 65537 (0x10001)
현재 디렉토리에 pass.key
파일이 생성된다.
CSR(Certificate Signing Request) 파일을 생성한다.
openssl req -new -key pass.key -out valid-cli.csr
# 실행 결과
# ...전략 (OU를 제외한 Country Name ~ Email Address의 값은 자유롭게 입력)
# OU에는 중계기관(정보제공자(서버) 입장에서의 클라이언트)에서 제공한 SerialNumber를 입력 (123456789라 가정)
Country Name (2 letter code) []:KR
State or Province Name (full name) []:
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) []:KFTC
Organizational Unit Name (eg, section) []:SerialNumber 123456789
Common Name (eg, fully qualified host name) []:mtls.kftc.io
Email Address []:dy.ryu@kftc.or.kr
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
Challenge password는 편의상 생략한다. (값 입력 없이 엔터키를 치면 비밀번호가 없는 CSR 파일이 생성된다.)
유효한 CA 인증서(valid-ca.crt
, valid-ca.key
)로 CSR 파일(valid-cli.csr
)을 서명한다.
openssl x509 -req -in valid-cli.csr -CA valid-ca.crt -CAkey valid-ca.key -set_serial 1234 \
-days 365 -outform PEM -out valid-cli.crt
# 실행 결과
Signature ok
subject=/C=KR/L=Seoul/O=KFTC/OU=SerialNumber 123456789/CN=mtls.kftc.io/emailAddress=dy.ryu@kftc.or.kr
Getting CA Private Key
set_serial은 인증서의 일련번호를 설정하는 것으로 아무 값이나 입력해도 된다.
mTLS 검증 시 인증서 자체의 일련번호가 아니라, Subject DN 안에 있는 일련번호를 검증한다.
현재 디렉토리에 정상 인증서인 valid-cli.crt
파일이 생성된다.
SerialNumber를 다르게하여 CSR 파일을 생성한다.
openssl req -new -key pass.key -out invalid-sn-cli.csr
# 실행 결과
# ...전략 (OU를 제외한 Country Name ~ Email Address의 값은 자유롭게 입력)
# OU에 올바르지 않은 SerialNumber를 입력한다.
Country Name (2 letter code) []:KR
State or Province Name (full name) []:
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) []:KFTC
Organizational Unit Name (eg, section) []:SerialNumber 987654321
Common Name (eg, fully qualified host name) []:mtls.kftc.io
Email Address []:dy.ryu@kftc.or.kr
# ...후략
유효한 CA 인증서(valid-ca.crt
, valid-ca.key
)로 CSR 파일(invalid-sn-cli.csr
)을 서명한다.
openssl x509 -req -in invalid-sn-cli.csr -CA valid-ca.crt -CAkey valid-ca.key -set_serial 1234 \
-days 365 -outform PEM -out invalid-sn-cli.crt
# 실행 결과
Signature ok
subject=/C=KR/L=Seoul/O=KFTC/OU=SerialNumber 987654321/CN=mtls.kftc.io/emailAddress=dy.ryu@kftc.or.kr
Getting CA Private Key
현재 디렉토리에 CA는 정상이나 SerialNumber가 비정상인 invalid-sn-cli.crt
파일이 생성된다.
유효하지 않은 CA 인증서(invalid-ca.crt
, invalid-ca.key
)로 정상 인증서의 CSR 파일(valid-cli.csr
)을 다시 서명한다.
openssl x509 -req -in invalid-ca-cli.csr -CA invalid-ca.crt -CAkey invalid-ca.key -set_serial 1234 \
-days 365 -outform PEM -out invalid-ca-cli.crt
# 실행 결과
Signature ok
subject=/C=KR/L=Seoul/O=KFTC/OU=SerialNumber 123456789/CN=mtls.kftc.io/emailAddress=dy.ryu@kftc.or.kr
Getting CA Private Key
현재 디렉토리에 SerialNumber는 정상이나 CA가 비정상인 invalid-ca-cli.crt
파일이 생성된다.
Ubuntu 18.04, AWS Lightsail
- TBA
- Self-signed CA 인증서 생성
- 클라이언트 인증서 발급
- DigiCert Root 인증서 다운로드
- smallstep nginx mTLS 설정
- Apache SSL module doc
- Nginx SSL module doc