[Nginx] http → https 리다이렉션 및 SSL 인증서 적용 (Nginx ver.1.20.1 기준)
CSR을 만들고 SSL 인증서 파일을 발급 받는 과정은 무사히 마쳤다고 생각하고 생략하기로 한다.
필자는 기관에 요청하여 받은 인증서 파일이 base64 방식으로 인코딩된 .p7b 파일과 DER 방식으로 인코딩된 .cer 파일로 2개였다.
둘 중에 하나로 원하는 걸 사용하면 되고, 두 인증서 포맷은 다음과 같은 특징이 있으므로, 참고하면 된다.
또한, 다양한 인증서 관련 파일 포맷에 대한 설명이 아래 링크에 있으니, 확인하면 되겠다.
- .p7b 확장자
- PKCS#7 포맷
- [‘서버 인증서’ + ‘Root 인증서’ + ‘Chain 인증서’] 를 모두 담을 수 있어, SSL 인증서 적용 또는 이전 시에 상당히 유용하고 편리
- Windows 에서는 자동 인식, 일부 서버에서는 p7b 포맷으로만 인증서 설정이 되는 경우도 있다.
- 인증서 내 private key 는 포함 X. key 파일에 대한 설정(nginx 에서는 ‘ssl_certificate_key’ 구문)은 별도의 키 파일로 잡아주어야 한다.
- .cer 확장자
- Windows 에서는 기본 인식되는 확장자
- 대부분 PEM 포맷이나, Binary 포맷일 때도 있음
- 주로 Windows 기반에서 인증서 파일임을 구분하기 위해서 사용되는 확장자
- .crt 확장자와 거의 동일한 의미
SSL 인증서 파일 포맷 종류 - crt, cer, csr, pem, der, pfx, p12, p7b, jks, key - SecureSign
인증서 파일 확장자를 .p7b → .pem 변환
대부분의 글들이 .pem 확장자 기준으로 설명하므로, 나도 혼란을 방지하기 위해 .p7b → .pem 변환 먼저 수행하겠다. .p7b 확장자와 .pem 확장자는 변환 시 100% 호환된다고 생각해도 무방할 듯 하다.
아래 명령어를 수행하여 확장자를 .pem 으로 변환하자!
openssl pkcs7 -in [발급받은 .p7b 인증서] -out [.pem으로 만들 파일 이름.pem] -print_certs -text
# ex) openssl pkcs7 -in Issued_Cert.p7b -out Integrated_Cert.pem -print_certs -text
SSL 인증서(.pem 확장자 기준) 적용하기
이제 변환된 .pem 파일과 CSR 발급 시 사용한 key 파일을 SSL 인증 옵션 구문에 함께 넣어주면 된다.
필자는 특정 사이트에 대한 server 옵션들을 모아둔 파일인 sites-available/{사이트명} 파일에 아래 구문을 넣었다.
server {
listen 443 ssl;
server_name Example.co.kr;
ssl_certificate [변환한 Cert 파일명.pem 파일 경로];
ssl_certificate_key [decrypted 키 파일명.key 파일 경로];
ssl_session_timeout 5m;
# SSL 취약성 제거 위한 설정
ssl_protocols SSLv3 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
include proxy_params;
# 동일 host 내의 gunicorn 서버로 request 전달하기 위함
proxy_pass <http://unix>:{gunicorn의 unix .sock 파일 경로};
}
}
위 구문을 추가한 nginx site 설정 파일명을 ‘test_ssl’ 이라고 가정하면,
아래 명령어를 수행하여 sites-available/test_ssl 사이트 설정 파일을 sties-enabled/PRD 파일로 심볼릭 링크를 걸고, nginx 를 재기동하여 사이트 설정을 load하여 테스트 해보자.
# test_ssl -> PRD 심볼릭 링크
ln -s /etc/nginx/sites-available/test_ssl /etc/nginx/sites-enabled/PRD
# nginx 관련 파일 syntax 검사
nginx -t
# nginx 새로운 설정 적용 방법1 - 설정파일만 reload
nginx -s reload
# nginx 새로운 설정 적용 방법2 - nginx 재기동
systemctl restart nginx
http://{Domain Name}:443/ 으로 접속했을 때, 이상 없이 해당 웹 사이트 접속이 된다면, SSL 인증서 설정이 문제 없이 적용 된 것이다.
만약 뭔가 문제가 생겼다면, ‘PRD’ 심볼릭 링크를 제거하고, 기존의 site 설정 파일인 ‘test_old’ 파일로 다시 심볼릭 링크를 걸고, nginx 설정 파일을 리로드하여 롤백하면 된다.
# 새롭게 적용한 site 설정 파일인 'PRD' 심볼릭 링크 제거
rm /etc/sites-enabled/PRD
# 기존에 사용하던 site 설정 파일인 'test_old' 심볼릭 링크 걸기
ln -s /etc/sites-available/test_old /etc/sites-enabled/PRD
# nginx 설정 파일 리로드
nginx -s reload
http → https 리다이렉션 설정하기
SSL을 적용하였으니, 기존의 사이트 설정에 있는 LISTEN 80 블록은 아래와 같이 변경해주어야 한다.
필자의 경우, 아래와 같이 servername {ip} 인 블럭과 servername {domain name} 인 블럭 두 개를 설정하여,
IP와 80 포트로 접속하는 경우, domain name과 80포트로 접속하는 경우 모두를 https://{domain-name} 으로 리다이렉션 하도록 설정하였다.
참고로, [::] 은,
# {IP}:80, {domain name}:80, www.{domain name}:80 으로 접속하는 경우 리다이렉션 설정
server {
listen 80;
server_name Example.co.kr www.Example.co.kr 10.123.123.123;
return 301 https://Example.co.kr$request_uri;
}
위 설정을 한 후, 다시 심볼릭 링크 및 nginx 설정 reload를 한 후에, http://{IP}, http://Example.co.kr 로 접속해서 https://Example.co.kr 로 리다이렉션이 잘 되는 지 확인해보면 된다!
참고
https://velog.io/@coastby/Nginx-SSL-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0
https://www.comodossl.co.kr/Certificate/ssl-installation-guides/Nginx.aspx