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으로 설정한 것으로 예를 들겠음


4. NGINX 설정

/etc/nginx/sites-available으로 이동
cd /etc/nginx/sites-available
sudo vim default로 nginx 기본 설정 파일 열기
sudo vim default
default 파일 맨아래에 주석 처리되어있는 거 풀고 아래와 같이 설정
server {
    listen 80;
    server_name www.syoo.shop;

    location /api {
        proxy_pass http://127.0.0.1:8080;
    }
}
nginx 재시작
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 설정 파일이 수정되어있음.


9. 변경된 설정 파일 확인.

cd /etc/nginx/sites-available

sudo vim default
Websocket 설정이 필요하다면, 아래와 같이 #WebSocket configuration 추가
# 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이 적용된 도메인 평가 가능.


변외 : 도메인을 바꾸고 다시 ssl인증을 받고 싶을 때


1. 도메인을 다시 A레코드에 맵핑함 (그전 도메인 설정 해제 확인)

2. nginx 다시 설치
sudo apt-get purge nginx nginx-common nginx-full
sudo rm -rf /etc/nginx
sudo apt-get install nginx

3. 위에 설명중 4번의 nginx 설정을 다시 해줌
# 참고 nginx 명령어
sudo systemctl start nginx  #nginx 시작
sudo systemctl restart nginx  #nginx 다시시작
sudo systemctl status nginx   #nginx status 확인
sudo nginx -t.  # 설정파일 문제 확인

4. certbot 지우기
sudo snap remove certbot
sudo rm -rf /etc/letsencrypt
sudo rm -rf /var/log/letsencrypt
sudo rm -rf /var/lib/letsencrypt

5. 위에 설명중 5번부터 계속하면 된다.

참조 url

Posted on 2025.02.21