前回、IAM Roles Anywhereを試す投稿をしました。
発行した証明書が不要になったときどうしたらいいんだろうと思い追加で調査しました。
想定としては、このようなケースです。
- プロジェクトに参画していた人が会社を異動したりやめた
- 開発環境のパソコンを紛失した
細々した手順も前回と異なりますが、上から順番に実行すればOKにしています。
環境
Docker環境を用意しました。
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y openssl sudo ca-certificates && \
adduser ubuntu --disabled-password && \
echo "ubuntu ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
USER ubuntu
WORKDIR /home/ubuntu
- Dockerビルド
docker build -t ca .
- Docker起動
mkdir ubuntu
docker run -it --rm -v $PWD/ubuntu:/home/ubuntu ca
プライベート認証局を構築する
ルートCAのパスフレーズをファイルに保存
Ubuntu Containerecho "rootCA" >> .rootca.passphrase
OpenSSLの設定ファイルをコピーする
一部設定を変更するため、設定ファイルを手元にコピーします。
Ubuntu Containercp /etc/ssl/openssl.cnf ./
OpenSSLの設定ファイルを変更する
変更するのは2箇所です。
- usr_certセクションの
keyUsage
のコメントアウトを解除 - v3_caセクションの
keyUsage
のコメントアウトを解除し、digitalSignature
を追加
~/openssl.cnf[ usr_cert ]
# These extensions are added when 'ca' signs a request.
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:FALSE
# This is typical in keyUsage for a client certificate.
- # keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+ keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move
# Copy subject details
# issuerAltName=issuer:copy
# This is required for TSA certificates.
# extendedKeyUsage = critical,timeStamping
---
[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
# Key usage: this is typical for a CA certificate. However since it will
# prevent it being used as an test self-signed certificate it is best
# left out by default.
- # keyUsage = cRLSign, keyCertSign
+ keyUsage = cRLSign, keyCertSign, digitalSignature
# Include email address in subject alt name: another PKIX recommendation
# subjectAltName=email:copy
# Copy issuer details
# issuerAltName=issuer:copy
# DER hex encoding of an extension: beware experts only!
# obj=DER:02:03
# Where 'obj' is a standard or added object
# You can even override a supported extension:
# basicConstraints= critical, DER:30:03:01:01:FF- usr_certセクションの
設定ファイルを参照するように環境変数をセットする
Ubuntu Containerexport OPENSSL_CONFIG="-config ./openssl.cnf"
プライベートCAを作成する
Ubuntu Container/usr/lib/ssl/misc/CA.pl -newca \
-extra-req "-passout file:./.rootca.passphrase" \
-extra-req "-subj /C=JP/ST=Tokyo/O=Organization/CN=rootCA"途中でパスフレーズの入力を求められますので、
.rootca.passphrase
の内容を入力してください。Enter pass phrase for ./demoCA/private/cakey.pem:
💡:passoutの指定はうまく行ったのですがpassinの指定ができず、このような形態になっています。。
成功するとこのようなディレクトリが作成されます。
treedemoCA
|-- cacert.pem
|-- careq.pem
|-- certs
|-- crl
|-- crlnumber
|-- index.txt
|-- index.txt.attr
|-- index.txt.old
|-- newcerts
| `-- 703350FF039DE361CD8516452379AE3E2F386DBA.pem
|-- private
| `-- cakey.pem
`-- serial
4 directories, 9 files
クライアント証明書を作成する
クライアント証明書用のパスフレーズをファイルに保存
Ubuntu Containerecho client_pass >> .client.passphrase
CSRを作成
Ubuntu Container/usr/lib/ssl/misc/CA.pl -newreq \
-extra-req "-passout file:./.client.passphrase" \
-extra-req "-subj /C=JP/ST=Tokyo/O=Organization/CN=Client1"newreq.pem
とnewkey.pem
が生成されます。署名を要求
Ubuntu Container/usr/lib/ssl/misc/CA.pl -sign
ルートCAのパスフレーズを入力します。
Enter pass phrase for ./demoCA/private/cakey.pem:
newcert.pem
が生成されます。パスフレーズを解除したプライベートキーを生成
Ubuntu Containeropenssl rsa \
-in newkey.pem \
-out decryptkey.pem \
-passin file:./.client.passphrasedecryptkey.pem
が生成されます。PKCS#12を生成
Ubuntu Container/usr/lib/ssl/misc/CA.pl -pkcs12 \
-extra-pkcs12 "-passin file:./.client.passphrase"newcert.p12
が生成されます。
マネジメントコンソールでIAM Roles Anywhereを設定する
IAM Roles Anywhereの管理画面を表示し、
信頼アンカーを作成する
ボタンをクリックします。認証機関 (CA) ソースで
外部証明書バンドル
を選択し、外部証明書バンドルにdemoCA/cacert.pem
の値を貼り付けます。信頼アンカーを作成する
ボタンをクリックします。[IAMロール]の管理画面に遷移し、
ロールを作成
ボタンをクリックします。信頼されたエンティティタイプを
AWSのサービス
とし、ユースケースはRoles Anywhere
を選択します。任意のポリシーを追加します。
ロールに名前をつけ、
ロールを作成
ボタンをクリックします。IAM Roles Anywhereの管理画面に戻り、
プロファイルを作成
ボタンをクリックします。プロファイルの名称を入力し、ロールに先程作成したIAMロールを選択し、
プロファイルを作成
ボタンをクリックします。以下のARNをメモします。
- 信頼アンカーのARN
- プロファイルのARN
- IAMロールのARN
クレデンシャルヘルパーツールをダウンロードする
こちらにOSごとのヘルパーツールが用意されているので、OSに合わせてダウンロードします。
💡:コンテナ内にはcurlもwgetも存在しないのでホストOS側で入手し、/usr/local/bin/ディレクトリ内に配置してください。実行権限の付与も忘れずに。
一時認証情報を生成する
export TRUST_ANCHOR_ARN=arn:aws:rolesanywhere:ap-northeast-1:...
export PROFILE_ARN=arn:aws:rolesanywhere:ap-northeast-1:...
export ROLE_ARN=arn:aws:iam::...
aws_signing_helper credential-process \
--certificate newcert.pem \
--private-key decryptkey.pem \
--trust-anchor-arn $TRUST_ANCHOR_ARN \
--profile-arn $PROFILE_ARN \
--role-arn $ROLE_ARN
{"Version":1,"AccessKeyId":"...","SecretAccessKey":"...","SessionToken":"...","Expiration":"2023-10-25T12:08:26Z"}
一時認証情報の取得がうまくいきました。
~/.aws/config
に記述するとAWS CLIやSDKからも利用できます。
[default]
credential_process = aws_signing_helper credential-process
--certificate <<client-cert.pemの絶対パス>>
--private-key <<client-key.pemの絶対パス>>
--trust-anchor-arn <<信頼アンカーのARN>>
--profile-arn <<プロファイルのARN>>
--role-arn <<ロールのARN>>
証明書を失効させる
それでは本題の証明書の失効を試します。
証明書を失効
Ubuntu Container/usr/lib/ssl/misc/CA.pl -revoke newcert.pem
ルートCAのパスフレーズを入力します。
Enter pass phrase for ./demoCA/private/cakey.pem:
これでプライベートCA内の情報としては失効されました。
demoCA/index.txtV 261024102847Z 703350FF039DE361CD8516452379AE3E2F386DBA unknown /C=JP/ST=Tokyo/O=Organization/CN=rootCA
R 241024103344Z 231025111311Z 703350FF039DE361CD8516452379AE3E2F386DBC unknown /C=JP/ST=Tokyo/O=Organization/CN=Client12行目の先頭が
R
でRevokeの意味です。CRL(証明書失効リスト)を作成
Ubuntu Containeropenssl ca -gencrl -crldays 365 -out crl.pem
ルートCAのパスフレーズを入力します。
Enter pass phrase for ./demoCA/private/cakey.pem:
crl.pem
が生成されます。CRLをroles Anywhereにインポートする
Ubuntu Containeraws rolesanywhere import-crl \
--crl-data "`base64 crl.pem`" \
--name crl \
--trust-anchor-arn ${TRUST_ANCHOR_ARN}Response{
"crl": {
"createdAt": "2023-10-24T13:41:35.502802+00:00",
"crlArn": "arn:aws:rolesanywhere:ap-northeast-1:...",
"crlData": "...",
"crlId": "d3340be6-7d99-4607-9a76-c9be1b0ca18b",
"enabled": false,
"name": "crl",
"trustAnchorArn": "arn:aws:rolesanywhere:ap-northeast-1:...",
"updatedAt": "2023-10-24T13:41:35.502802+00:00"
}
}CRLのインポートができました。
CRLを有効化する
Ubuntu Containeraws rolesanywhere enable-crl --crl-id <<前のコマンドのResponseにあるCRL ID>>
これで失効が有効になりました。
失効後、ほんとにアクセスできないか確認
aws_signing_helper credential-process \
--certificate newcert.pem \
--private-key decryptkey.pem \
--trust-anchor-arn $TRUST_ANCHOR_ARN \
--profile-arn $PROFILE_ARN \
--role-arn $ROLE_ARN
AccessDeniedException: Certificate revoked
やりました。