しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure CLI と Key Vault を使って自己署名証明書を作成する

たまに検証とかで必要になるので自己署名証明書を作ることがあるのですが、コマンドを毎回覚えていられないので最近は Azure Key Vault で作ってしまうことが多いです。

Azure Portal から作るのは少し面倒なのと、内部で使われている API バージョンが古くて新しい機能に対応していないみたいなので、Azure CLI で作る方法を試しました。

Cloud Shell で行えば Azure CLI のセットアップも不要なので、簡単に試すことが出来ます。ファイルのアップロードとダウンロードも行えるので作成した証明書や鍵のやり取りも楽です。

自己署名証明書を作成する

Azure Portal からは簡単に作れますが、Azure CLI の場合は先にポリシーを記述した JSON を用意する必要があります。ポリシーのテンプレートは get-default-policy を叩けば生成できます。

# デフォルトのポリシーをファイルに書き出す
az keyvault certificate get-default-policy > policy.json

以下のように見覚えのある形式で JSON が出力されるので、TLS 向けなら最低限 subjectsubjectAlternativeNames を追加しておきます。

ちなみに Azure Portal からは EC を使った証明書を作成できませんが、Azure CLI なら作れます。*1

{
  "issuerParameters": {
    "certificateTransparency": null,
    "name": "Self"
  },
  "keyProperties": {
    "curve": "P-256",
    "exportable": true,
    "keySize": null,
    "keyType": "EC",
    "reuseKey": true
  },
  "lifetimeActions": [
    {
      "action": {
        "actionType": "AutoRenew"
      },
      "trigger": {
        "daysBeforeExpiry": 90
      }
    }
  ],
  "secretProperties": {
    "contentType": "application/x-pkcs12"
  },
  "x509CertificateProperties": {
    "keyUsage": [
      "digitalSignature"
    ],
    "subject": "CN=daruyanagi.com",
    "subjectAlternativeNames": {
      "dnsNames": [
      	"daruyanagi.com"
      ]
    },
    "validityInMonths": 12
  }
}

上の例では EC P-256 を使った証明書を作成していますが、以下のように keyProperties を変更すると RSA で作成できます。キーのサイズは RSA で使える適切なものを選べばよいです。

  "keyProperties": {
    "curve": null,
    "exportable": true,
    "keySize": 2048,
    "keyType": "RSA",
    "reuseKey": true
  },

他にも keyType には EC-HSM と RSA-HSM が選べそうですが、何が異なるのかは試してはいないです。大体のケースでは EC と RSA で問題なさそうです。

修正したポリシー JSON を使って、以下のコマンドで実際に自己署名証明書を作成します。

# mykeyvault に example という名前で証明書を作成する
az keyvault certificate create --name example --vault-name mykeyvault --policy @policy.json

f:id:shiba-yan:20190207162343p:plain

少し待つと作成が完了するので、後は秘密鍵と証明書をダウンロードしたり、Key Vault に対応したサービスから利用したりできます。ポリシーは少し分かりにくいですが、TLS 向けならほぼテンプレで行けます。

証明書のダウンロード

先ほど作成した証明書は download コマンドを使うと PEM か DER のどちらか指定した形式でダウンロードできます。簡単すぎるので特に説明は不要ないと思います。

# PEM 形式でエクスポート
az keyvault certificate download --name example --vault-name mykeyvault --encoding PEM --file example.crt

# DER 形式でエクスポート
az keyvault certificate download --name example --vault-name mykeyvault --encoding DER --file example.crt

f:id:shiba-yan:20190207162648p:plain

OpenSSL を使って中身の確認をしておきました。ちゃんと EC P-256 で作成されています。

PFX のダウンロード

最後は秘密鍵を含んだ形でダウンロードします。PFX でダウンロードする certificate のコマンドは用意されていないですが、Key Vault で作成した秘密鍵は secret 扱いで保存されているのでダウンロード出来ます。

以下の Issue に Workaround としてダウンロード方法が紹介されています。

Key Vault の secret には PKCS#12 として保存されているので、そのままダウンロードして拡張子を付ければ Windows からも扱える形式になります。

そのままだと Base64 でエンコードされた状態なので、encoding を指定してバイナリとして保存します。

# PKCS#12 形式でエクスポート
az keyvault secret download --name example --vault-name mykeyvault --encoding base64 --file example.pfx

f:id:shiba-yan:20190207162954p:plain

エクスポートされた PFX はパスワード無しなので扱いには気を付けましょう。

Windows を使って PFX の中身を一応確認しておきました。ちゃんと秘密鍵が含まれています。

f:id:shiba-yan:20190207163119p:plain

手動で作成するのと異なり、Key Vault で作ると自動で更新もしてくれるので結構便利です。ポリシーをちゃんと書けば他の Issuer に対しても証明書を発行できるはずです。

もう少し Key Vault に対応したサービスが増えるともっと便利になるはずです。*2

*1:ただし Azure Portal 上での表示には未対応、今は App Service へのインポートも出来ない

*2:例えば Application Gateway とか CDN のこと