Https ssl인증 받기 및 websocket 통신 방법 정리
웹소켓을 이용하여 채팅서비스를 개발하던 중 웹소켓은 ssl인증을 받은 https에서만 connection을 보장한다는 것을 알게되었다. 그래서 aws에 내 개발 was를 올려서 ssl 적용을 해보았다.
1. 도메인을 사서 A레코드를 본인의 서버공인ip로 설정.
aws라면 elastic ip 사용. 보안규칙에 80, 443, 22 포트가 허용되어있는지 확인
2. NGINX 설치
sudo apt-get install nginx -y
3. 운영환경 was 배포.
spring 실행. 포트 확인 필수. yaml 파일에 포트를 8080으로 설정한 것으로 예를 들겠음
- /etc/nginx/sites-available으로 이동
- sudo vim default로 nginx 기본 설정 파일 열기
- default 파일 맨아래에 주석 처리되어있는 거 풀고 아래와 같이 설정
- nginx 재시작
4. NGINX 설정
cd /etc/nginx/sites-available
sudo vim default
server {
listen 80;
server_name www.syoo.shop;
location /api {
proxy_pass http://127.0.0.1:8080;
}
}
sudo service nginx restart
5. ssl 인증 받기
# certbot을 snap 명령어로 설치, 실행하기 때문에 snap을 먼저 설치한다
sudo snap install core
sudo snap refresh core
# 기존에 설치된 certbot을 제거한다
# 공식 가이드에선 certbot명령어를 사용할 때 snap이 사용되게 하기 위함이라고 설명한다
sudo apt-get remove certbot
# certbot을 설치한다
sudo snap install --classic certbot
# certbot 명령어가 실행될 수 있게 세팅한다
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# nginx가 아닌 apache를 웹서버로 사용할 경우, sudo certbot --apache 가 된다
sudo certbot --nginx -d richplace.ga -d www.richplace.ga -d dev.richplace.ga
# 놀랍게도 certbot은 CLI몇 줄로 SSL을 적용해줄 뿐 아니라 자동 리뉴얼까지 해준다;
# 처음 설치할 때부터 이러한 cron job 처리를 위한 내용이 함께 들어온다
# 아래 명령어로 자동 리뉴얼이 적용되고 있는지 확인할 수 있다
sudo certbot renew --dry-run
놀랍게도 certbot은 인증서 자동 갱신까지 처리해줌.
systemctl list-timers 명령어를 통해 추가된 타이머를 확인할 수 있음.
위 명령어 절차를 따르고 나면 certbot에 의해 인증 파일이 생성되고, SSL 적용을 위한 NGINX 설정 파일이 수정되어있음.
- Websocket 설정이 필요하다면, 아래와 같이 #WebSocket configuration 추가
9. 변경된 설정 파일 확인.
cd /etc/nginx/sites-available
sudo vim default
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
server {
server_name www.syoo.shop;
root /var/www/example.com;
index index.html;
location / {
proxy_pass http://127.0.0.1:8080;
}
# WebSocket configuration
location /websocket {
proxy_pass http://127.0.0.1:8080; # or wherever your WebSocket server is running
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen 443 ssl; # managed by Certbot
listen [::]:443 ssl ipv6only=on; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.syoo.shop/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.syoo.shop/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.syoo.shop) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name www.syoo.shop;
return 404; # managed by Certbot
}
10. ssl 적용 됐는지 확인.
접속해보고 ssl 적용 됐는지 확인.
http주소로 들어가도 https로 리다렉팅이 돼야함.
ssllabs.com에 방문하여 ssl이 적용된 도메인 평가 가능.
- 1. 도메인을 다시 A레코드에 맵핑함 (그전 도메인 설정 해제 확인)
- 2. nginx 다시 설치
- 3. 위에 설명중 4번의 nginx 설정을 다시 해줌
- 4. certbot 지우기
- 5. 위에 설명중 5번부터 계속하면 된다.
변외 : 도메인을 바꾸고 다시 ssl인증을 받고 싶을 때
sudo apt-get purge nginx nginx-common nginx-full
sudo rm -rf /etc/nginx
sudo apt-get install nginx
# 참고 nginx 명령어
sudo systemctl start nginx #nginx 시작
sudo systemctl restart nginx #nginx 다시시작
sudo systemctl status nginx #nginx status 확인
sudo nginx -t. # 설정파일 문제 확인
sudo snap remove certbot
sudo rm -rf /etc/letsencrypt
sudo rm -rf /var/log/letsencrypt
sudo rm -rf /var/lib/letsencrypt
참조 url
Posted on 2025.02.21