본문 바로가기
ETC/Tech.

[OpenSSL] SSL/TLS 인증서 발급받기

by 허도치 2020. 2. 17.
0. 서론

 FTP서버 만들기 포스트에서 FTP서버에 접속할 때, 사용자를 인증하고 접속하는 방법에 대해서 알아보았다. 각 사용자마다 접근 권한과 폴더를 지정하는 방법으로 행동에 제한을 둠으로써 보안을 강화할 수 있다. 하지만, 파일을 업로드, 다운로드하는 중간에 해커가 패킷을 가로채갈 경우 파일이 유출될 수 있다. 그래서 SSL/TLS를 적용한 FTPS를 만들기위한 SSL/TLS 인증서를 발급받는 방법에 대해서 알아보도록 하겠다.

 

 

 

1. SSL/TLS
1-1. SSL(Secure Sockets Layer, 보안 소켓 계층)이란?

- 서버와 클라이언트 사이에 교환되는 데이터를 암호화하여 보안을 유지하는 표준 기술.
- 해커가 전송되는 정보를 열람하거나 훔치는 것을 방지.
- Chrome 브라우저에서는 SSL인증서가 없는 사이트는 '안전하지 않음'이라는 알림을 표시.
- SSL 3.0 이후 지원이 중단되었음.
- 개인키(Private Key)와 공개키(Public Key)의 대칭키 기반.
  * 공개키로 암호화된 데이터는 개인키로만 복호화할 수 있음.
- HTTPS가 SSL/TLS를 사용하는 대표적인 예.
  * Chrome 브라우저에서는 주소창 옆에 자물쇠 표시가 뜨는데 이를 클릭하면 인증서 정보를 확인할 수 있음.

[ Chrome 브라우저 HTTPS 인증서 확인 ]
[ Tistory의 SSL/TLS 인증서  ]

 

1-2. TLS(Transport Sockets Layer, 전송 소켓 계층)이란?

- 1999년에 SSL 3.0의 업그레이드 버전으로 TLS 1.0이 공개되었음.
- 이후 SSL에서 TLS로 명칭이 변경되었으나, SSL이라는 명칭이 아직까지 보편적으로 사용되고 있어서 TLS/SSL을 혼용하여 사용함.

 

1-3. SSL 인증서 발급 절차

1) 사이트에서 개인키(Private Key)를 생성.
2) 사이트의 정보가 담긴 인증 서명 요청서(CSR)를 작성.
3) CSR을 인증기관(CA)로 전송하여 인증서(CRT) 발급을 요청.
4) 해당 인증기관에서는 신청서의 내용을 토대로 사이트를 검증.
5) 사이트의 정보와 공개키가 담긴 인증서를 인증기관의 비공개키로 암호화하여 발급.

 

1-4. SSL 인증 절차

1) 사용자가 브라우저를 통해 서버에 접속하면, 서버에서 인증서를 사용자에게 제공.
2) 브라우저는 인증서를 발급한 인증기관이 브라우저에서 제공하는 인증기관 목록에 있는지 확인.
3) 인증기관의 공개키를 이용해서 인증서를 복호화.
4) 복호화에 성공하는 것으로 인증완료.

 

 

 

2. OpenSSL
2-1. OpenSSL이란?

- 네트워크를 통한 데이터 통신에 쓰이는 프로토콜인 TLS와 SSL의 오픈 소스 라이브러리.
- 간단한 명령어들을 제공하며 셀프 인증서를 발급할 때 사용됨.

 

2-2. OpenSSL 다운로드

- https://code.google.com/archive/p/openssl-for-windows/downloads
- 다운로드 후 압축해제

[ 디렉토리 구조 ]

- [ bin/openssl.exe ]
  : 실행파일.
  : 'PATH' 환경변수에 이 파일의 위치를 등록해두면 편하게 사용할 수 있음.

- [ openssl.cnf ]
  : 환경 설정 파일.

 

2-3. 환경변수 설정

rem 명령프롬프트를 '관리자 권한'으로 실행

rem 홈경로 설정

SET OPENSSL_HOME=<설치경로>

rem 기본 환경설정 파일 설정.
SET OPENSSL_CONF=%OPENSSL_HOME%\openssl.cnf

rem 실행파일 경로 설정
rem 명령 프롬프트에서 실행파일을 'openssl' 명령으로 실행시키기 위함.
SET PATH=%PATH%;%OPENSSL_HOME%\bin

rem 실행확인
openssl


* 이 방법은 매번 실행할 때마다 입력해야하는 일시적인 방법임.
* 자주 사용하는 프로그램이라면 시스템 설정을 통해 직접 등록해서 사용.

 

 

 

3. 인증서 발급하기
3-1. 개인키(Private Key) 생성

rem AES256으로 암호화된 2048bit 길이의 개인키 생성.
openssl genrsa -aes256 -out private.key 2048

rem 명령어를 실행하면 인증서가 생성되고 패스워드 입력하는 프롬프트가 실행됨.
Enter pass phrase for private.key: [패스워드 입력]
Verifying - Enter pass phrase for private.key: [패스워드 한번 더 입력]

 

3-2. 공개키(Public Key) 생성

rem 개인키를 통해 공개키를 생성.
openssl rsa -in private.key -pubout -out public.key

rem 개인키의 비밀번호 입력.
Enter pass phrase for private.key: [패스워드 입력]

 

3-3. 인증 서명 요청서(CSR, Cerificate Signing Request) 생성

- CSR은 인증기관(CA)을 통해 인증서를 발급 받기위한 정보를 담고 있는 신청서.
  * 국가코드, 도시, 회사명, 부서명, 이메일, 도메인 주소 등이 포함.
- 개인키를 통해 생성되면 공개키(Public Key)를 통해 생성함.
- 즉, CSR은 '내가 어느 도시에 있는 어떤 회사인데 이 키(공개키)를 가지고 인증서를 발급받고 싶다'라고 인증기관에게 인증서를 요청하는 신청서.

rem 개인키를 이용하여 CSR을 생성.
openssl req -new -key private.key -out private.csr

rem CSR에 담을 정보를 입력.( 개발용이므로 아무거나 입력해도 상관없음. )
Country Name (2 letter code) [AU]:KO
State or Province Name (full name) [Some-State]:SEOUL
Locality Name (eg, city) []:SEOUL
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DOCHI INC.
Organizational Unit Name (eg, section) []:TISTORY
Common Name (eg, YOUR name) []:HEO DOCHI
Email Address []:dnjsakf@naver.com

rem 추가 정보이므로 입력하지 않아도 무방함.
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

 

 

3-4. 자체 인증 기관(CA, Certificate Authority) 키 생성

rem AES256으로 암호화된 2048bit 길이의 CA Key 생성.
openssl genrsa -aes256 -out root.ca.key 2048

rem 명령어를 실행하면 인증서가 생성되고 패스워드 입력하는 프롬프트가 실행됨.
Enter pass phrase for private.key: [패스워드 입력]
Verifying - Enter pass phrase for private.key: [패스워드 한번 더 입력]

 

3-5. 자체 인증 기관의 CSR 생성

rem CA키를 이용하여 10년짜리 CSR을 생성.
openssl req -x509 -new -nodes -key root.ca.key -days 3650 -out root.ca.pem

rem CSR에 담을 정보를 입력.( 개발용이므로 아무거나 입력해도 상관없음. )
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:US
Locality Name (eg, city) []:SEOUL
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GOOGLE.
Organizational Unit Name (eg, section) []:DOCHI
Common Name (eg, YOUR name) []:HEO DOCHI
Email Address []:dnjsakf@naver.com

 

3-6. 자체 인증 기관을 통한 인증서(CRT, Certificate) 발급

 

rem 자체 CA통해 10년짜리 인증서(CRT)를 생성.
openssl x509 -req -in private.csr -CA root.ca.pem -CAkey root.ca.key -CAcreateserial -out private.crt -days 3650

rem CA키의 패스워드 입력.
Enter pass phrase for root.ca.key: [패스워드 입력]

 

3-7. 최종 산출물

[ 생성 파일 목록 ]
[ private.crt 상세 정보 ]

 

 

 

마치며

- 원래 pyftpdlib을 통해 FTPS를 구현하려면 인증서가 필요해서 찾아본 내용이었다. 그런데, 자료를 찾다보니 SSL/TLS가 나오고, CSR, CRT, openssl도 나오면서 생각보다 내용이 깊어졌다.
- openssl로 예제를 검색해보면 엄청 많은 예제들을 찾아볼 수 있었다. 하지만, 뭔가 한눈에 들어오는 예제가 없어서 이것저것 찾아보고 적용해보고 하느라 시간이 많이 소요되었다.
- 그래도, SSL/TLS에 대해서 궁금했었는데 어느정도 해소되어서 기분이 좋다.

댓글