おはようございます。
胃が気持ち悪くて1日寝込んでたHeyGです。
以前の仕事でAzureを初めて触りました。
そこで既存のVirtualMachine(仮想マシン)をSSL対応したので記事に残しておきます。
Azure VMのSSL対応の方法
AzureのVirtualMachine(仮想マシン)のSSL対応は色々あります。
そもそも証明書の取得方法はいくつかあります。
- VM内でlets encryptで自己証明書を作成
- Azureのキーコンテナーで自己証明書を作成
- AzureのApp Service証明書で証明書を作成
しかし昨今のSSL動向は1や2で作成した証明書を危険な証明書として扱われ、警告がでるようになっています。
3で作成できる証明書はきちんとした証明書を発行できますが、有料です。
AWSなんかだと無料で警告のでない証明書を簡単に発行できるんですが、調べた限りは無理でした。
また、証明書を設定する方法もいくつかあります。
- VMのWebサーバーソフトウェア(ApacheやNginxなど)に直接設定
- アプリケーションゲートウェイをかませて、ゲートウェイにキーコンテナーの証明書を設定
- App Service証明書で作成した証明書をキーコンテナー経由でVMに保存し1と同じく直接設定
調べた限りAzureで警告の出ない証明書を設定する方法は
AzureのApp Service証明書で証明書を作成してキーコンテナー経由でVMのWebサーバーソフトウェア(ApacheやNginxなど)に直接設定
するほかなさそう。
ゲートウェイを使っているのであればゲートウェイに設定するのが妥当だと思いますが、最小構成では基本的にゲートウェイを使わないと思いますので、今回は触れません。
また、VMではなくAppServiceを使用している場合、無料の証明書が作れるようですが、そもそもAppService自体が割と高いです。
App Service証明書の作成
AzureポータルからAppService証明書を新規作成します。
「名前」はポータル上の表示名
「ネイキッド ドメインのホスト名」は証明書を使いたいドメイン
「リソースグループ」は作成してるVMと同じリソースグループを指定
「証明書SKU」はシングルドメインかワイルドカードドメインかの違い
「法律条項」は契約にあたっての条項の確認
です。
設定して問題なければ作成してください。
証明書SKUのS1 StandardとW1 ワイルドカードの違い
違いは単純です。
example.com というドメインを使う場合
S1 Standardはexample.comだけをつかう時
W1 ワイルドカードはmain.example.comやsub.example.comをつかう時
基本的にはS1 Standardで問題ないでしょう
料金的には7838円と他の証明書サービスよりはお得だったりしますが、AWSなら無料だし、そこまでしてAzureにする必要があるのか謎ですが…
まあ取引先によってはAzureでお願いされる事がありますから逃げられない道ですが…
AppService証明書の構成を設定
今回は手順の1と2だけで、3はAppServiceを使っている場合に使用します。
AppService証明書の構成で格納設定
お使いのキーコンテナーに証明書の秘密鍵が保存されます。
VMで使う場合はこのキーコンテナーを経由して証明書を取得します。
AppService証明書の構成で確認設定
証明書の構成と難しい表現ですが、ドメインの所有権を確認するだけです。
今回は「手動による確認」を行います。
方法は上記画像の①に使用する文字列が表示されているので、それを対象ドメインのTXTレコードに設定するだけです。
お名前.comでドメインを取得しているので、お名前.com側で設定します。
ホスト名に@を入力
TYPEをTXTへ変更
VALUEに①の文字列を入力
追加して保存してください。
しばらく待つと下記のような画面になります。
こうなると成功です。
VMでAzure CLIを使って証明書を取得設定
VM側で上記で生成した証明書を使う場合、Azure CLIを使って取得する必要があります。
なので、Azure CLIをVMにインストールする必要があります。
VMにAzure CLIをインストール
OS毎にインストール方法は少し違うので詳しくは公式を確認してください。
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest
VMにAzure CLIを使って証明書をダウンロード
Azure CLIへのアクセス方法は以下です。
az login
また、複数のサブスクリプションを所有している場合テナントIDを指定する必要があります。
az login --tenant example-tenant-id
キーコンテナーのシークレットに証明書の秘密鍵情報が保存されているので、その名前を確認しておいてください。
下記画像の赤枠部分です。
証明書のダウンロードは
# az keyvault secret download --name "画像で確認した名前" --vault-name "キーコンテナーの名前" --encoding base64 --file "保存する証明書名.pfx"
で行えます。
ちなみにダウンロードしたファイルはテキストエディタで見ても空なので注意してください。
それにパスワードが空で設定されているため、Azureの他サービスで使おうとしてもパスワードないけど?って怒られたりするので気をつけてください。
保存した証明書へのパスワード再設定方法は
# openssl pkcs12 -in 保存した証明書名.pfx -out temp.pem -nodes -password pass:"" # openssl pkcs12 -export -out 保存した証明書名.pfx -in temp.pem -password pass:"設定したいパスワード"
で行えます。
pfxをpemやkeyへ変換
ApacheやNginxに設定する場合pemやkeyを使ってると思います。
変換方法は以下になります。
pem
# openssl pkcs12 -in 保存した証明書名.pfx -nodes -out 保存したいpem名.pem Enter Import Password: MAC verified OK
key
# openssl pkcs12 -in 保存した証明書名.pfx -nocerts -nodes -out 保存したいkey名.key Enter Import Password: MAC verified OK
Apacheにインストールした証明書を設定
今回はApacheで行ったのでApacheの設定ファイルを貼っておきます。
アプリがTomcatを使って裏側で動作しているため、AJPでプロキシしてありますが適宜置き換えてください。
<VirtualHost *:80> ServerName example.com RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </VirtualHost> <Virtualhost *:443> ServerName example.com ProxyPass / ajp://localhost:8009/ SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCertificateFile /保存したディレクトリ/保存したpem名.pem SSLCertificateKeyFile /保存したディレクトリ/保存したいkey名.key </VirtualHost>
設定を終えたら、Apacheを再起動して設定完了です!
まとめ
昔設定したものを記事にしているため、少し内容が薄いかもしれません。
まあAzure VMでSSL対応をする場合は上記でいけますが、有料ですよというお話でした。
そこまでこだわりがなければAWSで構築した方がいいんじゃないかな?と思います。
ではまた。