概要
以下の3つのサービスを組み合わせることで Let's Encrypt 無料 SSL 証明書をシステマチックに取得・運用することができます。
その実際のやり方を書きます。
- IBM Cloud Certificate Manager
- IBM Cloud Functions
- IBM Cloud Internet Services
事前準備
ドメイン準備
今回は ibmjapan.com
を用意しました。
サブドメインとして khayama.ibmjapan.com
を設定し、IBM Cloud Internet Services を名前解決に利用します。
SSL 証明書を適用するためのサンプルウェブサイトとして、Cloud Foundry アプリ を使うために、カスタムドメインを Cloud Foundry 組織に登録しておきます。
DNS レコードの登録
khayama-letsencrypt
のホスト名でサンプルウェブサイトを立てられるように DNS レコードを登録します。
今回は us-south
リージョンにサンプルウェブサイトを立てるので、以下のドキュメントにある custom-domain.us-south.cf.cloud.ibm.com
を CNAME で登録します。
サンプルウェブサイトの準備
以下の記事内容に沿って、サンプルウェブサイトを立てます。
これで http ベースでサンプルウェブサイトに名前解決してアクセスする、というところまで準備ができました。
IBM Cloud Certificate Manager の作成
IBM Cloud のカタログから Certificate Manager を注文します。
Callback URL として IBM Cloud Functions を作成
Let's Encrypt のドメイン検証プロセスに関して応答するアクションを IBM Cloud Functions で実装します。
サンプルコードがあるので、その一部を改変して使います。
サンプルコードのダウンロード
Github に公開されたファイルをダウンロードします。
git clone https://github.com/ibm-cloud-security/certificate-manager-domain-validation-cloud-function-sample.git
cd certificate-manager-domain-validation-cloud-function-sample
IBM Cloud Internet Services の CRN を取得・置換
自アカウントにある IBM Cloud Internet Services のサービス名から検索して CLI で CRN を取得します。
export cisCrn=`ibmcloud resource service-instance -g Default CIS-Enterprise-Usage1 | grep crn | awk '{print $2}'`
echo $cisCrn
その後、さきほどダウンロードした IBM Cloud Functions 用のスクリプト内のコードを置換します。
sed -i -e "s|crn:v1:bluemix:public:internet-svcs:global:a/<YOUR_ACCOUNT_ID>:<YOUR_INSTANCE_ID>|$cisCrn|" main.js
さらに IBM Cloud Certificate Manager を作成したリージョン名について、スクリプト内のコードを置換します。
今回は東京リージョンに作成した IBM Cloud Certificate Manager を使うため、 jp-tok
として置換します。
sed -i -e "s|<YOUR_INSTANCE_REGION>|jp-tok|" main.js
IBM Cloud Functions で使用するパラメータの取得
IBM Cloud Functions に iamApiKey
のパラメータを設定する必要がありますのでコマンドで作成します。
ibmcloud iam api-key-create khayama-letsencrypt -d "for certification management" --file letsencryptKey.json
export $( echo $(cat letsencryptKey.json) | jq -r 'keys[] as $k | "export \($k)=\(.[$k])"')
export iamApiKey=$apikey
IBM Cloud Functions に allowedCertificateManagerCRNs
のパラメータを設定する必要がありますので、さきほど作成した IBM Cloud Certificate Manager のサービス名から検索して CLI で CRN を取得します。
allowedCertificateManagerCRN=`ibmcloud resource service-instance khayama-cm | grep crn | awk '{print $2}'`
export allowedCertificateManagerCRNs='{"'$allowedCertificateManagerCRN'":true}'
IBM Cloud Functions アクションの作成
Github からダウンロードし、さきほど一部改変をおこなったスクリプトを元に IBM Cloud Functions アクションを作成します。
ibmcloud fn action create cert-mgr-khayama main.js --kind nodejs:10
ibmcloud fn action list
IBM Cloud Functions で使用するパラメータの設定
さきほど変数として設定した iamApiKey
, allowedCertificateManagerCRNs
を IBM Cloud Functions アクションのパラメータとして設定します。
ibmcloud fn action update cert-mgr-khayama -p iamApiKey $iamApiKey -p allowedCertificateManagerCRNs $allowedCertificateManagerCRNs
ibmcloud fn action get cert-mgr-khayama parameters
IBM Cloud Functions を Web アクションとして有効化
以下の画面にて「Web アクションとして有効化」にチェックを入れ、発行された URL をコピーします。
IBM Cloud Certificate Manager 通知チャネルの追加
証明書を注文する前に、通知チャネルを設定する必要があります。
さきほどコピーした IBM Cloud Functions の Web アクションの URL を「コールバック URL」として追加します。
「テスト接続」をおこない、正常に送信されることを確認します。
IBM Cloud Certificate Manager 証明書の注文
上記手順を踏んだあとは、以下の画面から「証明書の注文」がおこなえます。
「1次ドメイン・ネーム」は *.khayama.ibmjapan.com
としてワイルドカード証明書を Let's Encrypt で取得する設定で注文します。
すると、一時的に「注文保留中」の画面になります。
IBM Cloud Functions が正しく機能していれば、1分以内には注文が完了し、証明書が発行されたことがわかります。
これで Let's Encrypt 無料 SSL 証明書の取得は完了です。
取得した SSL 証明書を Cloud Foundry 組織にアップロード
取得できた SSL 証明書をダウンロードし、 Cloud Foundry 組織に登録しておいたカスタムドメインに対して、アップロードします。
cd khayama-letsencrypt
ibmcloud account domain-cert-add khayama.ibmjapan.com -c khayama-letsencrypt.pem -i khayama-letsencrypt_intermediate.pem -k khayama-letsencrypt.key -o IBMCLOUDJPN -r us-south
サンプルウェブサイトで https 暗号化通信を確認
SSL 証明書を適用するためのサンプルウェブサイトとして準備した Cloud Foundry アプリ の経路を確認すると、 SSL 証明書を利用した https 暗号化通信で保護されていることが確認できます。
実際にアプリ URL にアクセスしてみても、ブラウザから Let's Encrypt の SSL 証明書が使われていることが確認できます。
さいごに
IBM Cloud Certificate Manager を使って、Let's Encrypt 無料 SSL 証明書を取得できましたが、ドメイン検証プロセスの応答に必要な IBM Cloud Functions のエンドポイントを実装するところがミソでしたね。
IBM Cloud Internet Services の DNS 機能も組み合わせることで、証明書管理を自動化し、ウェブサイトをセキュアに運用し続けることができます。
ぜひ使ってみてください。