【RHEL 9】【OpenSSL】【ECC 証明書】プライベート認証局の構築 (ルート CA・中間 CA)

プライベート認証局の環境

プライベート認証局 (ルート CA・中間 CA) を構築するにあたり、使用する OpenSSL は以下の環境のものを使用する。

作成ディレクトリ/etc/pki/CA
設定ファイル/etc/pki/tls/openssl.cnf
OpenSSL バージョン3.2.2
OSRed Hat Enterprise Linux 9.5
OpenSSL の使用環境

プライベート認証局 (ルート CA・中間 CA) の構築

ルート CA 証明書の発行 (ECC 証明書)

初めにプライベート認証局 (ルート CA) 用の秘密鍵を作成する。この時、秘密鍵は暗号化して保護する。また、 RSA ではなく ECC の証明書を発行する。

有効期限約20年 (7,305日)
デジタル署名方式ECDSA
ECC の鍵長NIST P-384
秘密鍵の暗号方式AES256
Issure DNC=JP, O=Home Lab, CN=RHEL ROOT CA
Subject DNC=JP, O=Home Lab, CN=RHEL ROOT CA
X.509 エンコーディング形式PEM (Base64)
基本制約【critical】CA:true
鍵用途【critical】digitalSignature, cRLSign, keyCertSign
署名アルゴリズムSHA384
ルート CA 証明書
# mkdir -p /etc/pki/CA/private
# cd /etc/pki/CA

# openssl ecparam -list_curves
  secp224r1 : NIST/SECG curve over a 224 bit prime field
  secp256k1 : SECG curve over a 256 bit prime field
  secp384r1 : NIST/SECG curve over a 384 bit prime field
  secp521r1 : NIST/SECG curve over a 521 bit prime field
  prime256v1: X9.62/SECG curve over a 256 bit prime field
  brainpoolP256r1: RFC 5639 curve over a 256 bit prime field
  brainpoolP256t1: RFC 5639 curve over a 256 bit prime field
  brainpoolP320r1: RFC 5639 curve over a 320 bit prime field
  brainpoolP320t1: RFC 5639 curve over a 320 bit prime field
  brainpoolP384r1: RFC 5639 curve over a 384 bit prime field
  brainpoolP384t1: RFC 5639 curve over a 384 bit prime field
  brainpoolP512r1: RFC 5639 curve over a 512 bit prime field
  brainpoolP512t1: RFC 5639 curve over a 512 bit prime field

# openssl ecparam -genkey -name secp384r1 -out private/rtcakey.pem

# ll private/
total 4
-rw-------. 1 root root 359 Dec 30 13:13 rtcakey.pem

# openssl ec -text -in private/rtcakey.pem
read EC key
Private-Key: (384 bit)
priv:
    32:b6:bc:9a:31:68:30:(略)
pub:
    04:05:7c:3c:c2:7b:80:(略)
ASN1 OID: secp384r1
NIST CURVE: P-384
writing EC key
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDAytryaMWgww/(略)
-----END EC PRIVATE KEY-----

作成した CA 証明書用の ECC 秘密鍵を AES256 で暗号化する。作成後に暗号化前ファイルを削除する。

# openssl ec -aes256 -in private/rtcakey.pem -out private/enc_rtcakey.pem
read EC key
writing EC key
Enter pass phrase for PEM:
Verifying - Enter pass phrase for PEM:

# cat private/enc_rtcakey.pem
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,7C2D00C0316BD9A6D0CCB0368BA819A5

8S8/17N6XwD9O+MukFbxDCCDkpS(略)
-----END EC PRIVATE KEY-----

# rm private/rtcakey.pem
rm: remove regular file 'private/rtcakey.pem'? y

ルート CA 証明書用の CSR を発行する。この時、 Extension 属性を合わせて付与する。

# openssl req -new -key private/enc_rtcakey.pem -out rtcacert.csr \
-subj="/C=JP/O=Home Lab/CN=RHEL ROOT CA" \
-addext="basicConstraints=critical, CA:true" \
-addext="keyUsage=critical, digitalSignature, cRLSign, keyCertSign"
Enter pass phrase for private/enc_rtcakey.pem:

# openssl req -text -in rtcacert.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C=JP, O=Home Lab, CN=RHEL ROOT CA
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (384 bit)
                pub:
                    04:05:7c:3c:c2:7b:80:26:(略)
                ASN1 OID: secp384r1
                NIST CURVE: P-384
        Attributes:
            Requested Extensions:
                X509v3 Basic Constraints: critical
                    CA:TRUE
                X509v3 Key Usage: critical
                    Digital Signature, Certificate Sign, CRL Sign
    Signature Algorithm: ecdsa-with-SHA256
    Signature Value:
        30:66:02:31:00:e2:c1:83:05:(略)
-----BEGIN CERTIFICATE REQUEST-----
MIIBYjCB6AIBADA3MQswCQYDVQQGEw(略)
-----END CERTIFICATE REQUEST-----


CSR 発行後に自己署名を行い、ルート CA 証明書を発行する。内容が上記表の設定になっていることを確認する。
※長いので「\」で改行してコマンド入力

# openssl x509 -req -in rtcacert.csr -out rtcacert.pem \
-signkey private/enc_rtcakey.pem \
-copy_extensions copy -days 7305 -sha384
Enter pass phrase for private/enc_rtcakey.pem:
Certificate request self-signature ok
subject=C=JP, O=Home Lab, CN=RHEL ROOT CA

# openssl x509 -text -in rtcacert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            61:ee:5a:13:d0:9e:c0:f5:(略)
        Signature Algorithm: ecdsa-with-SHA384
        Issuer: C=JP, O=Home Lab, CN=RHEL ROOT CA
        Validity
            Not Before: Dec 30 10:09:23 2024 GMT
            Not After : Dec 30 10:09:23 2044 GMT
        Subject: C=JP, O=Home Lab, CN=RHEL ROOT CA
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (384 bit)
                pub:
                    04:05:7c:3c:c2:7b:80:(略)
                ASN1 OID: secp384r1
                NIST CURVE: P-384
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
            X509v3 Subject Key Identifier:
                05:47:31:30:98:9D:72:2E:EB:EF:D7:68:B8:40:8C:62:9F:B9:70:3F
    Signature Algorithm: ecdsa-with-SHA384
    Signature Value:
        30:65:02:30:22:59:65:fd:(略)
-----BEGIN CERTIFICATE-----
MIIB7zCCAXWgAwIBAgIUYe5aE9Cew(略)
-----END CERTIFICATE-----

中間 CA 証明書の発行 (ECC 証明書)

中間 CA 用の秘密鍵を作成する。証明書は ECC 証明書を発行する。

有効期限約15年 (5,478日)
デジタル署名方式ECDSA
ECC の鍵長NIST P-256
秘密鍵の暗号方式なし
Issure DNC=JP, O=Home Lab, CN=RHEL ROOT CA
Subject DNC=JP, O=Home Lab,
CN=RHEL INTERMEDIATE CA
X.509 エンコーディング形式PEM (Base64)
基本制約【critical】CA=true
鍵用途【critical】Digital Signature, Certificate Sign, CRL Sign
拡張鍵用途【critical】serverAuth
CRL 配布ポイントhttp://pki.net.home/ca.crl
署名アルゴリズムSHA384
中間 CA 証明書
# openssl ecparam -genkey -name prime256v1 -out private/imcakey.pem

# openssl ec -text -in private/imcakey.pem
read EC key
Private-Key: (256 bit)
priv:
    fe:8c:49:8b:18:53:e0:(略)
pub:
    04:1d:5d:e5:e3:9d:34:(略)
ASN1 OID: prime256v1
NIST CURVE: P-256
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIP6MSYsYU+Cd7Kqa(略)
-----END EC PRIVATE KEY-----

次に、中間 CA 用の CSR を発行する。この時、 Extension 属性を合わせて付与する。
※長いので「\」で改行してコマンド入力

# openssl req -new -key private/imcakey.pem -out imcacert.csr \
-subj="/C=JP/O=Home Lab/CN=RHEL INTERMEDIATE CA" \
-addext="basicConstraints=critical, CA:true" \
-addext="keyUsage=critical, digitalSignature, cRLSign, keyCertSign" \
-addext="extendedKeyUsage=critical, serverAuth" \
-addext="crlDistributionPoints=URI:http://pki.net.home/ca.crl"

# openssl req -text -in imcacert.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C=JP, O=Home Lab, CN=RHEL INTERMEDIATE CA
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:1d:5d:e5:e3:9d:34:(略)
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        Attributes:
            Requested Extensions:
                X509v3 Basic Constraints: critical
                    CA:TRUE
                X509v3 Key Usage: critical
                    Digital Signature, Certificate Sign, CRL Sign
                X509v3 Extended Key Usage: critical
                    TLS Web Server Authentication
                X509v3 CRL Distribution Points:
                    Full Name:
                      URI:http://pki.net.home/ca.crl
    Signature Algorithm: ecdsa-with-SHA256
    Signature Value:
        30:45:02:21:00:98:09:97:(略)
-----BEGIN CERTIFICATE REQUEST-----
MIIBcjCCARgCAQAwPzELMAkGA1UEBh(略)
-----END CERTIFICATE REQUEST-----

CSR 発行後にルート CA で署名を行い、中間 CA 証明書を発行する。この時、 ルート CA 証明書、ルート CA の秘密鍵を指定する。また、CSR の Extension をコピーし、署名は SHA384 を指定している。
※長いので「\」で改行してコマンド入力

# openssl x509 -req -in imcacert.csr -out imcacert.pem \
-CA rtcacert.pem -CAkey private/enc_rtcakey.pem \
-days 5478 -copy_extensions copy -sha384
Certificate request self-signature ok
subject=C=JP, O=Home Lab, CN=RHEL INTERMEDIATE CA
Enter pass phrase for private/enc_rtcakey.pem:

# openssl x509 -text -in imcacert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            1f:6e:1d:7c:44:6b:48:30:40:58:d8:(略)
        Signature Algorithm: ecdsa-with-SHA384
        Issuer: C=JP, O=Home Lab, CN=RHEL ROOT CA
        Validity
            Not Before: Dec 30 10:27:51 2024 GMT
            Not After : Dec 30 10:27:51 2039 GMT
        Subject: C=JP, O=Home Lab, CN=RHEL INTERMEDIATE CA
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:1d:5d:e5:e3:9d:34:4a:2d:(略)
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
            X509v3 Extended Key Usage: critical
                TLS Web Server Authentication
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://pki.net.home/ca.crl
            X509v3 Subject Key Identifier:
                2F:41:28:23:67:C3:A0:83:30:91:(略)
            X509v3 Authority Key Identifier:
                05:47:31:30:98:9D:72:2E:EB:EF:(略)
    Signature Algorithm: ecdsa-with-SHA384
    Signature Value:
        30:64:02:30:7b:8d:c0:92:c8:(略)
-----BEGIN CERTIFICATE-----
MIICQTCCAcigAwIBAgIUH24dfERrSDBAW(略)
-----END CERTIFICATE-----

中間 CA 証明書の内容が上記表の設定になっていることを確認する。

サーバ証明書発行の準備

OpenSSL の設定ファイルを確認・変更する。場所は [ CA_default ] の部分となる。

  • 「dir」が今回作成したパスと一致していること。
  • 「certificate」を中間 CA 証明書に合わせる(ファイル名を変更しても良い)
  • 「policy」を変更する(サブジェクト DN の「C, ST, O」を必須からオプションに変更)
# cp -a /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak

# vim /etc/pki/tls/openssl.cnf
[ CA_default ]
dir             = /etc/pki/CA

#certificate     = $dir/cacert.pem       # The CA certificate
certificate     = $dir/imcacert.pem

#private_key     = $dir/private/cakey.pem # The private key
private_key     = $dir/private/imcakey.pem

#policy         = policy_match
policy          = policy_anything

サーバ証明書を発行するための管理ファイル等を作成する。

# cd /etc/pki/CA
# touch index.txt
# mkdir newcerts
# mkdir crl
# echo '00' > crlnumber

サーバ証明書の発行 (ECC 証明書)

プライベート認証局 (CA) の証明書と同様に、サーバ証明書用の秘密鍵を発行する。

有効期限1年 (365日)
デジタル署名方式ECDSA
ECC の鍵長NIST P-256
Subject DNC=JP, O=Home Lab, CN=rhel-m01.net.home
シリアル番号自動生成
シリアル番号情報ファイル/etc/pki/CA/serial
X.509 エンコーディング形式PEM (Base64)
X.509v3 拡張設定ファイルrhel-m01_ext.txt
基本制約CA:FALSE
鍵用途【critical】digitalSignature
拡張鍵用途serverAuth
サブジェクトの別名 (SAN) ※必須【DNS】rhel-m01.net.home
CRL 配布ポイントhttp://pki.net.home/sv.crl
署名アルゴリズムSHA256
サーバ証明書の情報
# mkdir -p /etc/pki/CA/server/private
# cd /etc/pki/CA/server

# openssl ecparam -genkey -name prime256v1 -out private/rhel-m01_key.pem

サブジェクト以外の情報は、サーバ証明書の発行時に再度使い回せるように設定ファイルを作成する。

# vim rhel-m01_ext.txt

basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = DNS:rhel-m01.net.home
crlDistributionPoints = URI:http://pki.net.home/sv.crl

サーバ証明書の CSR を発行する。この時、サブジェクトのみ指定する。

# openssl req -new -key private/rhel-m01_key.pem -out rhel-m01_csr.pem \
-subj="/C=JP/O=Home Lab/CN=rhel-m01.net.home"

# openssl req -text -in rhel-m01_csr.pem
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C=JP, O=Home Lab, CN=rhel-m01.net.home
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:cd:10:5d:3a:72:(略)
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        Attributes:
            (none)
            Requested Extensions:
    Signature Algorithm: ecdsa-with-SHA256
    Signature Value:
        30:45:02:20:67:b1:bc:19:(略)
-----BEGIN CERTIFICATE REQUEST-----
MIH3MIGeAgEAMDwxCzAJBgNVBAY(略)
-----END CERTIFICATE REQUEST-----

CSR をプライベート認証局 の中間 CA で署名し、サーバ証明書を発行する。この時、 上記ファイルを指定して各種情報を付与する。

# openssl ca -create_serial -in rhel-m01_csr.pem \
-extfile rhel-m01_ext.txt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            1a:fa:63:5e:78:82:9e:1b:32:3f:(略)
        Validity
            Not Before: Dec 30 12:19:44 2024 GMT
            Not After : Dec 30 12:19:44 2025 GMT
        Subject:
            countryName               = JP
            organizationName          = Home Lab
            commonName                = rhel-m01.net.home
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:rhel-m01.net.home
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://pki.net.home/sv.crl
Certificate is to be certified until Dec 30 12:19:44 2025 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            1a:fa:63:5e:78:82:9e:1b:32:3f:(略)
        Signature Algorithm: ecdsa-with-SHA256
        Issuer: C=JP, O=Home Lab, CN=RHEL INTERMEDIATE CA
        Validity
            Not Before: Dec 30 12:19:44 2024 GMT
            Not After : Dec 30 12:19:44 2025 GMT
        Subject: C=JP, O=Home Lab, CN=rhel-m01.net.home
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:cd:10:5d:3a:72:c9:9d:(略)
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:rhel-m01.net.home
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://pki.net.home/sv.crl
            X509v3 Subject Key Identifier:
                D7:66:2E:5F:F5:E7:83:FD:7C:(略)
            X509v3 Authority Key Identifier:
                2F:41:28:23:67:C3:A0:83:30:(略)
    Signature Algorithm: ecdsa-with-SHA256
    Signature Value:
        30:45:02:21:00:e9:80:d2:83:b8:d7:eb:(略)
-----BEGIN CERTIFICATE-----
MIICPDCCAeKgAwIBAgIUGvpjXniCnhsyPz7MvoZ1LG(略)
-----END CERTIFICATE-----
Database updated

作成されたサーバ証明書と管理ファイルを確認する。

# cd /etc/pki/CA

#  cat serial
1AFA635E78829E1B323F3ECCBE86752C67AC4DB3

# cat index.txt
V	251230121944Z		1AFA635E78829E1B323F3ECCBE86752C67AC4DB2	unknown	/C=JP/O=Home Lab/CN=rhel-m01.net.home

# ll newcerts/
total 4
-rw-r--r--. 1 root root 2773 Dec 30 21:19 1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.pem

サーバ証明書チェーンの作成

発行したサーバ証明書とプライベート認証局の中間 CA 証明書、ルート CA 証明書をそれぞれ結合してチェーン証明書を作成する。この時、順番が「サーバ証明書」「中間 CA 証明書」「ルート CA 証明書」の順番になるように連結する。
※発行したサーバ証明書は「—–BEGIN CERTIFICATE—–」から「—–END CERTIFICATE—–」以外の部分は削除する。

# cp newcerts/1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.pem rhel-m01_chain.pem

# vim rhel-m01_chain.pem
-----BEGIN CERTIFICATE-----
MIICPDCCAeKgAwIBAg(略)
-----END CERTIFICATE-----

# cat imcacert.pem >> rhel-m01_chain.pem
# cat rtcacert.pem >> rhel-m01_chain.pem

# mv rhel-m01_chain.pem server/

最終的に以下の様になる。

# cat server/rhel-m01_chain.pem
-----BEGIN CERTIFICATE-----
MIICPDCCAeKgAwIBAgIUGvpjXni(略 サーバ証明書)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST-----
MIIBcjCCARgCAQAwPzELMAkGA1U(略 中間 CA 証明書)
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE-----
MIIB7zCCAXWgAwIBAgIUYe5aE9C(略 ルート CA 証明書)
-----END CERTIFICATE-----

証明書失効リスト (CRL)

サーバ証明書の失効

発行したサーバ証明書を失効させる。失効させるサーバ証明書は対象の証明書ファイルを指定する。失効後に CRL ファイルを生成する。

# cd /etc/pki/CA

# echo '00' > crlnumber    ※未作成の場合

# cat index.txt
V	251230121944Z		1AFA635E78829E1B323F3ECCBE86752C67AC4DB2	unknown	/C=JP/O=Home Lab/CN=rhel-m01.net.home

# openssl ca -revoke newcerts/1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.
Database updated

# cat index.txt
R	251230121944Z	241231055950Z	1AFA635E78829E1B323F3ECCBE86752C67AC4DB2	unknown	/C=JP/O=Home Lab/CN=rhel-m01.net.home

証明書失効リストの生成

サーバ証明書を失効させたため、証明書失効リスト (CRL) を生成する。

# openssl ca -gencrl -out sv.crl
Using configuration from /etc/pki/tls/openssl.cnf

# openssl crl -text -in sv.crl
Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: ecdsa-with-SHA256
        Issuer: C=JP, O=Home Lab, CN=RHEL INTERMEDIATE CA
        Last Update: Dec 31 06:48:34 2024 GMT
        Next Update: Jan 30 06:48:34 2025 GMT
        CRL extensions:
            X509v3 CRL Number:
                1
Revoked Certificates:
    Serial Number: 1AFA635E78829E1B323F3ECCBE86752C67AC4DB2
        Revocation Date: Dec 31 05:59:50 2024 GMT
    Signature Algorithm: ecdsa-with-SHA256
    Signature Value:
        30:45:02:21:00:9f:11:42:(略)
-----BEGIN X509 CRL-----
MIIBADCBpwIBATAKBggqhkjOPQQD(略)
-----END X509 CRL-----

証明書の検証

失効状態を確認するために、CA の ルート証明書と中間証明書を連結したチェーン証明書を作成する。この時、順番が「中間 CA 証明書」「ルート CA 証明書」の順番になるように連結する。

# cat imcacert.pem > ca_chain.pem
# cat rtcacert.pem >> ca_chain.pem

# cat ca_chain.pem
-----BEGIN CERTIFICATE-----
MIICQTCCAcigAwIBAgIUH24dfER(略)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB7zCCAXWgAwIBAgIUYe5aE9C(略)
-----END CERTIFICATE-----

チェーン CA 証明書を作成後にサーバ証明書を検証する。

# openssl verify -crl_check -purpose sslserver -issuer_checks -verbose -CAfile ca_chain.pem -CRLfile sv.crl newcerts/1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.pem
C=JP, O=Home Lab, CN=rhel-m01.net.home
error 23 at 0 depth lookup: certificate revoked
error newcerts/1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.pem: verification failed

失効前の場合は以下の様になる。

# openssl verify -crl_check -purpose sslserver -issuer_checks -verbose -CAfile ca_chain.pem -CRLfile sv.crl newcerts/1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.pem
newcerts/1AFA635E78829E1B323F3ECCBE86752C67AC4DB2.pem: OK

NGINX Webサーバの HTTPS 設定

発行したチェーンのサーバ証明書を NGINX Web サーバに設定し、HTTPS 接続を可能に設定する。
基本的にはTLS設定のコメントアウト解除、及びサーバ証明書とサーバ証明書の秘密鍵を設定、ファイル配置すれば良い。また、合わせて CRL ファイルも設置する。

# mkdir -p /etc/pki/nginx/private

# cd /etc/pki/CA/server
# cp rhel-m01_chain.pem /etc/pki/nginx/server.crt
# cp private/rhel-m01_key.pem /etc/pki/nginx/private/server.key

# cp /etc/pki/CA/sv.crl /usr/share/nginx/html/
# dnf install nginx  ※インストールしていない場合

# cp -a /etc/nginx/nginx.cnf /etc/nginx/nginx.cnf.bak
# vim /etc/nginx/nginx.cnf    ※以下の部分を全てコメントアウト解除する

    server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  _;
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/pki/nginx/server.crt";
        ssl_certificate_key "/etc/pki/nginx/private/server.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

firewalld で「HTTP」「HTTPS」を許可していない場合は許可設定する。

# firewall-cmd --permanent --add-service https --add-service http
success

# firewall-cmd --reload
success

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

nginx を起動して HTTP/HTTPS 接続できるか Web ブラウザで確認する。
また、Web ブラウザに プライベート CA 証明書を信頼できる認証機関として登録する。

# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

# systemctl start nginx
# ss -tanl
State      Recv-Q     Send-Q         Local Address:Port           Peer Address:Port     Process
LISTEN     0          128                  0.0.0.0:22                  0.0.0.0:*
LISTEN     0          511                  0.0.0.0:80                  0.0.0.0:*
LISTEN     0          511                  0.0.0.0:443                 0.0.0.0:*
LISTEN     0          128                     [::]:22                     [::]:*
LISTEN     0          511                     [::]:80                     [::]:*
LISTEN     0          511                     [::]:443                    [::]:*

curl で接続確認する場合は以下。チェーン CA 証明書を指定してサーバ証明書を検証している。

# curl -Iv --cacert ca_chain.pem https://rhel-m01.net.home/
*   Trying fd00:0:0:d8::1:443...
* Connected to rhel-m01.net.home (fd00:0:0:d8::1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
*  CAfile: ca_chain.pem
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Unknown (23):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=JP; O=Home Lab; CN=rhel-m01.net.home
*  start date: Dec 30 12:19:44 2024 GMT
*  expire date: Dec 30 12:19:44 2025 GMT
*  subjectAltName: host "rhel-m01.net.home" matched cert's "rhel-m01.net.home"
*  issuer: C=JP; O=Home Lab; CN=RHEL INTERMEDIATE CA
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.2 (OUT), TLS header, Unknown (23):
* TLSv1.2 (OUT), TLS header, Unknown (23):
* TLSv1.2 (OUT), TLS header, Unknown (23):
* Using Stream ID: 1 (easy handle 0x556107fca680)
* TLSv1.2 (OUT), TLS header, Unknown (23):
> HEAD / HTTP/2
> Host: rhel-m01.net.home
> user-agent: curl/7.76.1
> accept: */*
>
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Unknown (23):
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
* TLSv1.2 (OUT), TLS header, Unknown (23):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.2 (IN), TLS header, Unknown (23):
< HTTP/2 200
HTTP/2 200
< server: nginx/1.20.1
server: nginx/1.20.1
< date: Tue, 31 Dec 2024 07:42:46 GMT
date: Tue, 31 Dec 2024 07:42:46 GMT
< content-type: text/html
content-type: text/html
< content-length: 5909
content-length: 5909
< last-modified: Mon, 09 Aug 2021 11:43:42 GMT
last-modified: Mon, 09 Aug 2021 11:43:42 GMT
< etag: "611114ee-1715"
etag: "611114ee-1715"
< accept-ranges: bytes
accept-ranges: bytes

<
* Connection #0 to host rhel-m01.net.home left intact

【参考URL】
楕円曲線暗号の秘密鍵にパスフレーズを追加する【openssl】
OpenSSL ECDSA署名検証の仕組みおさらい
opensslでSANを含んだオレオレ証明書を作ってみる