August 31, 2024

Nginx https 인증 (feat. Code-server)

Nginx https 인증 (feat. Code-server)

CertBot을 이용해서 인증서를 발급받는다.

80번 포트가 비어있어야 하므로 nginx 서비스를 끈다.

sudo snap install certbot --classic

sudo systemctl stop nginx.service
sudo certbot certonly --standalone      # Email / Y / N / domain

하면 다음과 같은 로그가 나온다. 
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/<domain>/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/<domain>/privkey.pem

nginx 설정을 다시 변경해준다.

443번 포트를 열어주어 https 를 사용하게 한다.

server {
    listen [::]:443 ssl;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem
    server_name mydomain.com; # 자기 도메인

    location / {
      proxy_pass http://localhost:8080/; # code-server 포트
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Accept-Encoding gzip;
    }
}
server {
        if ($host = mydomain.com) { # 자기 도메인
            return 301 https://$host$request_uri;
        }
    listen 80;
	listen [::]:80;
	server_name mydomain.com; # 자기 도메인
    return 404;
}

Nginx 확인 후 실행

sudo nginx -t     # nginx 설정 확인
sudo systemctl start nginx

Certbot 인증서 자동 재발급

인증서를 발급하는 데 80번 포트를 사용한다. --nginx 옵션으로 사용하고 있는 nginx를 통해 재발급 받을 수도 있지만,
Standalone으로 하려면 사용하고 있는 80번 포트를 비워놔야 한다.

앞 단계에서 nginx로 80번 포트를 사용중이니, renew 하기 전에 nginx를 끄는 작업이 필요하다.

자동 재발급을 위해 crontab 을 사용한다. sudo crontab -e 로 열고 다음을 붙여 넣는다.

30 4 1,15 * * /usr/bin/certbot renew --quiet --pre-hook "/usr/sbin/service nginx stop" --post-hook "/usr/sbin/service nginx start"

(분 시 일 월 요일) 1,15일마다 4시 30 분 renew. pre/post hook 으로 nginx 재시작
잘 진행되지 않을 경우 80 번 포트를 강제로 종료 (fuser -k 80/tcp) 하는 과정을 추가

Nginx 로 password 설정

code-server 의 비밀번호 설정보다 nginx로 설정하는 것이 더 안전하단다.
nginx의 경우 팝업이 나오기 때문에 안드로이드tv 나 일반적이지 않은 환경에서 사용하기 힘들 수 도 있다.

(apache2-utils 의 경우 패스워드를 설정하고 나서는 다시 지워줘도 된다.)

# nginx 패스워드 설정sudo apt-get install apache2-utilssudo htpasswd -c /etc/nginx/.htpasswd userid # 사용할 id, password 입력

nginx Config 수정

# /etc/nginx/sites-available/code-server.conf

server { 
    server_name domain.com;
    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;

        ...
    }
    ...
}

Code-server password 해제

nginx의 비밀번호를 설정했다면, Code-server의 비밀번호 인증을 해제해줘도 된다.

# ~/.config/code-server/config.yamlbind-addr: 127.0.0.1:8080auth: nonepassword: 1234cert: false

Comments