サーバー証明書はきちんとしたものを用意しようとするとお金と手間暇がかかるので、検証用としては不向きである。以前のRHEL 7以前は、CAという証明書作成用のスクリプトがあって、それを用いた手順は過去記事にしてある。
しかし、RHEL 8以降は同梱されなくなったため、今回はLinuxのopensslコマンドを用いて、オレオレ認証局作ってオレオレ証明書作る手順を記載する。
環境
環境は以下の通り。OpenSSLだけあれば認証局と証明書は作成できる。
- OS : AlmaLinux release 9.4
- OpenSSL : OpenSSL 3.0.7
オレオレ認証局(CA)作成手順
1. CA用のディレクトリを作成
CA用のディレクトリを以下構成で任意の場所に作成する。
pki/
├─ ca/
│ ├─ private/
│ ├─ certs/
│ ├─ newcerts/
│ ├─ index.txt
│ ├─ serial
│ └─ openssl.cnf
└─ server/
mkdir pki
cd pki/
mkdir -p ca/{private,certs,newcerts} server
CAが署名する際に必要となるファイルとして、index.txtとserialのファイルを事前に作成しておく。index.txtは空のファイルを、serialは任意の数字1行を記載したファイルを作成する。
touch ca/index.txt
echo 1000 > ca/serial
2. 設定ファイルopenssl.cnfを作成
openssl.cnfはデフォルトのものをコピーして、必要な個所を書き換える。
cp /etc/pki/tls/openssl.cnf ca/
書き換え箇所は以下の通り。
| 設定項目 | 設定値 | 説明 |
|---|---|---|
dir |
./ca |
CA証明書の読み込みパスのベースとなるディレクトリを指定。 |
certificate |
$dir/certs/ca.crt |
CA証明書の保存場所を指定。 |
private_key |
$dir/private/ca.key |
CAの秘密鍵の保存場所を指定。 |
copy_extensions |
copy |
証明書作成時にCSRに含まれる拡張属性(サブジェクト代替名(SAN)も拡張属性に含まれる)の値を引き継ぐかどうかの設定。copyにすることで引き継ぐよう設定する。 |
default_days |
3650 | 証明書の有効期限。オレオレ証明書を定期的に更新する必要性はないため、10年に設定する。 |
policy |
policy_anything |
CA証明書とCSR証明書のサブジェクトの一致、不一致をどこまで許容するかを設定する。policy_anythingにすることで、サブジェクトで設定するC、ST、Oなどが一致しなくても証明書の作成が可能となる。 |
3. CA用の秘密鍵と証明書を作成
CA用の秘密鍵作成する。アルゴリズムは、楕円曲線デジタル署名アルゴリズム「ECDSA P-256」を用いる。RSA 2048ビットと同程度の暗号強度でありながら、鍵長を短くでき、処理も高速というメリットがある。
openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out ca/private/ca.key
chmod 600 ca/private/ca.key
秘密鍵に対応する証明書を作成する。この証明書がいわゆるCA証明書となり、Windowsであれば、「信頼されたルート証明機関」に登録することで、ブラウザなどで証明書エラーを出なくすることができる。
※Linuxの場合は過去記事を参照。
openssl req -key ca/private/ca.key -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign \
-subj "/C=JP/ST=Tokyo/O=MyPrivateCA/CN=MyRootCA" -out ca/certs/ca.crt
作成した証明書の内容は以下コマンドで確認できる。
openssl x509 -in ca/certs/ca.crt -text -noout
実行結果例は以下の通り。
# openssl x509 -in ca/certs/ca.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
6b:1b:16:0b:64:c0:f1:49:ec:de:d0:e6:bc:3e:c9:95:de:6f:6c:20
Signature Algorithm: ecdsa-with-SHA256
Issuer: C = JP, ST = Tokyo, O = MyPrivateCA, CN = MyRootCA
Validity
Not Before: Dec 26 22:55:06 2025 GMT
Not After : Dec 24 22:55:06 2035 GMT
Subject: C = JP, ST = Tokyo, O = MyPrivateCA, CN = MyRootCA
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:32:0e:69:35:ef:eb:31:29:25:30:64:63:97:64:
68:22:7d:d3:67:4e:21:82:91:9d:45:94:c5:d1:2c:
12:e8:0a:dd:50:2e:3d:ee:44:18:9d:69:f8:9c:8e:
21:3c:ec:06:bc:36:be:4f:5f:63:e6:04:33:22:55:
6c:dd:47:0a:6a
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Subject Key Identifier:
7E:68:99:E9:DB:F1:A9:6C:A0:CA:6E:A2:E8:53:AD:22:33:B4:D2:69
X509v3 Authority Key Identifier:
7E:68:99:E9:DB:F1:A9:6C:A0:CA:6E:A2:E8:53:AD:22:33:B4:D2:69
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
Signature Algorithm: ecdsa-with-SHA256
Signature Value:
30:45:02:21:00:aa:1a:20:c2:e3:37:c7:63:99:97:5a:36:31:
af:96:84:51:8f:93:46:e6:42:ac:7b:a0:39:5f:c2:ff:85:1a:
c1:02:20:36:a2:23:1d:85:ff:58:1a:95:f7:e0:0e:29:3a:0b:
1e:db:bd:e9:78:ff:c7:2b:f9:b5:19:ff:2e:0c:15:4d:32
以上で、CA用の秘密鍵と証明書を作成は完了となる。
オレオレ証明書作成手順
「秘密鍵作成→CSR作成→CAにて署名」の順に対応する。
以下コマンドの証明書ファイル名(filename)、サブジェクト(subj)、サブジェクト代替名(subjectAltName`)を適切なものに変更して、上から順に流せばよい。
# 証明書ファイル名
filename="server"
# 秘密鍵作成
openssl genrsa -out server/${filename}.key 2048
chmod 600 server/${filename}.key
# CSR作成
openssl req -new -key server/${filename}.key -out server/${filename}.csr \
-subj "/C=JP/ST=Tokyo/O=test/CN=example.test.com" \
-addext "subjectAltName=DNS:example.test.com,IP:192.168.1.1"
# 署名
openssl ca -batch -config ca/openssl.cnf -in server/${filename}.csr -out server/${filename}.crt
# 確認 (*.keyが秘密鍵、*.crtがSSL証明書)
ls -l server/
以上で、Linuxでオレオレ認証局作ってオレオレ証明書作る手順は完了となる。
0 件のコメント:
コメントを投稿