1
0

ACMを使ってインポート証明書の期限管理したい

Posted at

やりたいこと

AWS Certificate Manager(ACM)は証明書を使ってサーバ証明書の発行をすることができるが、EV証明書など一部の証明書形式は発行できない。
仕事で使う場合は上記のような外部証明書を使う必要があるが、その場合は証明書の期限管理をExcelでやる必要がある場合も出てきて、証明書の再発行が遅れるリスクがある。
こういった問題に対してACmを使って証明書の期限管理だけやりたいというのがお題。

検証

1.事故証明書作成

本来はEV証明書を使って検証できると良いが、顧客の持ち物だったりするとそれを検証に使うのは調整などがいるのでここは事故証明書を作成していく。
おそらくもっともリソース準備が不要で費用をかけずできるのがCloud Shellを使った方法なので、AWS上で作成していく。
といっても下記のコマンドをCloud Shellで実行するだけ。
①OpenSSLインストール

sudo yum install openssl -y

②ルート証明書作成
適当なディレクトリに移動して

openssl genrsa -out ./testrootca.key 2048
openssl req  -new -x509 -key ./testrootca.key -sha256  -days 366 -extensions v3_ca  -out ./testrootca.pem  -subj "/C=JP/ST=Tokyo/O=testcorp./CN=testCN"

③中間証明書の作成とルート証明書による署名

openssl genrsa -out ./testintermediateca.key 2048
openssl req -new -key ./testintermediateca.key -sha256 -outform PEM -keyform PEM -out ./testintermediateca.csr  -subj "/C=JP/ST=Tokyo/O=testcorp./CN=testCN"
touch ./testintermediateca.cnf
echo "[ v3_ca ]" >> ./testintermediateca.cnf
echo "basicConstraints = CA:true, pathlen:0" >> ./testintermediateca.cnf
echo "keyUsage = cRLSign, keyCertSign" >> ./testintermediateca.cnf
echo "nsCertType = sslCA, emailCA" >> ./testintermediateca.cnf
openssl x509 -extfile ./testintermediateca.cnf -req -in ./testintermediateca.csr -sha256 -CA ./testrootca.pem -CAkey ./testrootca.key -set_serial 01  -extensions v3_ca  -days 366 -out ./testintermediateca.pem

③サーバ証明書の作成と中間証明書による署名

openssl genrsa 2048 > ./testserver.key
openssl req -new -key ./testserver.key -outform PEM -keyform PEM  -sha256 -out ./testserver.csr  -subj "/C=JP/ST=Tokyo/O=testcorp./CN=*.example.com"
openssl x509 -req -in ./testserver.csr -sha256 -CA ./testintermediateca.pem -CAkey ./testintermediateca.key -set_serial 01 -days 15 -out ./testserver.pem

作業ディレクトリにサーバ証明書(testserver.pem)とサーバ証明書の秘密鍵(testserver.key)、中間証明書(testintermediateca.pem)が出力されるので、ダウンロードしてくる。

2.ACM登録

①AWS Certificate Managerに移動して証明書の「インポート」を選択
image.png

②登録
証明書本文:サーバ証明書(testserver.pem)
証明書のプライベートキー:サーバ証明書の秘密鍵(testserver.key)
証明書チェーン - オプション:中間証明書(testintermediateca.pem)
を登録する。
登録方法はテキストエディタで下記をすべてコピペするだけ。

-----BEGIN CERTIFICATE-----
~~中略~~
-----END CERTIFICATE-----

必要に応じてタグ付けを行い登録する。
image.png

その後下記のように登録できていることを確認する。
image.png

③証明書期限切れの通知
いくつか方法があるが今回はAWS Configで検証し、ルール違反があればEventBridgeを経由してSNS通知する方法を採用する。

3.通知設定

①SNSトピック設定
下記を参考に行う。
Amazon SNS の開始方法

②EventBridge設定

「イベントパス」をデフォルトとして、下記の画像のように設定していく。
image.png

イベントパターンを下記の用に設定する。
イベントソース:AWS イベントまたは EventBridge パートナーイベント
メソッド:カスタムパターン (JSON エディタ)

イベントパターン(json)
{
  "source": [
    "aws.config"
  ],
  "detail-type": [
    "Config Rules Compliance Change"
  ],
  "detail": {
    "messageType": [
      "ComplianceChangeNotification"
    ],
    "configRuleName": [
      "acm-certificate-expiration-check"
    ],
    "resourceType": [
      "AWS::ACM::Certificate"
    ],
    "newEvaluationResult": {
      "complianceType": [
        "NON_COMPLIANT"
      ]
    }
  }
}

image.png

image.png

ターゲットには事前に作成していたSNSトピックを選択。
image.png

image.png

入力トランスフォーマについては下記のように設定しておく。

インプットパス
{
  "awsRegion": "$.detail.awsRegion",
  "resourceId": "$.detail.resourceId",
  "awsAccountId": "$.detail.awsAccountId",
  "compliance": "$.detail.newEvaluationResult.complianceType",
  "rule": "$.detail.configRuleName",
  "time": "$.detail.newEvaluationResult.resultRecordedTime",
  "resourceType": "$.detail.resourceType"
}
インプットテンプレート
"On <time> AWS Config rule <rule> evaluated the <resourceType> with Id <resourceId> in the account <awsAccountId> region <awsRegion> as <compliance>."

"For more details open the AWS Config console at https://console.aws.amazon.com/config/home?region=<awsRegion>#/timeline/<resourceType>/<resourceId>/configuration."

最後に確認して作成する。
image.png
qiita_2-1.png

4.AWS Config設定

①ルール作成
証明書の有効期限チェックはマネージドルールがあるので活用していく。
下記のようにフォームを埋める
ルールタイプ:AWS によって管理されるルールの追加
AWS マネージド型ルール:acm-certificate-expiration-check
変更範囲:リソース
リソース:AWS ACM Certificate
頻度:任意の時間
daysToExpiration:証明書の通知期限

②確認
下記のように正常にルールが作成されていることを確認する。
qiita_2-2.png

5.通知確認

通知が来てれば検証成功!!!
qiita_2-3.png

まとめ

ACMでインポート証明書の期限切れ通知を行うことは可能。
文面は要検討。
コンソールとSNS通知を利用すれば管理表は不要になる。
管理表の作成が必要な場合は別途CloudShellを利用してCLIから一覧をエクスポート、jqにて整形して、csvエクスポートなどが良さげ?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0