2025年12月27日土曜日

Linuxでオレオレ認証局作ってオレオレ証明書作る手順

サーバー証明書はきちんとしたものを用意しようとするとお金と手間暇がかかるので、検証用としては不向きである。以前の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.txtserialのファイルを事前に作成しておく。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にすることで、サブジェクトで設定するCSTOなどが一致しなくても証明書の作成が可能となる。

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 件のコメント:

コメントを投稿

人気の投稿