본문 바로가기

교양/네트워크

HTTP 서버 HTTPS로 서비스 하기

이것때문에 하루 종일 얼마나 삽질 한지 모르겠다.

 

이론적인 부분은 검색해보면 차고 넘치는 만큼

 

오로지 목표에 다가서는 방법만 정리하려 한다.

 

1. SSL 인증서 발급

일단 SSL 인증서를 공인된 기관에서 받아야 한다. (openssl 같은 것을 이용해서 직접 만들수도 있지만, 어차피 실 서비스에 사용할 수 없다)

SSL은 publicKey와 privateKey로 구성되는데 두 개의 파일이 필요하다는 것만 알고 있으면 된다.

https://certbot.eff.org/

 

Certbot - Ubuntubionic Nginx

Different Internet services are distinguished by using different TCP port numbers. Unencrypted HTTP normally uses TCP port 80, while encrypted HTTPS normally uses TCP port 443. To use certbot –webroot, certbot –apache, or certbot –nginx, you should have an

certbot.eff.org

certbot을 이용하면 무료로 let's encrypt가 인증한 ssl을 쉽게 받을 수 있다.

홈페이지 중반부에 동그라미 친 부분의 기존 HTTP 환경을 선택하면 방법이 나온다.

진짜 그대로 따라하기만 하면 된다.

 

2. ReverseProxy

해당 설정을 완료하고 nginx를 실행하면 기존의 서버 대신 nginx 서버가 실행 될 것이다.

 

이것을 기존의 프로젝트 서버로 Redirect해주어야 한다.

 

이때 ReverseProxy 와 같은 개념을 이용한다.

 

클라이언트가 요청하면 프록시 서버를 거쳐 서버에 요청을 하고 서버는 프록시 서버로 다시 응답을 준다.

일단 nginx의 sites-available 로 이동한다.

cd /etc/nginx/sites-available

그러면 default 파일이 있는데 안전장치로 파일을 하나 복사해놓고 다음과 같이 수정한다.

sudo vim default

 

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
32
33
34
35
server {
 
        server_name domain.com; // 도메인 네임
 
        location / {
                        proxy_redirect off;
                        proxy_pass_header Server;
                        proxy_set_header Host $http_host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-Proto $scheme;
                        proxy_pass http://127.0.0.1:3000/; // 현재 프로젝트의 포트
                        proxy_redirect off;
                        proxy_http_version 1.1;
        }
 
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; //
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
 
 
}
server {
    if ($host = test.eilsin.co.kr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
 
 
    listen 80;
 
    server_name test.eilsin.co.kr;
    return 404# managed by Certbot
 
}
 

letsencrypt에서 추천하는 설정이다.

server_name에 도메인을

proxy_pass에 프로젝트가 열린 서버와 포트를 입력해준다.

ssl_certificate와 관련된 fullchain.pem과 privkey.pem은 아까 certbot이 만들어준 두개의 필요한 설정파일인데 그 때 설정한 도메인 네임이 위의 디렉토리명이 된다.

 

이후 nginx를 재시작한다.

service nginx restart

나 같은 경우에는 무슨 데몬 엔진의 문젠가 뭔가로 위의 명령어가 안 먹혔다 (포트가 안닫히는 현상)

그럴땐 다음과 같이 강제로 닫았다 열어주자.

 

sudo fuser -k 80/tcp

sudo nginx