교회 홈페이지에 SSL 인증서 적용하려다가 하루종일 삽질한 이야기.
0. 참고 블로그
- 성공한 방법: bitnami wordpress 전용 메뉴얼
- 실패한 방법 (그러나 일반적으로 추천하는 메뉴얼):
- well-known 디렉토리(폴더) 와 .htaccess 편집, HTTPS 리다이렉트
- TLS-SNI-01 보안 이슈
- 기초 이론
1. 적용(삽질) 히스토리
1.1 삽질 이유
- 아마존 Lightsail을 이용해서 Wordpress를 설치하면, Bitnami 패키지를 사용하여 설치가 된다.
- 설치 위치: /opt/bitnami/apache
- Bitnami Wordpress : 유명한 무료 APM 툴 중 하나
- https://bitnami.com/stack/wordpress
- APM : Apache + PHP + MySQL
- 아마존 Lightsail에 이미 또다른 Apache2가 설치되어 있었다.
- 설치 위치: /etc/apache2
- certbot 공식 메뉴얼을 사용하면 /etc/apache2 설정을 참고하여 SSL 인증서 발급을 시도한다.
- /etc/apache2 설정에서는 현재 설정된 웹서비스가 없으므로 정상적으로 처리되지 않는다.
- 에러 발생 --> No names were found in your configuration files. Please enter in your domain
- 결론은 bitnami wordpress 에 SSL 인증서를 발급받기 위해서는 bitnami 공식 문서를 참고해야 했고, 나는 이것을 이번에 처음 알았다. (공식문서가 있다는 것도...)
1.2 삽질 히스토리
- certbot 공식 메뉴얼 적용 --> 실패
- 인터넷에서 한글로 검색하면 대부분 certbot 또는 certbot-auto 에 대해서만 나옴.
- certbot-auto 의 최신버전이 certbot
- certbot-auto는 구버전이고, 설정이 복잡함.
- 2019년 2월 보안 이슈 발생 : TLS-SNI-01 취약점 발견됨
- 2019년 2월 13일부터 certbot 에서는 더이상 TLS-SNI-01 지원하지 않는다고 함.
- --> 최신버전의 certbot 사용 필수!
- bitnami wordpress 공식 메뉴얼 적용 --> 성공
- lego 사용함.
- lego --tls 옵션 시 TLS-ALPN-01 사용함.
- bitnami 커뮤니터에서는 최신 lego(2.1.0) 사용하면 괜찮다는 의견이 있으나 2019년 2월 13일 이후에 다시 확인이 필요함.
2. Bitnami 용 Apache 전용 메뉴얼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# 1단계:레고 클라이언트 설치
cd /tmp
curl -s https://api.github.com/repos/xenolf/lego/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -
tar xf lego_vX.Y.Z_linux_amd64.tar.gz
sudo mv lego /usr/local/bin/lego
# 2단계:도메인에 대한 권한 부여 인증서 생성
# - Turn off all Bitnami services:
sudo /opt/bitnami/ctlscript.sh stop
sudo lego --tls --email="MyID@gmail.com" --domains="도메인명" --domains="www.도메인명" --path="/etc/lego" run
# - Now it be generated in the /etc/lego/certificates directory.
# 3단계:웹 서버가 인증서를 사용하도록 구성
# - 사용 중인 웹 서버에 따라 새 SSL인증서 및 인증서 키 파일을 올바른 위치에 연결합니다.
# - 파일 권한을 업데이트하여 루트 사용자만 읽을 수 있도록 합니다.
## Apache의 경우:
sudo mv /opt/bitnami/apache2/conf/server.crt /opt/bitnami/apache2/conf/server.crt.old
sudo mv /opt/bitnami/apache2/conf/server.key /opt/bitnami/apache2/conf/server.key.old
sudo mv /opt/bitnami/apache2/conf/server.csr /opt/bitnami/apache2/conf/server.csr.old
sudo ln -s /etc/lego/certificates/도메인명.key /opt/bitnami/apache2/conf/server.key
sudo ln -s /etc/lego/certificates/도메인명.crt /opt/bitnami/apache2/conf/server.crt
sudo chown root:root /opt/bitnami/apache2/conf/server*
sudo chmod 600 /opt/bitnami/apache2/conf/server*
## NGINX의 경우:
sudo mv /opt/bitnami/nginx/conf/server.crt /opt/bitnami/nginx/conf/server.crt.old
sudo mv /opt/bitnami/nginx/conf/server.key /opt/bitnami/nginx/conf/server.key.old
sudo mv /opt/bitnami/nginx/conf/server.csr /opt/bitnami/nginx/conf/server.csr.old
sudo ln -s /etc/lego/certificates/DOMAIN.key /opt/bitnami/nginx/conf/server.key
sudo ln -s /etc/lego/certificates/DOMAIN.crt /opt/bitnami/nginx/conf/server.crt
sudo chown root:root /opt/bitnami/nginx/conf/server*
sudo chmod 600 /opt/bitnami/nginx/conf/server*
## 모든 Bitnami서비스를 다시 시작
sudo /opt/bitnami/ctlscript.sh start
# 4단계:구성 테스트
# - you can test it by browsing to https://도메인명
# -> Bitnami응용 프로그램의 보안 시작 페이지가 표시됩니다. 브라우저 주소 표시줄에서 자물쇠 아이콘을 클릭하면 도메인 및 SSL인증서의 세부 정보가 표시됩니다.
# 5단계:인증서 갱신
# - 인증서는 90일 동안만 유효
# - 인증서가 만료되기 전에 자동으로 갱신하려면 위의 작업을 수행하는 스크립트를 작성하고 스크립트를 주기적으로 실행하도록 cron작업을 예약하십시오.
sudo vi /etc/lego/renew-certificate.sh
# --------------
#!/bin/bash
sudo /opt/bitnami/ctlscript.sh stop apache
sudo /usr/local/bin/lego --tls --email="MyID@gmail.com" --domains="도메인명" --domains="www.도메인명" --path="/etc/lego" renew
sudo /opt/bitnami/ctlscript.sh start apache
# --------------
sudo chmod +x /etc/lego/renew-certificate.sh
sudo crontab -e
# ---------------
0 0 1 * * /etc/lego/renew-certificate.sh 2> /dev/null
# ---------------
# HTTPS redirect
vi /opt/bitnami/apps/wordpress/conf/httpd-prefix.conf
# ---------------
RewriteCond %{HTTPS} !=on
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R=301,L]
# ---------------
vi /opt/bitnami/apps/wordpress/htdocs/wp-config.php
# ---------------
# original
# define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
# define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');
# http to https
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');
# ---------------
# apache server restart
sudo /opt/bitnami/ctlscript.sh restart apache
|
cs |
3. Let's Encrypt (certbot) 공식 메뉴얼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# 패키지 설치
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot python-certbot-apache
# SSL 인증서 발급
## - 1.1 인증서를 발급 받고 자동으로 Apache 설정 파일까지 수정.
$ sudo certbot --apache
## - 1.2 인증서를 발급 받은 뒤에 직접 설정하는 방법
# sudo certbot --apache certonly
## - 2.1 이메일 주소를 묻는 메세지 -> 올바른 메일 주소를 입력
## - 2.2 동의하는지 묻는 메세지 -> A를 입력
## - 2.3 이메일 주소를 공유하고자 하는지 묻는 내용 -> N
## - 2.4 생성하고자 하시는 도메인을 선택하는 부분
## - -> 도메인에 해당되는 숫자 번호를 입력.
## - 만약 전체 도메인에 적용하고자 하시는 경우 빈칸으로 남겨주시고,
## - 원하시는 도메인을 콤마(,) 또는 스페이스로 분리하여 입력해 주시면 됩니다.
## - 입력한 도메인: 도메인명 www.도메인명
## - 2.5 위의 정보가 모두 입력되면 자동으로 SSL 인증서가 생성되게 됩니다.
# renewal test
$ sudo certbot renew --dry-run
# 자동 갱신 (root 계정)
# ---------------
0 0 1 * * /bin/bash -l -c 'certbot renew --quiet'
# ---------------
# 갱신후 바로 적용을 위해서 아파치를 다시 시작해 주시는것이 좋습니다.
# ---------------
0 2 * * * sudo certbot-auto -q renew && /etc/init.d/apache2 restart
# ---------------
|
cs |
4. 기본 지식
4.1 인증서 등록 기관
- Let's Encrypt - TLS 인증서를 무료로 발급해 주는 비영리기관.
- 발급된 인증서는 유효기간이 90일이며, 만료 30일 전부터 갱신할 수 있다. 갱신 가능 횟수는 무제한.
- 등록 관련 매뉴얼: https://certbot.eff.org/lets-encrypt/ubuntuxenial-apache
4.2 인증서 발급 방식 : 추천 인증서 발급 프로그램은 certbot
- standalone
- standalone 명령어를 사용하면 certbot에 내장된 웹 서버를 이용해서 도메인만으로 인증서가 발급 되고, 갱신 절차도 자동으로 처리된다.
- *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없다.
- webroot
- webroot 명령어를 사용하면 자신의 웹 서버에서 작동중인 웹사이트를 이용해서 인증서를 발급하고, 갱신 절차도 자동으로 처리된다.
- *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없다.
- dns
- 도메인이 연결된 DNS에 TXT 레코드를 생성해서 인증서를 발급하는 방식으로, 인증서 발급 과정에 웹 서버가 필요 없고 *.example.com 형태의 와일드카드 서브 도메인 인증서를 발급할 수 있다.
- 다만 매번 인증서를 갱신할 때마다 DNS에 TXT 레코드를 새로 생성해야 하므로, 외부에서 TXT 레코드를 입력할 수 있도록 DNS가 API를 제공하는 경우에만 갱신 과정을 자동으로 처리할 수 있다.
4.3 가장 간단한 방식
- - 서트봇 홈페이지로 들어가서 자신의 서버 사양을 선택하면 설명 화면이 나온다.
- - 문서를 읽으면서 터미널에 명령어를 친다.
- - 몇몇 정보를 입력하면 알아서 설정해주고, 3개월 마다 갱신도 자동으로 해준다.
- - 참 쉽죠?
4.4 SSL 인증서 파일
- certbot 으로 발급한 인증서
- 파일 위치 : /etc/letsencrypt/live/
- 발급된 파일
- privkey.pem : 인증서를 위한 비밀키 파일입니다.
- fullchain.pem : 인증서와 체인 인증서가 합쳐진 전체 파일입니다. 대부분의 서버 소프트웨어에서 사용됩니다.
- chain.pem : Nginx >=1.3.7에서 OCSP stapling을 위해서 사용됩니다.
- cert.pem : 생성된 인증서 파일입니다.
- lego 로 발급한 인증서
- 파일 위치 : /etc/lego/certificates/
- 발급된 파일
- 도메인명.key
- 도메인명.crt
5. 테스트
테스트 결과 :
6. 3개월마다 갱신 (수동 처리 필요)
- crontab이 제대로 동작하지 않아 수동으로 명령어 실행해야 했다.
sudo /etc/lego/renew-certificate.sh
'IT > Server' 카테고리의 다른 글
[LigthtSail] 인스턴스 업스레이드 방법 (0) | 2018.11.06 |
---|---|
[LightSail] 개발 팁 (0) | 2018.11.06 |