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を試してみようと思う。