관리 메뉴

가끔 보자, 하늘.

Private 웹 사이트에 SSL 도입하기 - 3/3 본문

개발 이야기/인프라 구축 및 운영

Private 웹 사이트에 SSL 도입하기 - 3/3

가온아 2020. 1. 16. 17:05

마지막으로 직접 인증서를 발급하고 이를 개인용 사이트에 적용하는 방법을 상세히 알아보겠습니다. 

 

이 테스트는 CentOS 7.x , OpenSSL, Nginx에서 실행되었습니다.

 

인증서 발급을 위한 준비

 

인증서를 발급한 기록을 위해 두 가지 파일이 필요합니다. 하나는 발급된 인증서의 정보를 기록하는 것과 serial을 기록하는 파일, 이렇게 두 개의 파일을 준비해야 합니다. 

 

touch /etc/pki/CA/index.txt
echo '00' > /etc/pki/CA/serial

추후 인증서를 발급 후 두 파일을 보면 아래와 같습니다.

V    210109061528Z    00    unknown /C=KR/ST=Seoul/O=COMPANY/OU=DEV1/CN=your_domain/emailAddress=your_email@server.com

index.txt 파일에는 언제 어떤 정보를 포함한 인증서가 발급되었는지가 기록됩니다. 

01

serial 파일에는 00 에서 01로 한 개의 인증서가 발급되었다는 것을 확인할 수 있습니다. 

 

 

이제 CA 개인키를 생성합니다.

openssl genrsa -des3 -out ca.key 1024

그리고 CA의 CSR(Certificate Signing Request)을 생성합니다. csr 파일은 공개키와 사용하는 알고리즘 정보가 포함됩니다.

openssl req -new -key ca.key -out ca.csr

이제 Root CA의 인증서를 생성합니다. 

openssl x509 -req -days 1280 -in ca.csr -signkey ca.key -out ca.crt

이제 개인키에서 패스워드를 삭제하겠습니다. 사실 패스워드가 있는게 당연하겠지만, 웹 서버 가동때마다 계속 패스워드를 물어보게 할 수 없으니 일반적으로 삭제하고 사용합니다. 일반적으로 웹 서버들은 모두 패스워드 삭제를 '강요'합니다.

openssl rsa -in ca.key -out ca_key.pem

이로서 CA로서의 준비를 끝났습니다. 이제 웹서버를 위한 준비를 하겠습니다. 

 

웹 서버 인증서 만들기

웹 서버용 개인키를 생성합니다.

openssl genrsa -des3 -out server.key 1024

웹 서버용 CSR 을 생성합니다.

openssl req -new -key server.key -out server.csr

이제 준비가 되었으니 실제 인증서를 발급해 보겠습니다. 이 글은 개인용 인증서를 생성하고 적용하는 내용을 정리한 글입니다. 공인된 CA에 인증서 생성 요청은 필요하다면 추후 별도로 정리해 보겠습니다. (이미 수많은 글들이 있으니 쉽게 구글링으로 확인하실 수 있습니다.)

 

준비된 CA로 인증서를 제작합니다.

openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 365

웹 서버에 설정하기 위해 웹 서버용 개인키에서 패스워드를 삭제합니다. (안그러면 웹 서버 실행때마다 물어봅니다.)

openssl rsa -in server.key -out server_key.pem

Diffie-Hellman 키 생성하기 

(* Logjam 취약점이 이전에 발표되었으며, 이로 인해 1024bit는 안전하지 않습니다. 꼭 2048 이상으로 사용하시기 바랍니다. 상세 내용은 구글링으로... ^^a)

openssl dhparam -out dhparam.pem2048

 

이제 위에서 생성한 파일들을 /etc/nginx/ssl 폴더를 만들어 넣어두고 아래와 같이 상위 폴더의 보안 설정에 맞춰줍니다.

restorecon -v -R /etc/nginx

 

웹 서버 (NGINX ) 설정하기 

 

nginx 의 설정을 별도로 수정하지 않았다면 /etc/nginx/default.conf 파일을 수정하면 됩니다.

 

# 기존 http도 https로 리디렉션 되도록 설정.
server {	
	listen      80;
	listen      [::]:80;
	server_name your_domain; # ip 일때는 굳이 쓸 필요가 없다.

# 301 moved permanently 응답과 합께 모든 http 요청을 https로 리디렉션한다.
	location / {
		return 301 https://your_domain:443$request_uri;
	}
}

server {
	listen       443 ssl http2 default_server;
	listen      [::]:443 ssl http2 default_server;
	server_name  your_domain; # ip 일때는 굳이 쓸 필요가 없다.

	ssl_certificate /etc/nginx/ssl/ca.crt;
	ssl_certificate_key /etc/nginx/ssl/ca_key.pem;
	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:50m;
	ssl_session_tickets off;

	ssl_dhparam /etc/nginx/ssl/dhparam.pem;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	# Cipher Suites 에 대해서는 이 링크(https://rsec.kr/?p=455)를 참고하세요. 너무 잘 설명해 두셔서 감동이었습니다. -o-b
	ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
	ssl_ecdh_curve secp384r1;

	ssl_prefer_server_ciphers on;
	ssl_stapling off;	# for self-signed cert
	ssl_stapling_verify off; # for self-signed cert

	location ~ /\.ht {
		deny all;
	}
	.
	.
	.

 만약 443이 아닌 다른 임의의 포트를 사용한다면 semanage에 추가해야 합니다. (selinux를 사용하지 않는 상태라면 통과입니다.)

semanage port -a -t http_port_t -p tcp 4430  # 포트 추가하기
semanage port -l | grep http_port_t # 포트 적용되었는지 확인

firewall-cmd --permanent --zone=public --add-port=4430/tcp # firewall에 4430포트 오픈
firewall-cmd --reload # 변경 사항 적용하기

이제 웹서버를 재실행 해보시기 바랍니다. http로 접속하시면 바로 https로 포워딩 되는지도 잘 확인해보시고요.

 

도움이 되셨으면 합니다.

 

모두 새해 복 많이 받으시고 멋진 2020년 되시기 바랍니다.

 

이만  ~~ !

반응형