PWA 개발을 해보고 싶어서 Mac OS + ipTime 조합으로 Https 환경 구성을 해보고자 합니다. ipTime 공유기를 사용하면 무료로 DDNS 를 이용할 수 있습니다.
참고로 Let's Encrypt 로 iptime DDNS 를 등록하려고 하면 안된다는 글들이 있는데, 제가 등록에 성공 한걸 보니 안되는건 아니고 1년에 할당가능한 양이 정해진 듯 해서 연초에 빠르게 하면 가능한것 같습니다.
letsencrypt.org/ko/getting-started/
Let's Encrypt 는 무료로 SSL 인증서를 발급해 주는 대신 갱긴 주기가 짧다고 합니다.
Certbot 설치
brew install certbot
letsencrypt 별도 설치가 필요할 줄 알았는데 certbot 을 설치하고 난 후에는 설치가 필요 없는 듯 합니다.
> brew install letsencrypt
Warning: certbot 1.10.1 is already installed and up-to-date
To reinstall 1.10.1, run `brew reinstall certbot`
certbot.eff.org/lets-encrypt/osx-other.html
OSX 에서 설치 방법은 홈페이지에 설명되어 있습니다. 여기서는 수동으로 인증서 발급 진행을 해 줍니다.
sudo certbot certonly --manual
인증서 발급 진행 과정에서 email 주소와 domain 이름을 적으라고 나오는데 아래와 같이 iptime 에서 설정해 둔 내용을 가져다 사용했습니다.
중간 중간 약관동의 등 물어보는 항목들도 나옵니다.
발급에 실패 했습니다. 설명을 읽어보니 challenges 를 찾을 수 없다는데 세팅이 중간에 빠졌습니다. 바로 위쪽을 보면 점선으로 된 구문안에 제가 처리해 주었어야 할 내용이 적혀있습니다. 이래서 설명을 안읽고 대충 진행하면 안됩니다.
다시 인증 시도를 하면 구문안에 다른 키 값이 발급됩니다. 인증 할 때마다 랜덤한 값을 주는 듯 합니다. 또, 경로명과 안에 들어가 있어야 되는 데이터가 다릅니다. 각각 확인해서 맞는 경로에 파일을 생성하고 데이터를 추가하기 바랍니다. 최종적으로 URL 에서 해당 데이터가 출력되는 것을 확인한 뒤 Enter 를 눌러 진행하면 아래와 같이 성공했다는 메세지와 함께 생성된 인증서 경로를 알려줍니다.
참고로 성공 로그를 보면 2021년 4월 2일 만료가 됩니다. 오늘 1월 2일 생성했으니 생성일로 부터 딱 3달 보증해 주는 것 같습니다.
Apache 설정
이제 Apache 에 SSL 설정을 해 줍니다. 참고로 인증서 발급시 저처럼 메뉴얼이 아닌 --apache 구문을 넣으면 자동으로 Apache 설정을 해준다고 하네요.
진행한 Apache 버전은 2.4.46 입니다
우선 httpd.conf 파일을 열어 설정해 줍니다. 아래 적힌 설정들이 주석처리가 되어 있다면 주석을 제거해 주고 수정이 필요한 내용은 수정해 주면 됩니다. ServerAdmin 과 ServerName 만 인증서 발급시 입력한 값과 맞춰 주시고 나머지는 주석만 제거하면 됩니다.
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
LoadModule ssl_module libexec/apache2/mod_ssl.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
...
ServerAdmin {myAdmin}
ServerName {myServerName}
...
# Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
...
# Secure (SSL/TLS) connections
Include /private/etc/apache2/extra/httpd-ssl.conf
extra/httpd-ssl.conf 파일을 열어 SSL 관련 설정을 해 줍니다.
...
DocumentRoot "/Library/WebServer/Documents"
ServerName {myServerName}:443
ServerAdmin {myAdmin}
ErrorLog "/private/var/log/apache2/error_log"
TransferLog "/private/var/log/apache2/access_log"
...
SSLCertificateFile "/etc/letsencrypt/live/{myServerName}/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/{myServerName}/privkey.pem"
...
나머지는 certbot 에서 생성해준 options-ssl-apache.conf 파일을 참고해 수정해 줍니다. 맨 아래 LogFormat 이란 값은 매칭되는게 없어 보여 적용하지 않았습니다. options-ssl-apache.conf 파일은 인증서가 있는 letsencrypt 경로 안에 있습니다.
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.
SSLEngine on
# Intermediate configuration, tweak to your needs
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLOptions +StrictRequire
# Add vhost name to log entries:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
extra/httpd-vhosts.conf 파일을 수정해 Http 접속을 시도 하면 자동으로 Https 로 접속되게 설정해 줍니다.
<VirtualHost *:80>
ServerAdmin chanuklee0227@gmail.com
DocumentRoot "/Library/WebServer/Documents"
ServerName chanuklee0227.iptime.org
ErrorLog "/private/var/log/apache2/chanuklee0227.iptime.org-error_log"
CustomLog "/private/var/log/apache2/chanuklee0227.iptime.org-access_log" common
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
마지막으로 iptime 의 포트 포워딩 설정에 Port 값이 80 만 설정되어 있다면 외/내부 Port 모두 80~443 허용되게 해야 합니다.
테스트
이제 웹으로 접속 해보면 Https 로 연결이 되는걸 확인할 수 있습니다. Https 연결이 되었는지 확인하는 방법은 주소 표시줄에 자물쇠 표시를 확인하고 눌러보면 아래와 같이 확인 가능합니다.
SSL 인증 갱신 자동화
마지막으로 SSL 인증 갱신을 자동화 해 줍니다. 홈페이지에 친절하게 Python 코드를 작성해 두고 복붙해 쓰면 되도록 안내 해 주고 있습니다. Cron 이란 것을 사용했는데 나중에 시간될 때 좀 더 자세히 알아보면 좋을 것 같습니다.
echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
'Works > Web' 카테고리의 다른 글
[Web] 서버 이사: 라즈베리파이 Ubuntu Server 설치 (0) | 2021.01.28 |
---|---|
[Web] Maria DB 설치 및 사용 (0) | 2021.01.16 |
[Web] 공통 HTML 코드 별도로 관리하기 (0) | 2021.01.02 |
[Web] Cloud FireStore 관리자 생성 및 관리자 접근 권한 부여 (0) | 2020.12.31 |
[Web] Firebase Cloude Function 사용기 (4) | 2020.12.30 |
댓글