Azure Apps ServiceでLet’s Encryptの証明書発行からインポートまで

2020-05-05App Service,Azure

Azure App Serviceを使用したLet’s EncryptのSSL証明書作成から利用までの手順をまとめてみました。
WebサーバーとしてAzure App Serviceを利用して、HTTP-01 challengeによりSSL証明書を発行します。

    • certbotをインストール
    • Let’s EncryptのHTTP-01 challengeを使用してでSSL証明書を発行
    • oopensslを使用して、pem形式からpfx形式に証明書を変換
    • App ServiceにLet’s EncryptのSSL証明書をインポート

※App ServiceへのSSH接続はAzure Portalから行っています。
※ファイルのダウンロードはFTPSを使用しています。
※この手順は一例であり、自身の開発環境に合わせて実施してください。

スポンサーリンク

Lets Encryptを使ってSSL証明書発行

HTTP-01 challengeでSSL証明書発行

Let’s Encryptでは、HTTP(S)アクセスによるドメイン検証でSSL証明書を発行できます。
HTTP-01 challengeがWebサーバーを利用したSSL証明書発行となります。

チャレンジの種類(Let’s Encrypt)

Azure App ServiceをWebサーバーとして利用して、HTTP-01 challengeによる証明書発行できます。

DNS-01 challengeでのSSL証明書発行手順や各チャレンジについては、こちらにまとめています。

今回の環境

今回は以下の環境で実施しています。
Let’s Encryptの証明書発行に最低限必要な環境としています。

    • 価格プラン:Basic B1
    • オペレーティングシステム:Linux
    • ランタイム スタック:PHP 8.2
    • 公開(Publish):コード
    • 公衆ネットワーク アクセス:アクセス制限なしで許可

App Serviceへのカスタムドメイン追加設定は事前に完了していた状態で実施しています。
カスタムドメイン追加設定手順については、こちらにまとめています。

手順は適時読み替えて下さい

ランタイムスタックやアプリ配置状況によってルートディレクトリなどが異なります。
手順については自身が利用するApp Serviceの設定や開発環境に合わせて修正下さい。

Azure PortalでSSH接続

Azure Portalからブラウザ経由でSSH接続できます。

SSH接続
左側のメニューでSSHを選択します。
移動を選択するとブラウザが表示されてSSH接続されます。

certbotをインストール

App Serviceにcertbotをインストールします。
certbotはLet’s Encrypt推奨のACME クライアントです。

Getting Started

※パッケージの更新は必須ではありません。以前パッケージ更新しないとインストール失敗する事があったので念のために手順に入れてます。
※App Serviceを再起動すると初期状態に戻ります。certbotを再インストールする必要があります。

certbotをインストール

#パッケージ更新

root@exxxxxxxxxxx:/home# apt list –upgradable
Listing… Done
adduser/oldstable 3.118+deb11u1 all [upgradable from: 3.118]
~以下略~

root@exxxxxxxxxxx:/home# apt -y upgrade
Reading package lists… Done
Building dependency tree… Done
~以下略~

#certbotインストール

root@exxxxxxxxxxx:/home# apt -y install certbot
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
The following additional packages will be installed:
~以下略~

certbotでSSL証明書発行

certbotを使用してSSL証明書を発行します。

※今回は–wでディレクトリを明示的に指定しています。ランタイムやアプリデプロイ状況により異なります。指定する場合は適時パスを修正して下さい。
※インターネットからアクセスが許可されている必要があります。

certbotで証明書発行

root@exxxxxxxxxxx:/home# certbot certonly –webroot -w /home/site/wwwroot -d www.example.com

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
(Enter 'c’ to cancel): admin@example.com #メールアドレスを入力

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: Y #承認の確認です。Yを選択します。

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let’s Encrypt project and the non-profit organization that
develops certbot? We’d like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: N #案内メール送信の確認です。必要な場合はYを選択
Account registered.
Requesting a certificate for www.example.com
Performing the following challenges:
http-01 challenge for www.example.com
Using the webroot path /home/site/wwwroot for all unmatched domains.
Waiting for verification…
Cleaning up challenges

IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/www.example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/www.example.com/privkey.pem
Your certificate will expire on 2024-05-12. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again. To non-interactively renew *all* of your
certificates, run “certbot 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

マニュアルでSSL証明書発行

自分でファイル配置してSSL証明書発行する事も出来ます。
認証用のファイルを該当のパスに配置します。
認証用のURL(例:http://www.example.com/.well-known/acme-challenge/発行されたファイル名)へインターネットからアクセス出来る必要があります。

マニュアルで証明書発行

root@exxxxxxxxxxx:/home# certbot certonly –manual -d www.example.com

http-01 challenge for www.example.com
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Create a file containing just this data:
002Hlo_G1Cxxxxxxxxxxxxxxxxxxxxxf2iYF_uESo.HKR2j8cvxnxxxxxxxxxxxxxxxxxxxGvnabdNDYc
And make it available on your web server at this URL:
http://www.example.com/.well-known/acme-challenge/002Hlo_G1Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_uESo
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – 

ファイル確認

/etc/letsencrypt/live/ドメイン名/配下に4つのファイルが生成されます。

cert.pem:SSL証明書
chain.pem:中間証明書
fullchain.pem:SSL証明書と中間証明書
privkey.pem:秘密鍵

ファイル確認

root@exxxxxxxxxxx:/home# ls -alh /etc/letsencrypt/live/www.example.com/

total 12K
drwxr-xr-x 2 root root 4.0K Feb 12 08:39 .
drwx—— 3 root root 4.0K Feb 12 08:39 ..
-rw-r–r– 1 root root 692 Feb 12 08:39 README
lrwxrwxrwx 1 root root 45 Feb 12 08:39 cert.pem -> ../../archive/www.example.com/cert1.pem
lrwxrwxrwx 1 root root 46 Feb 12 08:39 chain.pem -> ../../archive/www.example.com/chain1.pem
lrwxrwxrwx 1 root root 50 Feb 12 08:39 fullchain.pem -> ../../archive/www.example.com/fullchain1.pem
lrwxrwxrwx 1 root root 48 Feb 12 08:39 privkey.pem -> ../../archive/www.example.com/privkey1.pem

pem形式からpfx形式に変換

App Serviceで利用する場合はpfx形式である必要があります。
発行された証明書をpfx形式に変換します。
opensslコマンドでpem形式からpfx形式に変換します。
pfx形式のSSL証明書はexample.pfxとしています。

    • -export:PFX形式に変換
    • -inkey:秘密鍵ファイルを指定
    • -in:証明書ファイルを指定
    • -out:出力するPFX形式のファイル名を指定

※App Serviceに証明書を直接アップロードする場合はパスワードが必須になります。

pfx形式に変換

root@exxxxxxxxxxx:/home# cd /etc/letsencrypt/live/www.example.com/
root@exxxxxxxxxxx:/etc/letsencrypt/live/www.example.com/# openssl pkcs12 -export -inkey privkey.pem -in cert.pem -out www.example.com.pfx
Enter Export Password:
Verifying – Enter Export Password:
root@exxxxxxxxxxx:/etc/letsencrypt/live/www.example.com/# ls -l |grep pfx
-rw——-. 1 root root 1.6K Feb 12 08:55 www.example.com.pfx

再起動すると初期状態に戻る

App Serviceを再起動すると、/home以外のファイルが初期状態に戻ります。
/etc/letsencrypt以下のファイルもクリアされます。
再起動前に必要なファイルをダウンロードしておく必要があります。

発行してSSL証明書をApp Serviceに追加

証明書ファイルをダウンロードする

FTPSを利用してファイルをダウンロードします。

    • 接続時に利用する情報
      • ホスト名:(例:waws-prod-xxx-xxx.ftp.azurewebsites.windows.net)
      • ユーザー名:作成したユーザー名(例:app-example(リソース名)\ユーザー名)
      • パスワード:FTPSユーザー作成時に設定したパスワード

App ServiceのFTPS接続については公式サイトの以下の内容を参考にしています。

FTP/S を使用した Azure App Service へのアプリのデプロイ

FTPS使ってファイルダウンロード
App Serviceの構成でFTPSが有効になっている事を確認します。
左側のメニューでデプロイセンターを選択します。
FTPS資格情報のタブを選択します。
FTPS接続時に利用するユーザーを作成します。

接続情報を入力してログインします。
証明書を保管したディレクトリから証明書関連のファイルをダウンロードします。

証明書のインポート

発行したSSL証明書をAzure App Serviceにインポートします。

App Service 証明書をインポートする

証明書の追加
左側のメニューで証明書を選択します。
Bring your own certificates (.pfx)のタブを選択します。
証明書の追加を選択します。
ソースに証明書(.pfx)のアップロードを選択します。
証明書のファイルとパスワードを入力します。
フレンドリ名には管理用の名前を設定します。
検証後追加します。

バインディングの追加

インポートしたSSL証明書を利用する為にはカスタムドメインでバインディングを追加する必要があります。

バインディングの追加
左側のメニューでカスタムドメインを選択します。
対象のドメインでバインディングの追加を選択します。
TLS/SSLバインドの追加画面が表示されるので証明書を選択し検証追加します。
追加完了すると状態がセキュリティ保護となります。

アクセス確認

ブラウザでアクセスして証明書を確認します。

アクセス確認
対象のドメインにアクセスします。
Let’s Encryptの証明書が確認出来ます。

最後に

Azure App Serviceを使用してLet’s EncryptのSSL証明書を作成する手順をまとめてみました。
Azure App Serviceはデプロイするだけで簡単にWebサーバーとして利用できます。
Let’s Encryptの証明書発行に利用するのに非常に便利かと思いました。

引き続き色々試してみたいと思います。

App Serviceでのカスタムドメイン設定についてはこちら。

Azure Key Vaultの証明書期限切れ前のメール通知についてはこちら。

スポンサーリンク