Azure App Service 証明書を AWS Certificate Manager へインポートしてみた

2022.09.10

いわさです。

以下の記事で App Service 証明書を購入して使ってみたのですが、App Service 証明書について調べている中で、Azure 外でも利用出来ることを知りました。

一方で AWS Certificate Manager (ACM) では証明書のインポートを行うことが出来ます。
ユースケースが全く思い浮かばないですが、興味本位で Azure App Service 証明書を ACM にインポート出来るのかを試してみました。

App Service 証明書をエクスポート

まず、App Service 証明証については以下のように購入済みです。

そして、Azure App Service Team Blob の以下の情報を頼りに証明書のエクスポートを行います。

この手順では証明書エクスポート用の関数を定義して利用しています。
ほぼそのまま使ったのですが、私は macOS で利用していたので以下のようにパス部分だけ変更しました。
元のスクリプトだと期待した位置にダウンロードされませんでした。(Windows だとうまくいった)

    Function Export-AppServiceCertificate
    {
:
    $currentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
    [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
    [io.file]::WriteAllBytes("appservicecertificate.pfx",$pfxCertObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12,$pfxPassword))

:

    # Print the password for the exported certificate
    Write-Host "Created an App Service Certificate copy at: $currentDirectory/appservicecertificate.pfx"
    Write-Warning "For security reasons, do not store the PFX password. Use it directly from the console as required."
    Write-Host "PFX password: $pfxPassword"

    }

そして、定義したExport-AppServiceCertificateを使ってみます。
処理の中でConnect-AzAccountが使われているので以下のように認証を行います。

成功すると以下のように PFX ファイルが生成され、PFX のパスワードがコンソール上に表示されていると思います。

> Export-AppServiceCertificate -loginId admin@aad.tak1wa.com -subscriptionId aaaaaaaa-1111-2222-3333-444444444444 -resourceGroupName common -name azuretak1wacom     
WARNING: TenantId 'aaaaaaaa-1111-2222-3333-444444444444' contains more than one active subscription. First one will be selected for further use. To select another subscription, use Set-AzContext. 
To override which subscription Connect-AzAccount selects by default, use `Update-AzConfig -DefaultSubscriptionForLogin 00000000-0000-0000-0000-000000000000`. Go to https://go.microsoft.com/fwlink/?linkid=2200610 for more information.

Account              SubscriptionName  TenantId                             Environment
-------              ----------------  --------                             -----------
admin@aad.tak1wa.com hoge subscription aaaaaaaa-1111-2222-3333-444444444444 AzureCloud

Name               : hoge subscription (aaaaaaaa-1111-2222-3333-444444444444) - aaaaaaaa-1111-2222-3333-444444444444 - admin@aad.tak1wa.com
Account            : admin@aad.tak1wa.com
Environment        : AzureCloud
Subscription       : aaaaaaaa-1111-2222-3333-444444444444
Tenant             : aaaaaaaa-1111-2222-3333-444444444444
TokenCache         : 
VersionProfile     : 
ExtendedProperties : {}

Get Secret Access to account admin@aad.tak1wa.com has been granted from the KeyVault, please check and remove the policy after exporting the certificate
Created an App Service Certificate copy at: /Users/iwasa.takahito/work/hoge0910cert/appservicecertificate.pfx
WARNING: For security reasons, do not store the PFX password. Use it directly from the console as required.
PFX password: <hogehoge password>

AWS Certificate Manger (ACM) へインポート

続いて ACM へインポートしたいと思いますが、インポートする前にいくつか準備が必要です。

先程生成された証明書は PFX 形式なので、ACM へインポートするために PEM 形式に変換する必要があります。
以下の記事を参考に OpenSSL を使って変換をしていきたいと思います。

秘密鍵

以下のコマンドを実行して PFX ファイルから証明書の秘密鍵を抽出します。
先程表示されたパスワードを入力してもエラーになる場合は、パスワードを外部ファイルとして読み込ませてみてください。

# openssl pkcs12 -in ./appservicecertificate.pfx -nocerts -out privatekey.pem
Enter Import Password:
Can't read Password

# openssl pkcs12 -in ./appservicecertificate.pfx -passin file:hoge.txt -nocerts -out privatekey.pem  
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

秘密鍵が抽出されたら、暗号化を解除します。
このとき、ACM ではパスフレーズが設定された秘密鍵のインポートが出来ないということを知りました。

# openssl rsa -in ./privatekey.pem -out withoutpw-privatekey.pem 
Enter pass phrase for ./privatekey.pem:
writing RSA key

証明書

以下のコマンドを実行して PFX ファイルから証明書を抽出します。

# openssl pkcs12 -in ./appservicecertificate.pfx -passin file:hoge.txt -clcerts -nokeys -out cert-file.pem
MAC verified OK

中間 CA

こちらは以下のコマンドで抽出することになっているのですが...

# openssl pkcs12 -in ./appservicecertificate.pfx -passin file:hoge.txt -cacerts -nokeys -chain -out ca-chain.pem 
MAC verified OK

# ls -l
total 40
-rw-r--r--  1 iwasa.takahito  staff  3295  9 10 18:06 appservicecertificate.pfx
-rw-r--r--  1 iwasa.takahito  staff     0  9 10 18:41 ca-chain.pem
-rw-r--r--  1 iwasa.takahito  staff  2570  9 10 18:39 cert-file.pem
-rw-r--r--  1 root            staff    51  9 10 18:33 hoge.txt
-rw-r--r--  1 iwasa.takahito  staff  1910  9 10 18:34 privatekey.pem
-rw-r--r--  1 iwasa.takahito  staff  1679  9 10 18:38 withoutpw-privatekey.pem

0 byte ですね。
先程の Azure App Service Team Blog にも記載されていますが、先程エクスポートした PFX ファイルには中間証明書が含まれていません。
PEM に変換しない場合でも一度証明書をインストールして中間証明書を含む形でエクスポートし直す必要があるようです。

その際にはこちらからダウンロードを行います。

PFX 形式の場合はまとめなおす必要があったのですが、今回は ACM へのインポートなのでこちらをca-chain.pemとして使用しました。

使ってみる

ここまでで ACM としては構成が完了したので、最後に使ってみます。
いつもの検証用の ALB - EC2 環境をデプロイします。

こちらは HTTP での構成になっているので、ALB に対してカスタムドメインでの HTTPS リスナーを追加します。
あとはセキュリティグループで HTTPS のアクセスを許可し、ALB への名前解決を行うエイリアスレコードを作成しました。

確認してみましょう。

# curl -v https://azure.tak1wa.com/

:

* Server certificate:
*  subject: CN=azure.tak1wa.com
*  start date: Sep  8 07:04:17 2022 GMT
*  expire date: Sep  8 07:04:17 2023 GMT
*  subjectAltName: host "azure.tak1wa.com" matched cert's "azure.tak1wa.com"
*  issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2
*  SSL certificate verify ok.
* Using HTTP2, server supports multiplexing

:

hoge

良さそうですかね。

さいごに

本日は Azure App Service 証明書を AWS Certificate Manager へインポートしてみました。

出来るのか出来ないのわからなかったのですが、出来ました。
ただ ACM ではインポートされた証明書は自動更新管理の対象外ですし App Service 証明書も DV 証明書なので、管理の手間が増えただけで利用することはあまり無いような気がしました。普通に Azure 側と AWS 側とどちらでもマネージド証明書をリクエストしたほうが良いかなという感じです。