acme.sh로 https 구축하기
acme.sh - letsencrypt 로 ssl 인증서 발급하여 https 서버 구축
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"
발급받은 인증서 지정 path 에 soft link 만들기
인증서의 갱신을 위해 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 접근 확인
인증서 갱신
인증서 갱신은 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