본문 바로가기

개발세발

SSL HTTPS 웹서버 (nginx + let's encrypt(certbot))


SSL 인증서

ssl 인증서는 보통 유료인데 뭐 무료로 하자는 목소리와 프로젝트가 여기저기서 나왔나봄.

무료 ssl 인증서는 대표적으로 startSSL, Let's Encrypt(Certbot), WoSign 이렇게 3개를 찾았다.

Let's Encrypt를 써보자.


윈도에서는 잘 모르겠고 윈도우 10의 Ubuntu bash for Windows를 이용하면 가능하다.

리눅스에서


0. Git, Python + Pip + VirtualEnv를 미리 설치해놓는다.


1. let's encrypt git repository에서 소스를 받아와서 받아온 폴더로 이동한다.

$ git clone https://github.com/certbot/certbot DIRECTORY

$ cd DIRECTORY


2. 의존성을 설치한다. (설치가 안되어있을 때 letsencrypt-auto를 실행하면 의존성을 먼저 설치함)

$ ./letsencrypt-auto --help

처음에는 의존성을 설치하고, 그 다음부터 다시 $ ./letsencrypt-auto --help 를 하면 도움말이 겁나게 많이 뜬다


3. 인증서 발급한다. 오직 인증서를 발급하는 용도로만 사용할 것이므로 certonly 로 실행할거다.

$ ./letsencrypt-auto certonly --manual

4. 정보를 입력한다. (이메일, 사용할 도메인)

사용할 도메인의 경우 www 붙은거와 안붙은거 모두 이용할거면 둘 다 입력해줘야된다. (콤마나 스페이스로 구분)


5. IP 로그 수집 동의한다. 난 그냥 YES했다.


6. 도메인 인증을 한다.

중간에


http://www.domain.com/.well-known/acme-challenge/@#&*&^#$$%$&^$%$#^%^$%^$# before continuing :


@#&*&^#$$%$&^$%$#^%^$%^$#.@$^%&*$&^$%#%^#^%##


이런 요상한게 있는데, 이게 뭔소리냐면 윗 줄로 접속했을 때 아랫줄의 결과가 나와야 인정!이라는 소리인 것 같다.


아래에 나온부분은 웹서버 아직 구축 안됐을 경우 파이썬으로 임시웹서버 구축해서 도메인인증하는거같고, 나는 있으니깐

그냥 .well-known/acme-challenge 디렉토리를 만들어주고 그 안에 파일을 만들어준다.

파일 이름은 윗줄의 @#$%@%$@어쩌고, 파일 내용은 아랫줄의 @#$@#%$@.@#$%#$@#어쩌고 이렇게 만들어주면됨.

그리고 저 위에 주소를 인터넷창에 쳤을 때 아래 @#$@%$@#.@#$#^어쩌고가 들어있는 파일이 열리면 됨.


nginx라면 nginx 설정에 location을 추가해서 디렉토리를 꽂아주는부분을 따로 만들어도 좋음.


location /.well-known {

root /var/www/html/well-known; <- 자기 웹서버 파일이 있는 디렉토리 뒤에 well-known 넣어준다.

}


이런식으로 하고

웹서버 디렉토리에 /well-known/.well-known/acme-challenge/ 을 만들어주고 위에서 언급한대로 @#$@%@$%어쩌고 파일을 만들어주면됨.


그다음에 엔터치고 진행하면 뭐 성공했다 실패했다 뜰거임.

실패했다면 오류를 잘 읽어보고 다시 해보면 됨. 가끔 IP로그수집과 인증이 두번 이루어지는경우가 있음. 버그인가?


성공했다면 인증서가 저장된 경로가 출력된다.


인증서는 90일마다 renewal(갱신)해줘야된다. (유효기간을 90일로 해줌)


생성된 인증서를 잘 자기 서버의 /etc/nginx/conf.d/로 복사해오자. (꼭 이 폴더여야하는지는 잘 모르겠다)



nginx 설정

/etc/nginx/sites-available/default


server {

listen 80;

server_name www.domain.com;

return 301 https://$host$request_uri;

}


server {

listen 80;

listen 443;

server_name domain.com

return 301 https://www.$host$request_uri;

}


server {

listen 443 default_server ssl;

server_name www.domain.com;


ssl on;

ssl_certificate /etc/nginx/conf.d/fullchain.pem;   <- cert를 등록해도 되지만 모바일에서 안되더라. 그래서 fullchain을 여기에 놓는다.

ssl_certification_key /etc/nginx/conf.d/privkey.pem;


location / {

proxy_pass http://127.0.0.1:[nodejs port no];

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;

}

}



* 찾아봤는데 아파치서버에서는

SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/fullchain.pem

이렇게 해주면 된다고함.