Let's Encrypt 証明書を Azure Web Apps へインポートする

## はじめに
Azure Portal から GoDaddy 経由で証明書を購入することができるが、自分で作った証明書を適用したいという場面も存在するかもしれません。今回は、Let's Encrypt 証明書を利用して、Azure Web Apps へインポートを行い、はたして適用されているのかを確認してみます。

## Web Apps にカスタムドメインを適用
事前にドメインを購入し、Azure DNS などにレコードがあることを確認してください。
Web Apps の `カスタムドメイン` より `+ カスタムドメインの追加` ボタンを押して、任意のカスタムドメインを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/9e1423ad-3cb5-94ea-fce0-aa984c344415.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/7fd6ae33-65c7-1332-e87a-e9cfe95abfba.png)


## Let's Encrypt 証明書の発行
Let's Encrypt の証明書の発行は、コマンドを実行して発行することができますがクライアントアプリをインストールする手間などがあるため、こちらの @tappie さんが作成してくれましたツールと記事を参考にしブラウザ上で証明書が発行できる [SSLなう! (v2): https://sslnow.ml/]( https://sslnow.ml/) を利用しました。
https://qiita.com/tappie/items/76881fdf7996c57a105a

今回は、ドメイン名の所有確認を行う方法としまして、http-01 を選択しました。指定のパスのファイルに指定の文字列を記述し、Let's Encrypt 側が実際に所有権を持っているかの検証を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/c65d4a56-b6a4-d59e-f0c6-6ccb92ccaaa9.png)

Web Apps にて指定のフォルダとファイルを作成するには、`高度なツール` である Kudu を利用すると簡単に実施することができます。高度なツールへ移動後に、上部メニューにある `Debug console` → `CMD` へ移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/76743d6c-6e37-cfe9-ddb0-e84439e347e6.png)

`site/wwwroot` フォルダへ移動し、その配下にて、`.well-known/acme-challenge/<指定された文字列>` といったように階層ごとにフォルダを作成します。フォルダを作成する際には、下のスクリーンショットにある通り .../ wwwroot の右側に `+` ボタンをクリックして、`New folder` を選択するとフォルダ名を指定して作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/fe76c931-8776-a0c2-a4a5-9a450b03745f.png)


`/<指定された文字列>` 配下には、Let's Encrypt 側が認識できるように `index.html` を作成し、その中にSSLなう! (v2) の `3. ドメイン名の所有確認` にある `ファイル内容 (1 行です)` の値を貼り付けます。その後、 `3. ドメイン名の所有確認` の `確認` ボタンを押して検証を実施します。確認ボタンを一度押してしまうとトークン発行からやり直しになるので、ブラウザで対象の URL にアクセスしてファイルの内容が表示されるのを確認することをおすすめします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/d3e2ccb9-a90b-49a5-a901-68ee5215703a.png)

その後の SSL 発行の手順は同様となります。

## pem 形式から pfx 形式の証明書へ変換
SSLなう! (v2) を使用して、発行される Let's Encrypt の証明書は pem 形式であるので、Azure 上で独自ドメインの証明書をインポートするには pfx 形式として変換作業を行います。ここでは、openssl コマンドを使用して変換を行います。実行場所はどこでも大丈夫ですが、今回は自分のローカル PC で実行しました。

`4. 証明書発行申請` で発行された SSL 秘密鍵の内容をコピペして、`private.pem` として保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/f46f37ee-3d4b-b0e4-9412-a277e95d1cfe.png)

`5. 発行された証明書` で発行された `cert.pem (サーバ証明書)` の内容をコピペして、`cert.pem` として保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/600b4c32-c04b-e51b-75f2-7c2483a3ae31.png)

以下の openssl コマンドを利用して、private.pem と cert.pem をファイルから、pfx 形式の証明書を作成します。pfx 形式の証明書を作成するコマンドを実行するとパスワードを設定する必要がありますので、任意のパスワードを設定します。

```
$ openssl pkcs12 -export -inkey private.pem -in cert.pem -out <証明書名>.pfx
Enter Export Password:
Verifying – Enter Export Password:
```

## Azure Web Apps に Let's Encrypt 証明書を適用
Azure Portal の Web Apps の画面に戻り、`TLS/SSL の設定` へ移動します。証明書を適用するには、赤枠で囲まれている `+ TLS/SSL バインディングの追加` ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/26692342-ede4-af52-b7ec-8a40f83dc7a1.png)

該当するカスタムドメインを選択し、`PFX 証明書のアップロード` ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/d3a43b44-42cd-fd97-afe4-a5c9aad2cc9a.png)

pfx 形式の証明書をアップロードする画面になるので、先ほど作成した pfx 形式の証明書と設定したパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/0d073291-cccc-9d05-f092-052ffc5ce1c7.png)

アップロードが完了すると、TLS/SSL バインディングの設定になりますので、カスタムドメインと先ほどアップロードしましたプライベート証明書を選択します。TLS/SSL の種類は `SNI SSL` としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/7e51fceb-bf03-12f0-1ec7-49fce7c5d2b1.png)

該当の Web Apps の URL へブラウザにてアクセスをし、アドレスバーの左にある鍵マークをクリックすると証明書情報が表示されます。発行者を確認すると、`Let's Encrypt Authority X3` が表示され適用されていることを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/3ba2fb80-4637-22d2-fc84-8238bac6ba12.png)

## おわりに
無事に Let's Encrypt の証明書から Azure Web Apps へ適用したことを確認することができました。上にもある通り、Let's Encrypt の有効期限を見ると、90 日間しかないため管理が重要となってきます。マニュアルにて更新作業を行うのもよいのですが、90 日間だと頻度が多いため自動で更新できる仕組みを作ったほうが良いかもしれません。