ansibleを使ってlets encryptを設定しようと思ったので、やった作業を記録しておく
ansible-galaxyから良さげなroleを探す
ansible-galaxyを使えばansibleの設定を色々まとめてくれる。ansible-galaxyで「BROWSE ROLES」をクリックするとキーワードでroleを調べることが出来るので、「encrypt」というキーワードで調べてみると何個か「letsencrypt」という名前のroleがあった。こういう場合はダウンロード数が多い奴を選べは無難な気がするので、今回はandreaswolf.letsencryptを使うことにした。他も色々あったけど、READMEが不十分だったり、機能がイマイチだったりで使えなかった。ちなみにUbuntuでやっているので、Fedoraなど用のroleは対象から外したので試してない。
{% include 'includes/ad-content.html' %}
roleのインストール
以下のコマンドでインストールした
$ ansible-galaxy install andreaswolf.letsencrypt -p /path/to/roles
rolesを保存する場所を指定したかったのでこんな感じにした。
roleの設定
READMEを見ながら設定した。
必須の設定
外部から「ssl化したいドメイン/.well-known/acme-challenge」にアクセス出来て、そのアクセス先を{% raw %}{{ acme_tiny_challenges_directory }}{% endraw %}に設定する必要がある。今回nginxをwebサーバに使ったのでnginxの設定ファイルに
location /.well-known/acme-challenge {
alias {{acme_tiny_challenges_directory}};
}
な感じで書いておいて、設定ファイルをansibleのtemplateモジュールを使って反映させた。
ssl関連の設定
letsencrypt_certs:
-
name: "an_easily_recognizable_name__this_is_used_for_the_csr_file"
keypath: "/path/to/your/keys/anything-you-like.key"
certpath: "/path/to/your/certs/anything-you-like.crt"
chainedcertpath: "/path/to/your/certs/anything-you-like.chained.pem"
host: "myhost.example.com"
-
name: "multidomain cert"
keypath: "/path/to/your/keys/example.org.key"
certpath: "/path/to/your/certs/example.org.crt"
host:
- "foo.example.org"
- "bar.example.org"
- nameは適当に付けた
- keypath、certpathはchainedcertpathは/etc/ssl/hoge内に設定した
- hostは1個でも複数でもおk
他に設定出来る項目として
- key_ownerは作成されるファイルのユーザー名
- key_groupは作成されるファイルのグループ名
- key_permissionsは作成されるファイルの権限、"0600"みたいにクウォートを入れて設定するらしい
があるらしいがやってない。
letsencryptでssl関連のファイルを作った後の設定
ssl設定をnginxで反映させたいので、それ用のnginxの設定テンプレートを作って反映させた。yml、テンプレートを一部抜粋するとこんな感じ。テンプレート名は「ホスト名.ssl」という名前で保存した
ansibleのymlファイル
tasks:
- name: create sites-available dir
template: src=/path/to/template/{{item.1}}.ssl dest=/path/to/nginx/sites-available/{{item.1}}
with_subelements:
- "{{letsencrypt_certs}}"
- host
nginxの設定
server {
listen 80;
listen [::]:80;
server_name xxx;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name xxx;
ssl_certificate {{item.0.certpath}};
ssl_certificate_key {{item.0.keypath}};
ssl_trusted_certificate {{item.0.chainedcertpath}};
ssl_stapling on;
ssl_stapling_verify on;
.....
location /.well-known/acme-challenge {
alias {{acme_tiny_challenges_directory}};
}
....
}
これで反映できる。あとはnotifyとかして、nginxをreloadして設定を反映させる。
ただし、このroleではget https for freeのような手動の操作をしないとQualys ssl labsでB判定になっちゃうので、また別のroleを試してみようと思う。