RabbitMQをLet's encryptでSSL化


今回RabbitMQサーバーと有効なSSL証明書で通信したいので、 `stg-deploy-server.not-exist.com` ドメインを[Let's encrypt](https://letsencrypt.org/how-it-works/)という無料のサービスでSSL化しました。 イメージつかない場合まず[Nginxで試す](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-centos-7)といいと思います。

**まずサーバーの `80`と`443`番ポートを開けておいて**、外部からアクセスできるようにする必要があります。

そして `letsencrypt`のレポジトリをローカル`clone`してから、証明書を発行するコマンドを実行します。
コマンドに関する説明は[ここ](https://www.jumpingbean.co.za/blogs/mark/lets-encrypt-how-to-secure-your-site-and-communications)を参照できます。 `standalone`オプション要はNginx、Apache2などのウェブサーバー使わない場合に、登録手続きだけをしたいときに使います。今回RabbitMQに証明書を適応したいので、`standalone`オプションを使います。 `-d`オプションを後ろに認証したいドメインが続きます。

```
# git clone https://github.com/letsencrypt/letsencrypt
# cd letsencrypt
# ./letsencrypt-auto certonly --standalone -d stg-deploy-server.not-exist.com
```

これでうまくいくと下のような出力が表示されます。

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/stg-deploy-server.not-exist.com/fullchain.pem.
   Your cert will expire on 2016-11-03. To obtain a new or tweaked
   version of this certificate in the future, simply run
   letsencrypt-auto again. To non-interactively renew *all* of your
   certificates, run "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

これでディレクトリ `/etc/letsencrypt/live/stg-deploy-server.not-exist.com/`の下に四つファイルが生成されたことが確認できます。
`live`下のファイルは全部シンボリックリンクです。

```
# ls -l /etc/letsencrypt/live/stg-deploy-server.not-exist.com/
合計 0
lrwxrwxrwx 1 root root 72  8月  5 16:28 cert.pem -> ../../archive/stg-deploy-server.not-exist.com/cert1.pem
lrwxrwxrwx 1 root root 73  8月  5 16:28 chain.pem -> ../../archive/stg-deploy-server.not-exist.com/chain1.pem
lrwxrwxrwx 1 root root 77  8月  5 16:28 fullchain.pem -> ../../archive/stg-deploy-server.not-exist.com/fullchain1.pem
lrwxrwxrwx 1 root root 75  8月  5 16:28 privkey.pem -> ../../archive/stg-deploy-server.not-exist.com/privkey1.pem
```

ここで**重要**なのは 四つのファイルの権限は全部`root`になっていることです。 これらのファイルの`owner:group`を変更しないと、RabbitMQ中のMochiwebがHTTPのインターフェースとしてリクエストが受付できないです。ログファイル `/var/log/rabbitmq/rabbit@stg-deploy-server.log`に次のようなエラーが出しています。


```
=ERROR REPORT==== 5-Aug-2016::17:42:58 ===
    application: mochiweb
    "Accept failed error"
    "{error,{options,{cacertfile,\"/etc/letsencrypt/live/stg-deploy-server.not-exist.com/chain.pem\",\n                            {error,eacces}}}}"
```

なのでファイルのオーナーを`rabbitmq`に修正する必要があります。

```
# chown -R rabbitmq:rabbitmq /etc/letsencrypt/live
# chown -R rabbitmq:rabbitmq /etc/letsencrypt/archive
```

最後にRabbitMQのSSL部分を設定します。
`/etc/rabbitmq/rabbitmq.config`ファイルのSSL部分は次のようになっています。


```
[
 {rabbit,
  [
   {tcp_listeners, [{"10.1.1.141", 5672},
                     {"::1",       5672}]},

  
   {ssl_listeners, [5671]},

   {ssl_options, [
                  {cacertfile, "/etc/letsencrypt/live/stg-deploy-server.not-exist.com/fullchain.pem"},
                  {certfile,   "/etc/letsencrypt/live/stg-deploy-server.not-exist.com/cert.pem"},
                  {keyfile,    "/etc/letsencrypt/live/stg-deploy-server.not-exist.com/privkey.pem"},
                  {verify,verify_none},
                  {fail_if_no_peer_cert,false}
   ]}
...

 {rabbitmq_management,
  [
   {listener, [{port,     65171},
               {ip,       "10.1.1.141"},
               {ssl,      true},
               {ssl_opts, [{cacertfile, "/etc/letsencrypt/live/stg-deploy-server.not-exist.com/fullchain.pem"},
                           {certfile,   "/etc/letsencrypt/live/stg-deploy-server.not-exist.com/cert.pem"},
                           {keyfile,    "/etc/letsencrypt/live/stg-deploy-server.not-exist.com/privkey.pem"},
                           {verify,verify_peer},
                           {fail_if_no_peer_cert,false}
                           ]}
   ]}
...

```

これでウェブブラウザから `https`でドメインの65171番ポートにアクセスすると画面表表示されます。


![スクリーンショット 2016-08-05 18.15.11.png](https://qiita-image-store.s3.amazonaws.com/0/54698/52f07a71-62c5-a3da-5c64-c0dabefd3b13.png)