nginx 서버에 ssl을 설정하는 방법입니다.
ssl이란.. Secure Sockets Layer 의 약자로.. 쉽게 이야기해서 Security가 강화된 프로토콜입니다.
요즘 대부분의 웹사이트들은 https를 기본으로 적용하고 있습니다. https 를 사용하는 이유는.. 여러가지가 있겠지만.. 그 중에서도 가장 중요한 것은 보안 문제입니다. http 를 사용하게 되면.. 해당 사이트가 제대로 된 서버로 접속이 된건지.. 피싱 사이트인지 구분이 힘들지만, 제대로 된 https 인증서를 세팅한 사이트라면, 실제 회사의 사이트로 접속했다는 것을 인증서 발급 업체가 검증을 해주기 때문입니다. 그 외에 유저 전송 데이터를 암호화 하는 것도 반드시 필요하기 때문에 https가 권장되고 있습니다.
대부분의 웹서버들에서 ssl 설정을 할 수 있지만.. 오늘은 nginx 서버에 설정해 보겠습니다.
ssl 설정을 하기 위해서는 최종적으로 private key 파일과 인증서 파일이 필요합니다.
먼저 private key 파일과 인증서 파일을 준비하는 과정입니다.
private key 파일이나 인증서 파일은 여러가지 형태(확장자)로 존재하기 때문에, 가장 기본이 되는 파일로 설명해 보겠습니다.
1. 암호화 된 private key 파일과 인증서 요청 파일을 생성합니다.
아래 명령어를 이용해서 생성합니다.
openssl req -newkey rsa:2048 -keyout PRIVATEKEY.key -out CSR.csr
private key 파일 (PRIVATEKEY.key) 과 인증서 요청 파일 (CSR.csr) 을 생성합니다. 여기서는 rsa 2048bits 로 생성했지만, 더 강화된 보안을 위해서 rsa:4096 등의 옵션을 사용할 수 있습니다.
생성시 private key 파일에 password 를 설정해야하며, 인증 요청을 위한 정보들 (국가, 지역 등등..) 을 입력해야 합니다.
private key 파일과 password 를 잘 보관해 둬야 합니다.
2. 인증서 요청 파일을 인증기관에 보내서 인증서를 발급 받습니다.
원래 인증기관은 인증을 해주는 기관이지만, 여기서는 ssl 인증서를 발급해 주는 회사라고 하겠습니다. GeoTrust 같은 곳이 유명하고, 그 외에도 cloudflare, sectigo(comodo) 등의 인증 기관에서 인증서를 발급 받을 수 있습니다. 인증 기관에 따라 서비스가 크게 차이가 나진 않지만 인증서 발급 가격은 다를 수 있습니다.
인증서는 전체 도메인에 대해서 받을 수도 있고, 특정 호스트 도메인에 대해서도 받을 수 있으며, 인증 기간에 따라서도 비용이 다르니 필요에 따라 발급 받으면 됩니다.
위에서 생성한 인증 요청 파일 (csr 파일)을 보내고, 비용을 내면, 인증서 파일 (pem, crt 등) 을 보내줍니다.
보통 인증기관에서는 요청 도메인에 대한 인증서와 체인 인증서등을 보내줍니다.
요청 도메인에 대한 인증서는 위에서 생성한 csr 에 대한 인증서입니다.
체인 인증서는 csr에 대한 인증서를 인증해준 인증기관들에 대한 정보라고 생각하면 됩니다. 즉, A라는 인증기관이 B를 인증해주고, B에서 csr에 대한 인증서를 발급해 준 것이라면, A-B 인증기관에 대한 인증서가 됩니다.
참고로 인증서는 하나의 파일에 여러 개의 인증 정보가 포함될 수 있습니다.
만약 체인 인증서에 요청한 인증서가 포함되지 않았다면, 아래 명령어로 인증서를 하나로 합칩니다.
(domain.crt 가 요청해서 받은 인증서, bundle.crt 가 인증 기관의 체인 인증서)
cat domain.crt bundle.crt > domain.chained.crt
3. 암호화된 private key 파일을 복호화합니다.
아래 명령을 이용하여 복호화합니다.
openssl rsa -in PRIVATEKEY.key -out domain.key
처음에 설정한 password 를 입력하면 domain.key 라는 복호화된 키 파일이 생성됩니다.
4. 파일을 적당한 위치에 위치시킵니다.
리눅스 서버를 기준으로 하면.. /etc/ssl/certs 같은 폴더에 인증서 파일을 보관합니다.
인증서 (domain.chained.crt) 와 private key (domain.key) 파일을 /etc/ssl/certs 폴더에 위치시킵니다.
파일을 읽기 전용으로 변환합니다. (optional)
chmod 400 domain.key
chomd 400 domain.chained.crt
nginx 설정 파일을 열어 다음과 같이 설정합니다.
# http 요청을 https URL로 redirect 시킨다.
server {
listen 80;
server_name your_domain.com;
return 301 https://your_domain.com$request_uri;
}
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/ssl/certs/domain.chained.crt;
ssl_certificate_key /etc/ssl/certs/domain.key;
# 필요에 따라 ssl protocol 이나 cipher 등을 설정할 수 있음
# ssl_protocols TLSv1.2 TSLv1.3;
# ssl_ciphers ...;
# ssl_prefer_server_ciphers on;
# 나머지 nginx 옵션
...
}
설정 후 nginx를 재시작 합니다.
재시작 후에는 아래 명령어로 nginx 설정을 확인해 봅니다.
nginx -t
위와 같이 설정하면 your_domain.com 으로 오는 요청에 대해서, http 요청은 https 로 리다이렉트 되고, https 요청은 브라우저의 루트 인증서와 사이트 인증서를 확인하고 나서, 브라우저에서 안전한 연결인지 알려주게 됩니다.
브라우저에서 자물쇠 표시가 제대로 나오고, 에러 메시지가 없으면 잘 처리 된 것입니다.
(아래는 네이버 사이트 https 연결 체크)
요약
1. key 파일과 인증서 요청 파일을 생성한다.
2. 인증서 요청 파일을 가지고 인증기관에서 인증서를 받아온다.
3. key 파일 (decrypt 필요), 인증서 파일 (체인 인증서) 을 준비해서 적당한 위치에 둔다.
4. nginx 설정에 key와 인증서 등을 세팅하고 리스타트 한다.
많이 사용되는 파일 확장자를 간략히 정리하면 다음과 같습니다.
- .key : private key. (.p8 혹은 .pkcs8을 쓰기도 함) encrypted 된 파일도 있고, decrypted 된 파일도 있습니다. encrypted 파일의 경우 decrypt 하기 위해서는 암호가 필요합니다.
- .csr : 인증 요청서 파일. (.req 혹은 .p10을 쓰기도 함) 이것을 인증 기관으로 보내서 인증서를 받습니다. (보통은 파일 형태로 보내지 않고, 그 내용만 복사해서 폼에 붙여 넣습니다.)
- .crt : 인증서 파일. (.cer 을 쓰기도 함) 체인 인증서일 수도 있음.
- .der : 바이너리 형태의 인증서. (.cer 을 쓰기도 함)
- .pem : 컨테이너 파일. 컨테이너 라는 것은 안에 무언가 내용을 담을 수 있다는 의미이며, base64로 인코딩된 내용이 들어갑니다. 내용은 key가 될 수도 있고, 인증서가 될 수도 있습니다. (즉, 어떤 내용이 담겨있는지는 생성한 쪽에서 알려줘야 합니다.)
- .p7b 혹은 .p7c : PKCS#7/CMS 메세지. private key 를 제외한 인증서 혹은 체인 인증서를 담기 위해 사용됩니다.
- .pfx 혹은 .p12 : PKCS#12 파일. 키 스토어 컨테이너로 보통은 암호화 된 private key 와 인증서를 같이 담기 위해 사용됩니다.
각 포맷간 변환 참조 (소스: https://myonlineusb.wordpress.com/2011/06/19/what-are-the-differences-between-pem-der-p7bpkcs7-pfxpkcs12-certificates/)
# PEM to DER
openssl x509 -outform der -in certificate.pem -out certificate.der
# PEM to P7B
openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CAcert.cer
# PEM to PFX
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CAcert.crt
# DER to PEM
openssl x509 -inform der -in certificate.cer -out certificate.pem
# P7B to PEM
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
# P7B to PFX
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CAcert.cer
# PFX to PEM
openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes
'프로그래밍' 카테고리의 다른 글
[docker] min.io 사용하기 - 활용편 (0) | 2022.07.20 |
---|---|
[docker] min.io 사용하기 - 기초편 (0) | 2022.07.20 |
NGINX SSL 설정 (https) - part 2 (self signed certificate) (0) | 2022.06.13 |