Openssl 기반 인증서 정리

Security 2018. 9. 18. 10:53

1. 목적

Server와 Client간의 HTTPS(TLS)통신을 위해서는 인증서가 필요하다. Client단에서 Server를 인증하기 위해서는 Server단에서 Client단으로 인증서를 내려주고, 그 인증서를 공인 CA 인증서로 확인을 해야 한다. 이 과정에서 공인 CA의 경우에는 비용 지불이 필요하다. 여기서는 비용이 들지 않는 CA를 직접 만들어서 사용하는 것을 정리한다. 이 CA를 Self-Signed CA라고 보통 말한다.

공인 인증서는 각 인증서를 검증하는 단계가 존재하고 이 구조는 보통 Tree 구조로 형성된다. 이 단계에서 최상위 단계를 Root CA라고 한다. 여기서 만드는 Self-Signed CA는 어차피 내가 만들어서 사용함으로 이 인증서 자체가 최상위 단계에 있는 것과 동일함으로 최종적으로 Self-Signed Root CA가 되는 것이다.


2. 인증서 발행 절차

인증서 발행 절차를 단계별로 정리한다.

2.1. 개인키 생성

Server와 Client는 이 단계를 동일하게 수행한다.

[ RSA기반 개인키 생성 ]


[ RSA기반 개인키 생성 (nodejs) ]

상세 옵션은 링크 참조 : https://www.openssl.org/docs/man1.0.2/apps/genrsa.html


2.2. CSR 생성

인증기관으로부터 공식적인 인증서를 받기 위한 신청서를 생성하는 단계로 신청서 양식이 CSR(Certificate Signing Request)라고 이해하기로 함. 신청자를 구분하고자 몇가지 정보를 입력해야 함.


[ CSR 생성 (command line 명령어) ]

  • -config 옵션을 주지 않으면 default configuration file을 사용한다.
  • -subj 옵션을 주지 않으면 CSR 생성시 필요한 각 항목에 대해서 사용자 입력을 요구한다.
  • -key 옵션은 여기서는 2.1.절에서 생성한 개인키를 입력한다.

[ local openssl.cnf ]

openssl req 단계에서는 openssl.cnf 파일에서 [req] section을 참조한다.


[ CSR 생성 (nodejs 코드) ]

상세 옵션은 링크 참조 : https://www.openssl.org/docs/man1.0.2/apps/req.html


2.3. CA(Certification Authority) 통하지 않고 인증서 만들기

일반적인 인증서 발급 절차는 2.2.까지 CSR를  생성하고 CA에 CSR를 보내서 CA가 인증한 인증서를 취득한다.

위는 우리가 개발자라서 관심이 있지만 일반인은 그냥 인증서 발급 기관에서 간단한 개인정보만 입력하고 발급 받는 것이 일반적이지 않을까 생각이 든다.

아래에서 설명할 내용은 이미 네 서버에 CA가 존재하고 이 CA로 내 인증서를 Signing하는 방법에 대해서 알아본다. 왜 이런 것이 필요할까? 공식 인증기관은 돈이 들고, 또 이런 것까지 필요없는 단순 TLS(SSL) 구현부에서

자체 Client/Server 통신을 위해서 필요하다해서 관심을 갖는다.


[ CA로 Signing 된 인증서 생성 (command line 명령어) ]


[ CA로 Signing 된 인증서  생성 (nodejs 코드) ]


[ local openssl.cnf ]

openssl ca 단계에서는 openssl.cnf 파일에서 [ca] section을 참조한다.

네가 가지고 있는 CA로 Signing한 인증서를 만드는 가장 핵심은 openssl.cnf를 들어다봐야 이해할 수 있다.

현재까지 생성한 개인키와 CSR를 어디선가 받거나 자체 생성한 CA로 Signging하도록 지시하는 부분은 openssl.cnf 파일에 설정되어 있다. 

내 인증서를 CA로 인증할 Root CA의 private_key, certificate의 위치를 openssl.cnf에 기술되어 있다.

이를 기반으로 CA를 적용하여 내 인증서를 Signing한다.

만약 configuration 파일에 해당 항목이 지정되어 있지 않다면 아래 항목에 기술한다.

  • -cert : CA certification 위치 지정
  • -keyfile : CA private key 위치 지정

사실 위 옵션은 command line에서 해 보지는 않았지만 맞을 것이다.

상세 옵션은 링크 참조 : https://www.openssl.org/docs/man1.0.2/apps/ca.html


3. Self Signed Certification Authority (SSCA)

2.단계에서 CA 인증서를 사용하여 내 인증서를 Signing했다. 그렇다면 자체 CA는 어떻게 만들 것인가?

외부에서 받을 수도 있지만 여기서는 공식 인증기관이 아닌 자체적으로 Root CA를 만드는 과정에 대해서 설명한다.


그 절차는 2.단계에서 보았던 것과 동일하다. 일단 개인키를 만들고, 그 다음 CSR까지 동일하게 만든다.

마지막 CA 단계에서 x509 옵션을 사용한다.


[ SSCA 인증서 만들기 ]


[ -extensions v3_ca openssl.cnf ]

위의 command line 명령어에서 -extensions v3_ca 추가 시에 openssl.cnf에 위의 section이 존재하지 않으면 실패한다.
x509 version 3 이상을 지원하기 위함
상세 옵션은 링크 참조 : https://www.openssl.org/docs/man1.0.2/apps/x509.html


4. 인증서 확인 방법

인증서는 기본적으로 base64 encoding 되어 있어서 내용을 확인하기 위해서는 openssl x509 명령어를 사용한다.


[ x509 명령어 ]


openssl x509 명령어를 통해서 인증서 내용확인, 변환, Self Signed CA 생성등의 일을 할 수 있다.

'Security' 카테고리의 다른 글

TLS(v1.2) - RFC5246 정리 (1)  (0) 2019.06.28
OAuth2.0 - RFC6749 정리 (2)  (0) 2019.06.27
OAuth2.0 - RFC6749 정리 (1)  (0) 2019.06.26
openssl 대칭키 기반 암복호화  (0) 2018.12.24
TLS(SSL) 통신 (nodejs server and python client)  (0) 2018.09.27
: