App Service(Web Apps/Functions)に自己証明書がアップロードできない

本記事では、App Service(Web Apps/Functions) へ自己証明書をアップロードできないときの対処方法例について記載しています。
不明点や疑問点などあればぜひコメントください！


# 状況
Azure ポータルから自己証明書を App Service へアップロードした際に、以下のようなエラー文が表示されてしまう
`The password is incorrect, or the certificate is not valid`

エラー文を読むと、「パスワードが正しくありません、または証明書が有効ではありません」とのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256703/4e29a068-a64e-a8f7-3655-291f73b126d5.png)

# 調査
エラー文に従って以下 2 点を確認していきます。

1. パスワードは正しい？
1. サーバー証明書の要件を満たしてる？


## 1. パスワードは正しい？
パスワードが正しいか確認するために、以下 OpenSSL コマンドを使用して自己証明書 (pfx形式の TLS/SSL 証明書、以下例では仮に server.pfx としています) からそのパスワードでサーバー証明書を取得できるか試してみます。


```powershell
$ openssl pkcs12 -in server.pfx -clcerts -nokeys -out sample.cer
Enter Import Password: <パスワードを入力>
```

コマンド入力後、sample.cer ファイルが生成されていれば正しいパスワードであると推測できます。
もし、上記コマンドの実行時に `invalid password` のような警告が出れば、パスワードが正しくない可能性があるため、パスワードの末尾に改行コードが入っていたり、余分な文字が含まれていないか等確認してみてください。

## 2. サーバー証明書の要件を満たしている？
App Service にアップロード/インポートできる TLS/SSL 証明書には以下要件があります。この要件を満たしていない場合には、正しいパスワードを使用していても、App Service に証明書をアップロードできない状況が発生してしまう可能性があります。

- ★ Triple DES を使用して暗号化され、パスワードで保護された PFX ファイルとしてエクスポートされている
- 少なくとも 2048 ビット長の秘密キーが含まれている
- 証明書チェーン内のすべての中間証明書およびルート証明書が含まれている。


https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate#private-certificate-requirements

本記事では上記要件のうち、特に需要がありそうな上から 1 つめ要件 (★) について見ていきます。


### ■ PFX ファイルで使用されている暗号化アルゴリズムの確認
OpenSSL pkcs12 コマンドの -info オプションを実行して PFX ファイルで使用されている暗号化アルゴリズムを確認します。

```powershell
$ openssl pkcs12 -info -in server.pfx -noout
```
Triple DES が秘密鍵の暗号化アルゴリズムとして使用されている PFX ファイルでは、以下のように Shrouded Keybag: ...TripleDES... という文字列を確認できました。
例: `Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256703/e01f864b-9d9f-7600-dfa6-95040a0dacda.png)
AES256 が秘密鍵の暗号化アルゴリズムとして使用されていた場合には以下のように AES-256 という文字列が確認できました。
例: `Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256703/52b8a343-75d2-a356-287f-34e7b1c5eec9.png)
※上記コマンドの実行後に出力されている情報の詳細が気になる方は [RFC7292](https://www.rfc-editor.org/rfc/rfc7292) を参照してください

#### 異なる暗号化アルゴリズムを使用していた場合の対処例
現在(2022/01/30)、AES 256 など、Triple DES 以外のアルゴリズムを使用して秘密鍵を暗号化している PFX ファイルでは、App Service に証明書をアップロードできない状況が発生してしまう可能性があります。ここでは、OpenSSL v3 を使用した場合の対処例をご紹介いたします。
やり方はとっても簡単で、いつもの PFX ファイルの出力コマンドに `-legacy` オプションを付与するだけ。

```powershell
$ openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx -legacy
```
OpenSSL v1 では、規定で秘密鍵の暗号化に Triple DES が使用されていたようですが、以下ドキュメントによると、OpenSSL v3 ではそれが AES 256 に変更されたようです。`-legacy` オプションを付与することで、OpenSSL v1 と同様に Triple DES を使用して秘密鍵が暗号化された PFX ファイルを作成することができました。

https://www.openssl.org/docs/man3.0/man1/openssl-pkcs12.html#legacy

>The default encryption algorithm is AES-256-CBC with PBKDF2 for key derivation.
(中略)
>In the legacy mode, the default algorithm for certificate encryption is RC2_CBC or 3DES_CBC depending on whether the RC2 cipher is enabled in the build. The default algorithm for private key encryption is 3DES_CBC.


# 最後に
以上 App Service に自己証明書がアップロードできない際に考えられる要因とその対処法の例を簡単にご紹介しました！もし当該事象が発生した場合には、証明書のパスワードがあっているか、証明書の要件を満たしているかという観点でぜひ確認してみてください。

本記事が少しでも参考になれば嬉しいです。

証明書アップロードの機能以外にも、またいろいろ試して記事にできればと思います。
ありがとうございました！

# 参考文献
- [OpenSSL プロジェクト openssl-pkcs12](https://www.openssl.org/docs/manmaster/man1/openssl-pkcs12.html#info)
- [プライベート証明書の要件(Microsoft Docs)](https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate#private-certificate-requirements)
- [PKCS12-wikipedia](https://en.wikipedia.org/wiki/PKCS_12)
- [RFC7292(PKCS #12)](https://www.rfc-editor.org/rfc/rfc7292)