0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

複数の鍵を発行してALBへmTLS 設定を手順する手順

Last updated at Posted at 2025-07-02

複数の鍵を発行して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へ認証局バンドルと証明書失効リストをアップロード

トラストストア用のバケットを作成してからアップロード

  1. aws s3 mb s3://webservicename-truststore
  2. aws s3 cp certs/ca.cert.pem s3://webservicename-truststore
  3. 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. ユーザにクライアント証明書を配布する

  1. メールか何かで送信し、どこかに保存して、ダブルクリックして有効化する
  2. 最初のパスワードを聞かれるので教えてあげる。あとの設定はすべて初期のままでよい・
  3. webツールにアクセスすると、ブラウザから「どの証明書を使うか」と聞かれるので、適切なものを選択してOK

社外用証明書の失効登録(社外用を例に)

  1. 失効登録
# 社外用を無効化する例
openssl ca -config openssl.cnf \
  -revoke certs/client-external.cert.pem
  1. CRLの再生成
openssl ca -config openssl.cnf \
  -gencrl \
  -out crl/ca.crl.pem
  1. 下記ディレクトリ構成になっているか確認
~/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
  1. ~/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

AWS Trust store の CRL はそのままで OKです。新規発行なので CRL に未登録 → 問題なく通過します。

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?