일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- error
- MySQL
- 영어
- logstash
- ChatGPT
- sample
- JavaScript
- 구글
- mariadb
- build
- Windows
- Ai
- Kibana
- 설정
- Linux
- MSSQL
- API
- nodejs
- 엘라스틱서치
- unity
- AWS
- docker
- 유니티
- elasticsearch
- Python
- Git
- s3
- JS
- ssh
- Today
- Total
가끔 보자, 하늘.
Private 웹 사이트에 SSL 도입하기 - 3/3 본문
마지막으로 직접 인증서를 발급하고 이를 개인용 사이트에 적용하는 방법을 상세히 알아보겠습니다.
이 테스트는 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년 되시기 바랍니다.
이만 ~~ !
'개발 이야기 > 인프라 구축 및 운영' 카테고리의 다른 글
Logstash sqs plugin 설정 (0) | 2020.02.06 |
---|---|
S3 버킷 암호화로 데이터 보호하기 (0) | 2020.01.21 |
Private 웹 사이트에 SSL 도입하기 - 2/3 (53) | 2020.01.16 |
Private 웹 사이트에 SSL 도입하기 - 1/3 (0) | 2020.01.15 |
ssh key 충돌 해결방법 (31) | 2019.07.03 |