API Gatewayで証明書が表示されない原因は公開鍵のサイズ制限だった

API Gatewayで使える証明書の公開鍵のサイズ制限について気付かずに作業していたので備忘録として残します。
2022.07.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも。CX事業本部Delivery部のえーたん(@eetann092)です。

先日公開した記事「mTLSで証明書いっぱい出てくるから整理してみた」を書いている途中、API Gatewayを使ってカスタムドメインのmTLSを設定しようとしたところ、証明書の選択欄で詰まりました。 本記事では、その原因と対策を書きます。

API Gatewayの証明書の選択肢に表示されない

まず、AWS Certificate Manager(ACM)での証明書のインポート時の画面は以下です。

「次とともに使用可能」の欄に「Elastic Load Balancing」としか書かれていません。 また、公開鍵については「パブリックキー情報」欄にRSA-4096と書かれており、サイズは4096bitであることが分かります。 この時点でAPI Gatewayでは使えないことに気付くべきでした。

この状態でAPI Gatewayのカスタムドメイン設定の画面で上記のインポートした証明書を指定しようとしても、選択肢に表示されません。

原因と対策

API Gatewayの公式ドキュメントには以下のように書かれています。

Amazon API Gateway は、Amazon CloudFront を活用して、カスタムドメイン名の証明書をサポートします。そのため、カスタムドメイン名の SSL/TLS 証明書の要件と制約は CloudFront によって指定されます。たとえば、パブリックキーの最大サイズは 2048 で、プライベートキーのサイズは 1024、2048、または 4096 とすることができます。

原因は、発行した証明書の公開鍵のサイズ4096bitであり、最大サイズの2048bitを超えていたためです。 そのため、公開鍵のサイズが2048bitになるように作り直して再度証明書のインポートしました。 すると、証明書のインポート画面では、「次とともに使用可能」の欄にAPI Gatewayが表示されました。

これで、問題となっていたAPI Gatewayのカスタムドメイン設定の画面でも、その証明書が表示されるようになりました。

未対応のサイズの秘密鍵を使ってみる

ACMで対応している秘密鍵のサイズは1024, 2048, 4096のいずれかです。 それ以外のサイズの秘密鍵を使おうとすると、証明書のインポートの時点で「提供された証明書のプライベートキーが有効な PEM 形式ではありません」とエラーが表示されます。

秘密鍵を作成して時間が経ってサイズを忘れてしまった場合、以下のようなコマンドで確認できます。

openssl rsa -text -in server.key

以下は、2048bitである出力の例です。

Private-Key: (2048 bit)
modulus:
  xx:xx:xx:xx...
  ...

証明書の公開鍵のサイズには気を付けよう

まとめです。

API Gatewayのカスタムドメインで使える証明書の公開鍵のサイズには制限があります。 ACMで証明書をインポートする時点で、どのサービスでその証明書を使えるか確認できます。

ちなみに、ACMに証明書をインポートできないときの解決方法は以下にまとまっています。

おまけ

今回の記事を書いている途中で、AWSの公式ドキュメントにフィードバックもしてみました。 具体的な手順については、以下の記事に詳しく書かれています。

検索しても情報は出てきませんでしたが、日本語版のドキュメントに対するフィードバックもこの「フィードバック」機能を利用できるようです。 フィードバック画面のType of issueで「Translation」を選択しました。

またこのフィードバックをする時に、「フィードバック」のボタンの隣にある「設定」から、ドキュメントのダークモードに切り替えられることを知りました。