[Mac] 개발서버 구축기 (5) - Let's Encrypt 기반 SSL 인증서 발급 및 HTTP 서버 설정 변경
http
가 아닌 https
로의 접근을 위해서는 SSL 인증서를 발급받는 과정이 필요하다. 대부분의 경우 SSL 인증서는 유료로 진행되지만 Let's Encrypt
를 사용하면 무료로 인증서를 발급받을 수 있다.
#01. 인증서 발급 준비
1. 인증서 작업을 위한 디렉토리 생성
대부분의 가이드에서는 기본 경로를 사용하지만 그럴 경우 인증서를 사용하는 모든 서버들이 관리자 권한으로 실행되어야 한다. 하지만 맥의 HTTP 서버는 사용자 권한으로 실행되기 때문에 기본 경로를 사용하면 HTTP 서버에 SSL 인증서를 연결할 수 없게 된다.
$ mkdir ~/.ssl
2. Certbot 설치
Homebrew를 사용해 macOS에 Certbot을 설치한다.
$ brew install certbot
#02. 인증서 발급 받기
1. HTTP 서버 설정
여기서는 Certbot의 --webroot
플러그인을 사용한다. 이 플러그인은 웹서버가 실행 중인 상태에서 인증서를 발급받을 수 있게 해준다. 즉, HTTP 서버 설정이 완료된 후에 이 작업을 해야 한다.
그리고, HTTP 서버에 80번 포트로 접근이 가능해야 한다. 그러므로 HTTP 서버에서 HTTPS로 강제 리다이렉트를 구성할 경우 자동 갱신이 되지 않으므로 웹 서버 설정에 주의애햐 한다.
Let's Encrypt
는 무료이기는 하지만 월단위로 갱신해야 한다는 단점이 존재하는데, 대부분 crontab
을 사용하여 자동 갱신되도록 설정한다. --webroot
플러그인을 사용하지 않으면 이 자동 갱신 기능을 사용할 수 없기 때문에 웹 서버 설정은 필수라 할 수 있겠다.
2. 인증서 발급
Certbot을 실행하고 웹 루트 디렉토리를 지정하여 인증서를 발급받는다.
명령 형식
$ certbot certonly -d 도메인 --webroot -w 웹서버_루트_디렉토리_경로 --cert-path 인증서_저장_경로 --work-dir 작업경로 --logs-dir 로그파일이_저장될_경로 --config-dir 설정파일이_저장될_경로 [--dry-run]
온라인의 다른 블로그를 참고할 경우 --menaul
옵션을 부여해서 모든 과정을 일일이 지정하는 경우가 있는데, 이 경우에도 인증서 자동 갱신이 되지 않으므로 --menaul
옵션은 사용하지 않는 것이 좋다.
웹 루트 디렉토리는 웹 서버에서 호스팅하는 파일들이 위치한 디렉토리이다. 예를 들어, 아파치 웹서버의 경우 기본 웹 root 디렉토리는 /Library/WebServer/Documents/
일 수 있다. 나는 HTTP 서버의 root 디렉토리를 ~/workspace-php
로 설정했다.
그 밖에 각종 디렉토리 경로를 일일이 지정해 주고 있는데, 기본 디렉토리를 사용할 경우 sudo
명령을 사용하여 관리자 권한으로 실행해야 한다. 이렇게 되면 사용자 계정으로 실행되는 서버(ex: HTTP서버, jupyter 서버 등)은 인증서를 사용할 수 없게 되므로 모든 작업 디렉토리를 사용자 계정 안으로 설정해주자.
마지막의 --dry-run
은 테스트만 하고자 할 경우 사용한다.
실제 적용
$ certbot certonly -d home.hossam.kr --webroot -w /Users/leekh/workspace-php --cert-path /Users/leekh/.ssl --work-dir /Users/leekh/.ssl --logs-dir /Users/leekh/.ssl --config-dir /Users/leekh/.ssl [--dry-run]
#03. HTTP 서버에 적용하기
1. httpd.conf 파일 설정
/opt/homebrew/etc/httpd/httpd.conf
파일을 연다.
$ vi /opt/homebrew/etc/httpd/httpd.conf
대략 150라인 부근에서 ssl 설정 모듈에 대한 주석을 해제한다.
LoadModule ssl_module lib/httpd/modules/mod_ssl.so
526라인 부근 SSL 관련 설정 내용을 확인한다.
# Secure (SSL/TLS) connections
Include /opt/homebrew/etc/httpd/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
2. httpd-ssl.conf 파일 설정
9901
번 포트를 HTTPS로 접속할 수 있도록 설정하기 위해 /opt/homebrew/etc/httpd/extra/httpd-ssl.conf
파일을 다음과 같이 설정한다.
설정을 업데이트한 후 아파치를 재시작하여 새로운 설정을 적용한다.
Listen 9901
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
SSLPassPhraseDialog builtin
SSLSessionCacheTimeout 300
<VirtualHost *:9901>
DocumentRoot "/Users/leekh/workspace-php"
ServerName home.hossam.kr
ServerAdmin leekh4232@gmail.com
ErrorLog "/opt/homebrew/var/log/httpd/error_log"
TransferLog "/opt/homebrew/var/log/httpd/access_log"
SSLEngine on
SSLCertificateFile "/Users/leekh/.ssl/live/home.hossam.kr/cert.pem"
SSLCertificateKeyFile "/Users/leekh/.ssl/live/home.hossam.kr/privkey.pem"
SSLCertificateChainFile "/Users/leekh/.ssl/live/home.hossam.kr/chain.pem"
<Directory "/Users/leekh/workspace-php">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/opt/homebrew/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/opt/homebrew/var/log/httpd/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
#04. 인증서 자동 갱신
1. 자동 갱신 명령어
$ certbot renew --webroot -w /Users/leekh/workspace-php --cert-path /Users/leekh/.ssl --work-dir /Users/leekh/.ssl --logs-dir /Users/leekh/.ssl --config-dir /Users/leekh/.ssl
위 명령어를 매일 Mac이 자동으로 실행하도록 crontab을 설정한다.
$ crontab -e
crontab을 실행한 후 매일 새벽 1시에 자동으로 갱신할 수 있도록 다음과 같이 입력한다.
0 1 * * * certbot renew --cert-path /Users/leekh/.ssl --work-dir /Users/leekh/.ssl --logs-dir /Users/leekh/.ssl --config-dir /Users/leekh/.ssl