martin-v.letsencryptsh
脱水
dehydrated
をインストールして設定します。特権を制限するためのユーザーを作成し、証明書の更新のためのcron設定を行います。
dehydrated
はあなたのプライベートキーを扱うため、慎重に扱い、このansibleロールと使用されるdehydratedスクリプトをレビューしてください。
nginxをhttpsプロキシとして使用したサンプルセットアップについては、ansibleロールmartin-v/ansible-nginx_https_onlyを参照してください。
要件
このロールはホストに以下をインストールします:
- openssl
- curl
- sed
- grep
- mktemp
- git
このロールは、dehydrated_challengesdir
に設定されたディレクトリ(デフォルトは/var/www/dehydrated/
)を、すべての証明書リクエストドメインに対してhttp://<your-domain>/.well-known/acme-challenge/
の場所で提供するWebサーバーが必要です。
ロール変数
必要な変数:
dehydrated_contactemail
letsencryptアカウントのためのアドレス。主に証明書の有効期限通知のために使用されますが、cronジョブが正常に動作していれば通知は発生しません。
dehydrated_contactemail: certmaster@example.com
dehydrated_letsencrypt_agreed_terms
letsencryptの利用規約に同意するには、変数dehydrated_letsencrypt_agreed_terms
を現在のライセンスURLに設定します。実際のURLはhttps://acme-v01.api.letsencrypt.org/termsで確認できます。
dehydrated_letsencrypt_agreed_terms: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
dehydrated_domains
証明書リクエスト用のドメインのリスト。各行ごとに証明書が作成され、/etc/dehydrated/certs/
フォルダーに行の最初のドメイン名で保存されます。最初のドメインが共通名となり、他のドメインは証明書の別名となります。
dehydrated_domains: |
example.com
example.org www.example.org blog.example.org
dehydrated_deploy_cert
証明書はapacheやdovecotなどのサービスが読み取れる必要があります。ただし、特定のサービスのみがこの証明書を読み取ることが許可されるべきです。そのため、各証明書ごとにオーナー/グループを特定の値に変更する必要があります。セキュリティ上の理由から、これはrootユーザーのみが実行できます。
汎用的な解決策として、dehydrated_deploy_cert
という変数があります。この変数には証明書のデプロイメントに関するbashスクリプトを含める必要があります。デプロイメント時の通常のタスクは、証明書を他のディレクトリにコピーし、ファイルのオーナー/権限を変更し、サービスを再起動することです。
このコードは通常のdehydratedフックと同様に呼び出されますが、完全なdehydratedの実行の後にroot権限で実行されます。生成された各証明書に対して一度呼び出されます。
パラメータ:
DOMAIN
プライマリドメイン名、すなわち証明書の共通名(CN)。KEYFILE
(ファイル名: privkey.pem) プライベートキーを含むファイルのパス。CERTFILE
(ファイル名: cert.pem) サインされた証明書を含むファイルのパス。FULLCHAINFILE
(ファイル名: fullchain.pem) フル証明書チェーンを含むファイルのパス。CHAINFILE
(ファイル名: chain.pem) 中間証明書を含むファイルのパス。TIMESTAMP
(ファイル名: chain.pem) 指定された証明書が作成されたタイムスタンプ。
例:
dehydrated_deploy_cert: |
mkdir -p /etc/nginx/ssl/${DOMAIN}
cp "${KEYFILE}" "${CERTFILE}" "${FULLCHAINFILE}" "${CHAINFILE}" /etc/nginx/ssl/${DOMAIN}
chown root:root /etc/nginx/ssl/${DOMAIN}/*
chmod 600 /etc/nginx/ssl/${DOMAIN}/*
systemctl restart nginx.service
dehydrated_run_cron_on_every_ansible_run
このロールは、各実行時に証明書を作成または更新するためのcronスクリプトをトリガーします。この動作を無効にするには、次のように設定します:
dehydrated_run_cron_on_every_ansible_run: false
オプションの変数:
dehydrated_challengesdir
acme-challengeファイル用のディレクトリ。あなたのWebサーバーは、このディレクトリをすべての前述のドメインに対してhttp://<your-domain>/.well-known/acme-challenge/
の位置で公開する必要があります。このディレクトリは存在しない場合に作成され、dehydratedユーザー専用の書き込み可能でWebサーバーによってのみ読み取り可能である必要があります。このロールによって強制されます。
dehydrated_challengesdir: /var/www/dehydrated/
さらに多くの変数
スーパーユーザーがより多くの制御を必要とするためのいくつかの珍しい変数もあります。詳細についてはdefaults/main.yml
を確認してください。
依存関係
なし。
例のプレイブック
- hosts: all
remote_user: root
vars_files:
- dehydrated_vars.yml
roles:
- martin-v.dehydrated
例の変数ファイル
dehydrated_contactemail: [email protected]
dehydrated_letsencrypt_agreed_terms: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
dehydrated_domains: |
example.com
example.org www.example.org blog.example.org
dehydrated_deploy_cert: |
mkdir -p /etc/nginx/ssl/${DOMAIN}
cp "${KEYFILE}" "${CERTFILE}" "${FULLCHAINFILE}" "${CHAINFILE}" /etc/nginx/ssl/${DOMAIN}
chown root:root /etc/nginx/ssl/${DOMAIN}/*
chmod 600 /etc/nginx/ssl/${DOMAIN}/*
systemctl restart nginx.service
ヒント
ansibleデプロイメントで証明書を作成するには、通常のcronスクリプトを呼び出すことができます:shell: "/etc/cron.weekly/dehydrated"
。フォルダーtests
には、完全に動作する例が含まれています。
公式のletsencryptクライアントからのインポートについては、dehydrated import wikiページを参照してください。
未解決のタスク
- より良いテストのためにmoleculeを使用してください。
ライセンス
MIT
著者情報
このロールは2016年に作成され、2017年にMartin V.によって改善されました。
Install and configure [`dehydrated`](https://github.com/lukas2511/dehydrated). Create user for privilege dropping and cron configuration for certificate renewals.
ansible-galaxy install martin-v.letsencryptsh