google OAuth 2.0 정책이 변경되어 https서버가 구축 되어야만 사용할 수 있게 되었다.

acme.sh를 사용하여 ssl 인증서를 발급받고, https 서버를 구축 해보자.
certbot을 이용할 수 없는 환경에서 대안으로 사용할 수 있다.


OS : ubuntu 14.04
Web server : nginx

acme.sh 설치

foo@bar:~$ curl https://get.acme.sh | sh
...install done
foo@bar:~$ source ~/.bashrc

~/.acme.sh 경로에 설치가 된다.

nginx config 수정

webroot의 path를 변경하거나, ssl 인증 경로를 추가한다.

변경 이유 : nginx 의 경우 기존의 root path에서는 url routing 으로 letsencrypt 의 인증 방식을 통과할 가능성이 낮다.
letsencrypt 인증 방식 : webroot에서 .well-known/acme-challenge 경로에 file을 만들어 해당 domain/.well-known/acme-challenge/fileName 으로 접근 후 인증하는 방식

root path 변경

#인증서 발급을 위한 경로 변경
location / {
         root    /var/www/letsencrypt; #/origin/path;
         ...

OR

경로 추가

#인증서 발급을 위한 추가
location ~ /\.well-known/acme-challenge/ {
                allow all;
                root /var/www/letsencrypt;
        }

nginx service 정지

인증서 발급을 위한 80포트 사용을 중지하기 위해 nginx를 정지시킨다.

foo@bar:~$ sudo service nginx stop

인증서 발급

acme.sh을 사용하여 인증서를 발급한다.

foo@bar:~$ acme.sh --issue -d [DOMAIN] --webroot [임시로 변경 root path 또는 추가한 path] --server letsencrypt
에러가 나올 경우 진행 command 실행 시, 아래와 같은 오류가 출력되고,
Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 60  
Can not init api for: https://acme-v02.api.letsencrypt.org/directory.
https://acme-v02.api.letsencrypt.org/directory 로 curl 날렸을 때, 아래와 같은 오류가 나올 경우
curl: (60) SSL certificate problem: unable to get local issuer certificate


curl 공식 홈페이지에서 인증서를 받고,
wget --no-check-certificate https://curl.haxx.se/ca/cacert.pem
acme.sh script 에서 curl을 사용하는 곳(1769 line) command에 --cacert [path]/cacert.pem 추가
_ACME_CURL="curl --silent --dump-header $HTTP_HEADER --cacert /home/ubuntu/cacert.pem"

인증서의 갱신을 위해 origin path 로 부터 soft link를 만들어 관리
nginx config에 path를 직접 입력하여도 무방
fullchain.cer , [domain].key 2개만 지정
필자는 /etc/nginx/ssl 디렉토리를 사용

foo@bar:~$ mkdir /etc/nginx/ssl

foo@bar:~$ ln -s /home/ubuntu/.acme.sh/[domain]/fullchain.cer fullchain.cer
foo@bar:~$ ln -s /home/ubuntu/.acme.sh/[domain]/[domain].key [domain].key

dhparam.pem 발급

foo@bar:~$ sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

nginx config 변경

server_name [domain name]; # for ssl

listen [::]:443 ssl ipv6only=on; # for ssl
        listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/fullchain.cer;
        ssl_certificate_key /etc/nginx/ssl/[domain].key;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;

nginx 재시작

foo@bar:~$ service nginx restart

브라우저에서 https 접근 확인

browser_https

인증서 갱신

인증서 갱신은 acme.sh 설치와 함께 cron job 에 자동 등록됨

48 0 * * * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" > /dev/null

필자는 2달에 한번씩 강제로 갱신 및 nginx reload 하도록 변경

0 0 1 */2 * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" --force && sudo service nginx reload > /dev/null