複数の鍵を発行してALBへmTLS 設定を手順する手順
以下は AWS 環境において mTLS(相互 TLS)を設定する際の一連の手順です。
2023年にALBにmTLS認証を入れることができるようになりました。公式案内
現在、社内外の数人へ向けてテスト的にwebツールを運用していて、アクセスを制限するために導入します。
すべて webservicename-ca
ディレクトリ配下で実行してください。
導入メリットは以下
- 証明書の有効期限設定・失効リスト管理が容易 → 万が一の漏洩時も迅速に失効可能
- ユーザー側の操作は証明書選択のワンクリック(ブラウザ標準ダイアログ) → 利用者負荷は最小限
以下ではwebツールを社内と社外の一部のユーザに使ってもらうことを目的に、社内用社外用の2種類の鍵を生成し、それぞれで新規作成したり失効させたりします。
1. ディレクトリ構成と初期ファイル準備
mkdir -p webservicename-ca/{certs,crl,newcerts,private,csr}
cd webservicename-ca
# CA データベース用ファイルを初期化
touch index.txt index.txt.attr
echo 1000 > serial
echo 1000 > crlnumber
2. openssl.cnf
の作成
以下の内容を openssl.cnf
として保存してください。
nano openssl.cnf
でエディター起動できます。
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = . # CA ワークディレクトリ
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
crlnumber = $dir/crlnumber
private_key = $dir/private/ca.key.pem
certificate = $dir/certs/ca.cert.pem
default_md = sha256
policy = policy_loose
default_days = 3650 # CA 証明書の有効期間
default_crl_days = 3650 # CRL の有効期間
x509_extensions = v3_ca
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[ req_distinguished_name ]
C = JP
ST = Osaka
L = Osaka
O = Oda Nobunaga
OU = webservicename CA
CN = Oda Nobunaga CA
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
[ v3_client ]
basicConstraints = critical, CA:false
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
Ctrl+S+Xで保存できます。
3. ルート CA 鍵と自己署名証明書の生成
# CA 鍵を生成 (4096bit)
openssl genrsa -out private/ca.key.pem 4096
# 自己署名ルート証明書を生成 (3650日)
openssl req -config openssl.cnf \
-key private/ca.key.pem \
-new -x509 \
-days 3650 \
-extensions v3_ca \
-out certs/ca.cert.pem
4. 社内用クライアント証明書発行 (3650日)
# 鍵と CSR を生成
openssl genrsa -out private/client-internal.key.pem 2048
openssl req -config openssl.cnf \
-key private/client-internal.key.pem \
-new \
-out csr/client-internal.csr.pem \
-subj "/C=JP/ST=Osaka/L=Osaka/O=webservicename/OU=Internal Client/CN=internal.user"
# CA による署名
openssl ca -config openssl.cnf \
-extensions v3_client \
-days 3650 \
-notext \
-in csr/client-internal.csr.pem \
-out certs/client-internal.cert.pem \
-batch
5. 社外用クライアント証明書発行 (185日)
# 鍵と CSR を生成
openssl genrsa -out private/client-external.key.pem 2048
openssl req -config openssl.cnf \
-key private/client-external.key.pem \
-new \
-out csr/client-external.csr.pem \
-subj "/C=JP/ST=Osaka/L=Osaka/O=webservicename/OU=External Client/CN=external.user"
# CA による署名
openssl ca -config openssl.cnf \
-extensions v3_client \
-days 185 \
-notext \
-in csr/client-external.csr.pem \
-out certs/client-external.cert.pem \
-batch
6. CRL の生成と更新
openssl ca -config openssl.cnf \
-gencrl \
-out crl/ca.crl.pem
7. PKCS#12 (.pfx) ファイルの作成
# 社内用 (.pfx, パスワード: webtool@123)
openssl pkcs12 -export \
-inkey private/client-internal.key.pem \
-in certs/client-internal.cert.pem \
-certfile certs/ca.cert.pem \
-out webtool-key-internal.pfx \
-passout pass:webtool@123
# 社外用 (.pfx, パスワード: webtool@123)
openssl pkcs12 -export \
-inkey private/client-external.key.pem \
-in certs/client-external.cert.pem \
-certfile certs/ca.cert.pem \
-out webtool-key-external.pfx \
-passout pass:webtool@123
8. この時点でディレクトリ構成が下記になっていることを確認する
~/webservicename-ca$ tree
.
├── certs
│ ├── ca.cert.pem
│ ├── client-external.cert.pem
│ └── client-internal.cert.pem
├── crl
│ └── ca.crl.pem
├── crlnumber
├── crlnumber.old
├── csr
│ ├── client-external.csr.pem
│ └── client-internal.csr.pem
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── newcerts
│ ├── 1000.pem
│ └── 1001.pem
├── openssl.cnf
├── private
│ ├── ca.key.pem
│ ├── client-external.key.pem
│ └── client-internal.key.pem
├── webtool-key-external.pfx
├── webtool-key-internal.pfx
├── serial
└── serial.old
5 directories, 22 files
9. S3へ認証局バンドルと証明書失効リストをアップロード
トラストストア用のバケットを作成してからアップロード
aws s3 mb s3://webservicename-truststore
aws s3 cp certs/ca.cert.pem s3://webservicename-truststore
aws s3 cp crl/ca.crl.pem s3://webservicename-truststore
その後トラストストアを新規作成し、認証局バンドルにca.cert.pem、証明書失効リストにca.crl.pemを指定する
10. ALB リスナーで mTLS を有効化
- EC2→ロードバランサー→該当のALB→HTTPS:443 リスナー→リスナーの編集→セキュアリスナーの設定→クライアント証明書の処理→相互認証(mTLS)にチェック→トラストストアで検証
- 最後にオレンジ色の
設定内容の保存
を押して10秒くらい経過すると、認証が有効化されてしまいます
11. ユーザにクライアント証明書を配布する
- メールか何かで送信し、どこかに保存して、ダブルクリックして有効化する
- 最初のパスワードを聞かれるので教えてあげる。あとの設定はすべて初期のままでよい・
- webツールにアクセスすると、ブラウザから「どの証明書を使うか」と聞かれるので、適切なものを選択してOK
社外用証明書の失効登録(社外用を例に)
- 失効登録
# 社外用を無効化する例
openssl ca -config openssl.cnf \
-revoke certs/client-external.cert.pem
- CRLの再生成
openssl ca -config openssl.cnf \
-gencrl \
-out crl/ca.crl.pem
- 下記ディレクトリ構成になっているか確認
~/webservicename-ca$ tree
.
├── certs
│ ├── ca.cert.pem
│ ├── client-external.cert.pem
│ └── client-internal.cert.pem
├── crl
│ └── ca.crl.pem
├── crlnumber
├── crlnumber.old
├── csr
│ ├── client-external.csr.pem
│ └── client-internal.csr.pem
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── newcerts
│ ├── 1000.pem
│ └── 1001.pem
├── openssl.cnf
├── private
│ ├── ca.key.pem
│ ├── client-external.key.pem
│ └── client-internal.key.pem
├── webtool-key-external.pfx
├── webtool-key-internal.pfx
├── serial
└── serial.old
5 directories, 22 files
-
~/webservicename-ca$ aws s3 cp crl/ca.crl.pem s3://webservicename-truststore
コマンドでCRLリストを転送
注意: 一度失効(revoke)した証明書を元に戻すことはできません。再度同じ CN で使いたい場合は、新しい証明書を発行してください。
新しい証明書発行(社外用を例に)
鍵と CSR
openssl genrsa -out private/client-external-v2.key.pem 2048
openssl req -config openssl.cnf \
-key private/client-external-v2.key.pem \
-new \
-out csr/client-external-v2.csr.pem \
-subj "/C=JP/ST=Osaka/L=Osaka/O=webservicename/OU=External Client/CN=external.user"
CA 署名(185日)
openssl ca -config openssl.cnf \
-extensions v3_client \
-days 185 \
-notext \
-in csr/client-external-v2.csr.pem \
-out certs/client-external-v2.cert.pem \
-batch
新 PKCS#12 作成
openssl pkcs12 -export \
-inkey private/client-external-v2.key.pem \
-in certs/client-external-v2.cert.pem \
-certfile certs/ca.cert.pem \
-out webtool-key-external-v2.pfx \
-passout pass:webtool@123