배경
AWS CloudFront로 구현된 두 개의 CDN( siteassets
및 ) 의 자산을 제공하는 오래된 Play Framework 웹 앱이 있습니다 .courseassets
파운드webapp과 동일한 VM에서 실행되며 사용된 이전 버전의 Play Framework가 SSL을 처리하지 않기 때문에 SSL 끝점 역할만 수행합니다. 파운드는 포트 80 및 443에 바인딩됩니다. Play 웹앱은 포트 9000에 바인딩됩니다.
이전에는 CDN 자산과 웹앱에 Symantec SSL 와일드카드 인증서를 사용했습니다. 이제 Symantec SSL 인증서가 더 이상 유효하지 않게 되기까지 며칠 밖에 남지 않았으므로 AWS Certificate Manager를 사용하여 CDN에 대한 단일 도메인 SSL 인증서를 프로비저닝하고 Letsencrypt를 사용하여 CDN에 대한 단일 도메인 SSL 인증서를 제공하기로 결정했습니다. webapp. Letsencrypt 인증서는 90일 동안만 지속되므로 자동으로 새로 고쳐야 합니다.
Pound는 PEM 형식의 SSL 인증서를 원하지만 Letsencrypt에는 PEM 형식을 제공하는 편리한 방법이 없는 것 같습니다. Letsencrypt에는 Apache httpd, Tomcat 또는 기타 잘 알려진 프레임워크와는 달리 Play Framework에 대한 특별한 조항이 없습니다.
Pound에서 사용하는 SSL 인증서를 업데이트하기 위해 webapp을 오프라인으로 전환하고 싶지 않습니다.
현재 파운드 구성
다음은 현재 /etc/pound/pound.cfg
파운드 버전 입니다 2.7f-0ubuntu1
. 이 구성은 몇 년이 지났으므로 업데이트해야 할 것이며 Pound도 업데이트해야 할 것입니다.
# Global options
User "root"
Group "root"
# Logging: (goes to syslog by default)
# 0 no logging
# 1 normal
# 2 extended
# 3 Apache-style (common log format)
# 4 (same as 3 but without the virtual host information)
# 5 (same as 4 but with information about the Service and BackEnd used)
LogLevel 5
# Check backend every X secs:
Alive 30
# Use hardware-accelleration card supported by openssl(1):
#SSLEngine "<hw>"
# poundctl control socket
Control "/var/run/poundctl.socket"
# Redirect all http requests on port 80 to https on port 443
# The Play Framework webapp never sees these redirected requests because Pound handles them
ListenHTTP
Address 0.0.0.0
Port 80
Err500 "/usr/local/etc/pound_error_500"
Err503 "/usr/local/etc/pound_error_500"
Service
Redirect 301 "https://www.scalacourses.com"
End
End
# Redirect all requests on port 443 to the Play Framework webapp on port 9443
ListenHTTPS
Address 0.0.0.0
Port 443
Err500 "/usr/local/etc/pound_error_500"
Err503 "/usr/local/etc/pound_error_500"
Cert "/var/work/training/cadenza/conf/ssl/scalacourses.com.pound.pem"
Disable SSLv3
Ciphers "EECDH+ECDSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!eNULL:!LOW:!aNULL:!MD5:!DSS"
SSLAllowClientRenegotiation 0
SSLHonorCipherOrder 1
HeadRemove "X-Forwarded-Proto"
HeadRemove "x-forwarded-proto"
AddHeader "x-forwarded-proto: https"
Service
BackEnd
#HTTPS
Address 127.0.0.1
Port 9000
End
End
End
질문
certbot ACME 클라이언트 버전 0.17.0은 다음을 통해 설치되었습니다.
sudo apt install certbot
내가 볼certbot 버전 0.21.0사용할 수 있습니다. Ubuntu 17.10에서 제공하는 기본값 대신 이 최신 버전을 사용해야 합니까?
- 데비안 PPA에서 사용할 수 있는 합리적인 버전의 Pound가 있나요? 이전에는 Pound를 직접 빌드해야 했지만 사전 빌드된 버전을 사용하는 것을 선호합니다.https://launchpad.net/ubuntu/+source/pound버전 2.7-1.3이 있습니다. 이것이 가장 안정적인 버전입니까?
의 파운드 구성에 어떤 변경이 필요합니까
/etc/pound/pound.cfg
? 분명히 다음 줄을 업데이트해야 합니다.Cert "/var/work/training/cadenza/conf/ssl/scalacourses.com.pound.pem"
파운드가 업데이트되면 이 줄을 업데이트해야 할 수도 있습니다.
Ciphers "EECDH+ECDSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!eNULL:!LOW:!aNULL:!MD5:!DSS"
추가, 삭제 또는 수정해야 할 다른 행은 무엇입니까? Pound가 로 실행되어서는 안 된다는 것을 알고 있지만
root
별도로 처리할 수 있습니다.처음에 Pound에 대한 Letsencrypt SSL 인증서를 프로비저닝하려면 스크립트가 필요합니다. 것 같다인증봇Letsencrypt에서 사용하는 프로그램은 포트 80에 바인딩하려고 하지만 Pound는 이 포트에 바인딩하므로 SSL 인증서를 업그레이드하기 위해 webapp을 중단하고 싶지 않습니다. Pound와 동일한 VM에서 실행할 수 있는 방법이 있습니까? 아니면 다른 VM에서 실행하고 준비가 되면 생성된 인증서를 PEM 형식으로 복사해야 합니까?
SSL 인증서를 새로 고치려면 45일마다 cron을 통해 호출할 수 있는 스크립트가 필요합니다.
답변1
로컬 호스트(127.0.0.1:80)에서 수신 대기하는 작은 httpd(Nginx, Apache...)를 설정하고 이를 실행하는 사용자가 [DOCUMENT_ROOT]/.well-known/acme-challenge/ 디렉터리에 쓸 수 있도록 만듭니다. httpd. 파운드 구성 생성보다
서비스 "letsencrypt" HeadRequire "호스트: .*" URL "/.well-known/acme-challenge/.*" 백엔드 주소 127.0.0.1 포트 80 끝 끝
다른 모든 규칙보다 먼저. 이제 다음과 같은 작업을 수행할 수 있어야 합니다.
certbot-auto certonly --email [email protected] -d www.example.com -d example.com --verbose --agree-tos --webroot --webroot-path /var/www/localhost/htdocs/
"/var/www/localhost"를 로컬 httpd의 Document_root로 변경하세요. 이 작업은 한 번만 수행하면 됩니다. 나중에 다음과 같은 작업을 수행할 수 있습니다.
# add --dry-run to test it certbot-auto renew --post-hook "/etc/init.d/pound restart" for i in
ls /etc/letsencrypt/live/
; do cp /etc/letsencrypt/live/$i/privkey.pem /opt/pound_certs/$i.pem ; cat /etc/letsencrypt/live/$i/fullchain.pem >> /opt/pound_certs/$i.pem ; done
그리고 물론 나중에 파운드 구성에 pem 파일을 추가하는 것을 잊지 마세요 ;-) 포스트훅이 늦게 온다는 것을 알고 있습니다. 그러나 Letsencrypt는 기존 인증서가 만료되기 10일 전에 새 인증서를 발급합니다. 따라서 매일 cronjob을 수행하도록 하면 전혀 문제가 되지 않습니다.
답변2
- 현재 버전은
certbot
잘 작동하므로 최신 버전이 필요하지 않습니다. - 최근 소스에서 사전 빌드된 Pound 버전에 대해 아직 모릅니다.
- 나는 라인만 변경하면 되었는데
Cert
, 이는 (아직) Pound를 업그레이드하지 않았기 때문에 의미가 있습니다. - 스크립트는 DNS 챌린지가 사용될 때 포트 80 또는 포트 443에 바인딩되지 않으므로 모든 VM에서 실행될 수 있습니다.
certbot53
다음은 내가 사용하기 위해 작성한 스크립트 입니다 .제드/certbot-route53DNS 챌린지를 통한 인증용. 이 스크립트는홍보내가 제출한 certbot-route53
파일은 두 가지 버그를 수정했습니다.
#!/bin/bash
#STAGING=--staging
CERT_DIR=/etc/pound/certbot
DOMAIN=scalacourses.com
MAIL_ADDR='[email protected]'
SCRIPT_NAME=certbot-route53.sh
if [ ! -d "$CERT_DIR/letsencrypt" ]; then sudo mkdir -p $CERT_DIR/letsencrypt; fi
sudo chmod 777 "$CERT_DIR/letsencrypt"
cd $CERT_DIR
if [ ! -f "$CERT_DIR/$SCRIPT_NAME" ]; then
sudo curl -sL https://git.io/vylLx -o $SCRIPT_NAME
sudo chmod a+x certbot-route53.sh
fi
./$SCRIPT_NAME \
--agree-tos \
--manual-public-ip-logging-ok \
--domains $DOMAIN,www.$DOMAIN \
--renew-by-default \
--email $MAIL_ADDR $STAGING
PRIV_KEY="$CERT_DIR/letsencrypt/live/$DOMAIN/privkey.pem"
FULL_CHAIN="$CERT_DIR/letsencrypt/live/$DOMAIN/fullchain.pem"
COMBINED="$CERT_DIR/combined-for-pound.pem"
cat "$PRIV_KEY" "$FULL_CHAIN" | sudo tee "$COMBINED" > /dev/null
현재 cron 작업을 통해 동일한 스크립트를 다시 실행하고 있습니다. 즉, 인증서를 업그레이드하는 것이 아니라 교체하는 것입니다. 인증서 업그레이드의 이점이 무엇인지 불분명합니다. 다음은
cron
2개월마다 내 사용자 ID로 스크립트를 실행하는 항목입니다. 다음을 입력한 후 이것을 입력했습니다sudo crontab -e
.0 0 1 */2 * su mslinn /usr/local/bin/certbot53