Play Framework 및 AWS CloudFront용 파운드 + Letsencrypt

Play Framework 및 AWS CloudFront용 파운드 + Letsencrypt

배경

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

질문

  1. certbot ACME 클라이언트 버전 0.17.0은 다음을 통해 설치되었습니다. sudo apt install certbot

    내가 볼certbot 버전 0.21.0사용할 수 있습니다. Ubuntu 17.10에서 제공하는 기본값 대신 이 최신 버전을 사용해야 합니까?

  2. 데비안 PPA에서 사용할 수 있는 합리적인 버전의 Pound가 있나요? 이전에는 Pound를 직접 빌드해야 했지만 사전 빌드된 버전을 사용하는 것을 선호합니다.https://launchpad.net/ubuntu/+source/pound버전 2.7-1.3이 있습니다. 이것이 가장 안정적인 버전입니까?
  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별도로 처리할 수 있습니다.

  4. 처음에 Pound에 대한 Letsencrypt SSL 인증서를 프로비저닝하려면 스크립트가 필요합니다. 것 같다인증봇Letsencrypt에서 사용하는 프로그램은 포트 80에 바인딩하려고 하지만 Pound는 이 포트에 바인딩하므로 SSL 인증서를 업그레이드하기 위해 webapp을 중단하고 싶지 않습니다. Pound와 동일한 VM에서 실행할 수 있는 방법이 있습니까? 아니면 다른 VM에서 실행하고 준비가 되면 생성된 인증서를 PEM 형식으로 복사해야 합니까?

  5. 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

  1. 현재 버전은 certbot잘 작동하므로 최신 버전이 필요하지 않습니다.
  2. 최근 소스에서 사전 빌드된 Pound 버전에 대해 아직 모릅니다.
  3. 나는 라인만 변경하면 되었는데 Cert, 이는 (아직) Pound를 업그레이드하지 않았기 때문에 의미가 있습니다.
  4. 스크립트는 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
  1. 현재 cron 작업을 통해 동일한 스크립트를 다시 실행하고 있습니다. 즉, 인증서를 업그레이드하는 것이 아니라 교체하는 것입니다. 인증서 업그레이드의 이점이 무엇인지 불분명합니다. 다음은 cron2개월마다 내 사용자 ID로 스크립트를 실행하는 항목입니다. 다음을 입력한 후 이것을 입력했습니다 sudo crontab -e.

    0 0 1 */2 * su mslinn /usr/local/bin/certbot53
    

관련 정보