初心者でもできる!OpenSSLでプライベートCAと中間CAを構築しサーバ証明書を発行する方法

はじめに

Webサイトの信頼性を証明書で確保することは、Webサービスを安全に提供するうえで欠かせません。信頼性が保証されていないWebサイトは、ユーザー離れやセキュリティリスクにつながります。

本記事では、Linuxサーバ上でopensslコマンドを使い、プライベートCA(認証局)と中間CAを構築してサーバ証明書を発行する手順を解説します。実機を用いて学習することで、すぐに活用できる安全なWebサイト構築スキルを身につけましょう。

CAの役割(ルートCA/中間CA)

認証局(CA: Certificate Authority)は、インターネット上で安全な通信を行うために信頼を保証する第三者機関です。特にWebサイトが本物であることを証明するために使われます。

認証局には、信頼の最上位に位置するルートCAと、ルートCAとWebサイトの間に位置する中間CAがあります。中間CAを導入するメリットは、ルートCAの秘密鍵を保護してセキュリティを強化できることと、用途(EV証明書、DV証明書、IoT証明書など)ごとに中間CAを分けて運用ルールや管理責任を明確化できるため、運用の柔軟性が高まることです。

ルートCA

  • 信頼の最上位に位置する認証局
  • 中間CAに署名をすることで信頼を委譲
  • 秘密鍵は厳重に管理されており、基本的にオフラインで管理
  • ルートCAは、DigiCert社やGlobalSigh社などの企業や、ISRG (Let’s Encryptを運営)などの非営利団体が運営

中間CA

  • ルートCAに署名された証明書を保有
  • Webサイトに対して実際にサーバ証明書/クライアント証明書を発行
  • 中間CAの秘密鍵が漏洩した場合、対象の中間CAのみを失効
  • 用途ごとに複数の中間CAを分けて管理できる(EV用、DV用など)

認証局による信頼性保証の仕組み

ルートCAと中間CAを用いて、ウェブサイトの信頼性を保証する仕組みを図示しています。

  1. ルートCAにて秘密鍵作成
    ※絶対に情報漏洩しないことが大切
  2. ルート証明書作成
    ルートCAの秘密鍵を使ってルート証明書を作成する。
  3. ルートCA自身が署名
  4. 中間CAにて秘密鍵作成
  5. 中間CAの秘密鍵にて中間証明書を作成
  6. ルートCAの秘密鍵で署名を行う
  7. サーバにて秘密鍵作成
  8. サーバの秘密鍵でサーバ証明書を作成
  9. 中間CAの秘密鍵で署名する
  10. 中間証明書とサーバ証明書をマージして配置
    ※Load Balancer、Apache、nginx等に配置するのが一般的。
  11. ルート証明書をクライアントに配置
    ※一般的なルート証明書であれば、OSやブラウザに配置済みであるケースが多い。
  12. クライアントによるアクセス要求
  13. サーバから中間証明書/サーバ証明書を送信
  14. クライアント上のルート証明書による検証

CA構築/証明書発行のハンズオン

ルートCAをプライベートCAとして自前で構築し、証明書を発行するハンズオンを通して、Webサイトの信頼性を保証する仕組みを実践的に学びましょう。

ルートCAにおける証明書作成

まず、ルートCAにて証明書を作成する手順を実施していきましょう。

ディレクトリ作成

鍵や証明書を配置するディレクトリを作成します。

  • /etc/pki/tls/pca/private:秘密鍵を格納する
  • /etc/pki/tls/pca/certs:証明書を格納する
  • /etc/pki/tls/pca/newcerts:発行済みの証明書がシリアル番号ごとに格納される
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/pca/private
[root@appserver-dev ~]# chmod 700 /etc/pki/tls/pca/private
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/pca/certs
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/pca/newcerts
[root@appserver-dev ~]# ls -ld /etc/pki/tls/pca/private /etc/pki/tls/pca/certs /etc/pki/tls/pca/newcerts
drwxr-xr-x 2 root root 21 Jul 30 12:52 /etc/pki/tls/pca/certs
drwxr-xr-x 2 root root 38 Jul 30 14:36 /etc/pki/tls/pca/newcerts
drwx------ 2 root root 21 Jul 30 12:52 /etc/pki/tls/pca/private
[root@appserver-dev ~]#

設定ファイル作成

証明書の作成に必要な一連の作業は、opensslコマンドで実現できます。その際、あらかじめopensslの設定ファイルを準備し、証明書発行ポリシーやディレクトリ、ファイルパスなどを設定しておきます。以下にopenssl.confファイルのサンプルを示しますので、自身の環境に合わせて編集してください。

[root@appserver-dev ~]# vi /etc/pki/tls/pca/pca-openssl.conf
[root@appserver-dev ~]# cat /etc/pki/tls/pca/pca-openssl.conf
[ ca ]
default_ca = CA_default

[ CA_default ]
dir               = /etc/pki/tls/pca
certs             = $dir/certs
crl_dir           = $dir/crl
new_certs_dir     = $dir/newcerts
database          = $dir/index.txt
serial            = $dir/serial
RANDFILE          = $dir/private/.rand

private_key       = $dir/private/pca.key
certificate       = $dir/certs/pca.crt

crlnumber         = $dir/crlnumber
crl               = $dir/crl/pca.crl
crl_extensions    = crl_ext
default_crl_days  = 30

default_md        = sha256

name_opt          = ca_default
cert_opt          = ca_default
default_days      = 3650
preserve          = no
policy            = policy_strict

[ policy_loose ]
countryName             = optional
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
default_bits        = 4096
distinguished_name  = req_distinguished_name
string_mask         = utf8only

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
stateOrProvinceName             = State or Province Name
localityName                    = Locality Name
0.organizationName              = Organization Name
organizationalUnitName          = Organizational Unit Name
commonName                     = Common Name
emailAddress                   = Email Address

countryName_default             = JP
stateOrProvinceName_default     = Tokyo
localityName_default            = Chiyoda
0.organizationName_default      = My Root CA Org
organizationalUnitName_default  = Root CA Unit
commonName_default              = My Root CA
emailAddress_default            = pca@example.com

[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ crl_ext ]
authorityKeyIdentifier=keyid:always
[root@appserver-dev ~]#

<設定ファイルの解説>
[ca]セクション
使用するCA設定を指定します。

  • default_ca = CA_default
    [CA_default] セクションをデフォルトとして利用する設定です。

[CA_default]セクション
基本的なディレクトリ設定やファイル名を指定します。

  • dir
    CAの基準ディレクトリパスを設定します。(環境に応じて変更してください)
  • private_key
    CAの秘密鍵ファイル(例:pca.key)
  • -certificate
    CA自身の証明書ファイル(例:pca.crt)
  • default_days
    発行する証明書の有効期間(日数)

[policy_loose]セクション
証明書署名要求(CSR)にて、どのフィールドを必須項目とするかを指定します。

  • commonName = supplied
    ここでは、CN(Common Name)のみsupplied(必須)としており、それ以外はoptional(任意)としております。

[req]セクション
証明書署名要求(CSR)を作成する際のデフォルト値を設定します。

  • default_bits
    デフォルトの鍵長を指定します。
  • distinguished_name
    入力プロンプトで使用する具体的なフィールド定義を指定します。
  • string_mask
    文字コードの制約を規定します。ここではUTF-8のみを指定しています。

[req_distinguished_name]セクション
CSR作成時に入力する項目とそのデフォルト値を設定します。あらかじめ値を設定しておくと、複数証明書を作成する際の入力ミス防止になります。

[v3_ca]セクション
ルート証明書や中間証明書に付与する拡張属性となります。通常のサーバ証明書では不要です。

  • basicConstraints = critical, CA:true
    → この証明書がCAであることを明示します。

[crl_ext]セクション
CRL(Certificate Revocation List:証明書失効リスト)に付与する拡張属性を指定します。

  • authorityKeyIdentifier = keyid:always
    → このCRLをどのCAが発行したかを示します。

証明書発行管理ファイルの準備

CAとして証明書を発行するために必要な管理ファイルを用意します。

  • index.txt
    証明書の発行履歴を管理するデータベースファイルです。OpenSSLのCA機能を使う際には必須のファイルで、発行済み証明書の一覧がここに記録されます。
[root@appserver-dev ~]# touch /etc/pki/tls/pca/index.txt
  • serial
    証明書に付与するシリアル番号を管理するファイルです。初期値として1000を設定しています。
[root@appserver-dev ~]# echo 1000 > /etc/pki/tls/pca/serial

ルートCAの秘密鍵作成

ルートCAで使用する秘密鍵を作成します。秘密鍵は非常に重要な情報であるため、AES-256方式で暗号化し、パスフレーズを設定します。

[root@appserver-dev ~]# openssl genrsa -aes256 -out /etc/pki/tls/pca/private/pca.key 4096
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
[root@appserver-dev ~]#

<コマンド解説>

  • openssl genrsa
    RSA形式の秘密鍵を生成するサブコマンドです。
  • -aes256
    秘密鍵をAES-256-CBC方式で暗号化し、パスフレーズで保護します。
    これにより、万が一秘密鍵ファイルが漏えいしてもパスフレーズなしでは利用できません。
  • -out /etc/pki/tls/pca/private/pca.key
    生成した秘密鍵の保存先を指定します。
  • 4096
    秘密鍵の長さ(ビット数)を指定します。4096ビットは非常に強固で、長期間利用されるルートCAに適しています。

ルートCA証明書(自己署名証明書)の作成

ルートCAの信頼の起点となる証明書を作成します。ルートCAは外部の認証局に依頼することができないため、自分自身で証明書を署名(自己署名)して発行します。

[root@appserver-dev ~]# openssl req -config /etc/pki/tls/pca/pca-openssl.conf \
-key /etc/pki/tls/pca/private/pca.key \
-new -x509 -days 3650 -sha256 -extensions v3_ca \
-out /etc/pki/tls/pca/certs/pca.crt
Enter pass phrase for /etc/pki/tls/pca/private/pca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name [Tokyo]:
Locality Name [Chiyoda]:
Organization Name [My Root CA Org]:
Organizational Unit Name [Root CA Unit]:
Common Name [My Root CA]:
Email Address [pca@example.com]:
[root@appserver-dev ~]#

<コマンド解説>

  • openssl req
    証明書署名要求(CSR)や証明書を作成するためのサブコマンド。
  • -config /etc/pki/tls/pca/pca-openssl.conf
    証明書に含める各種情報(組織名やコモンネームなど)が記載された設定ファイルを指定。
    これにより、対話式入力のデフォルト値が自動設定されます。
  • -key /etc/pki/tls/pca/private/pca.key
    署名に使用するルートCAの秘密鍵を指定。
  • -new -x509
    新しい証明書を作成し、CSRではなく自己署名証明書として発行することを意味します。
  • -days 3650
    証明書の有効期限を 3650日(約10年)に設定。
  • -sha256
    署名アルゴリズムに SHA-256 を使用。
  • -extensions v3_ca
    CA用の拡張設定を適用し、この証明書がCAであることを示す。
  • -out /etc/pki/tls/pca/certs/pca.crt
    出力先ファイル(ルートCA証明書)を指定。

中間CAにおける証明書作成

続いて、中間CAでの証明書作成手順を進めていきましょう。基本的な流れはルートCAの手順とほぼ同じですが、ここでは違いに焦点を当てて説明します。

ディレクトリ作成

  • /etc/pki/tls/ica/csr:CSRを格納
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/ica/private
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/ica/certs
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/ica/newcerts
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/ica/csr

設定ファイル作成

中間CAにおける設定ファイルを作成します。

[root@appserver-dev ~]# vi /etc/pki/tls/ica/ica-openssl.conf
[root@appserver-dev ~]# cat /etc/pki/tls/ica/ica-openssl.conf
[ ca ]
default_ca = CA_default

[ CA_default ]
dir               = /etc/pki/tls/ica
certs             = $dir/certs
crl_dir           = $dir/crl
new_certs_dir     = $dir/newcerts
database          = $dir/index.txt
serial            = $dir/serial
crlnumber         = $dir/crlnumber
RANDFILE          = $dir/private/.rand

private_key       = $dir/private/ica.key
certificate       = $dir/certs/ica.crt

crl               = $dir/crl/ica.crl
crl_extensions    = crl_ext
default_crl_days  = 30

default_md        = sha256

name_opt          = ca_default
cert_opt          = ca_default
default_days      = 1825
preserve          = no
policy            = policy_loose

[ policy_loose ]
countryName             = optional
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
default_bits        = 4096
distinguished_name  = req_distinguished_name
string_mask         = utf8only

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
stateOrProvinceName             = State or Province Name
localityName                    = Locality Name
0.organizationName              = Organization Name
organizationalUnitName          = Organizational Unit Name
commonName                     = Common Name
emailAddress                   = Email Address

countryName_default             = JP
stateOrProvinceName_default     = Tokyo
localityName_default            = Chiyoda
0.organizationName_default      = My Intermediate CA Org
organizationalUnitName_default  = Intermediate CA Unit
commonName_default              = My Intermediate CA
emailAddress_default            = intermediateca@example.com

[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ server_cert ]
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = debug.quiz.eeengineer.com

[ crl_ext ]
authorityKeyIdentifier=keyid:always

ルートCAの設定ファイルに対して、追加されている項目を説明します。

<設定ファイルの解説>
[server_cert]セクション
サーバでTLS(HTTPSなど)を行う際に利用する証明書に適用する拡張項目です。

  • basicConstraints = CA:FALSE
    サーバ証明書であることを示し、CAとしては利用できないように制約します。
  • nsCertType = server
    この証明書がサーバ用途であることを示します。
  • keyUsage = critical, digitalSignature, keyEncipherment
    サーバ証明書に必要な署名・鍵交換用途のみを許可。
  • extendedKeyUsage = serverAuth
    サーバ認証専用であることを明確にします。
  • subjectAltName = @alt_names
    サーバ証明書の重要設定。証明書のホスト名(FQDN)を定義するために利用します。

[alt_names]セクション
サーバ証明書が有効なドメイン名(FQDN)を指定します。ブラウザやクライアントは subjectAltName を必ず確認するため、FQDNが一致しないと証明書エラーとなります

  • DNS.1 = debug.quiz.eeengineer.com
    ここでは、debug.quiz.eeengineer.comのみを有効にしております。

証明書発行管理ファイルの作成

先ほどと同様に、index.txtとserialファイルを作成します。

[root@appserver-dev ~]# touch /etc/pki/tls/ica/index.txt
[root@appserver-dev ~]# echo 1000 > /etc/pki/tls/ica/serial
  • crlnumber
    本ファイルはCRLに付与するバージョン番号を管理するためのファイルです。1000で初期化しています。
[root@appserver-dev ~]# echo 1000 > /etc/pki/tls/ica/crlnumber

中間CAの秘密鍵作成

秘密鍵の作成コマンドは、ルートCAで実行したものと同じです。ファイル名とパスのみを変更してください。

[root@appserver-dev ~]# openssl genrsa -aes256 -out /etc/pki/tls/ica/private/ica.key 4096
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
[root@appserver-dev ~]#

CSR作成

ルートCAに対して、証明書の発行を依頼するためのCSRを作成します。

[root@appserver-dev ~]# openssl req -config /etc/pki/tls/ica/ica-openssl.conf \
-new -sha256 -key /etc/pki/tls/ica/private/ica.key \
-out /etc/pki/tls/ica/csr/ica.csr
Enter pass phrase for /etc/pki/tls/ica/private/ica.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name [Tokyo]:
Locality Name [Chiyoda]:
Organization Name [My Intermediate CA Org]:
Organizational Unit Name [Intermediate CA Unit]:
Common Name [My Intermediate CA]:
Email Address [intermediateca@example.com]:
[root@appserver-dev ~]#

<コマンド解説>

  • openssl req
    証明書署名要求(CSR)を生成・処理するコマンド
  • -config /etc/pki/tls/ica/ica-openssl.conf
    使用する設定ファイルを指定。ここでは中間CA用にカスタマイズした設定を読み込む。
  • -new
    新しいCSRを作成することを指定
  • -sha256
    ハッシュアルゴリズムとしてSHA-256を使用する指定。セキュリティ向上のため、SHA-1より強力なSHA-256が推奨される。
  • -key /etc/pki/tls/ica/private/ica.key
    CSRを作成する際に使用する秘密鍵ファイルを指定。この秘密鍵に対応する公開鍵情報がCSRに含まれる。
  • -out /etc/pki/tls/ica/csr/ica.csr
    生成したCSRの出力先ファイルを指定

ルートCAによる署名および証明書発行

ルートCAがCSRに署名をし、証明書を発行します。

[root@appserver-dev ~]# openssl ca -config /etc/pki/tls/pca/pca-openssl.conf \
-policy policy_loose \
-extensions v3_ca -days 3650 -notext -md sha256 \
-in /etc/pki/tls/ica/csr/ica.csr \
-out /etc/pki/tls/ica/certs/ica.crt
Using configuration from /etc/pki/tls/pca/pca-openssl.conf
Enter pass phrase for /etc/pki/tls/pca/private/pca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4097 (0x1001)
        Validity
            Not Before: Jul 30 05:36:03 2025 GMT
            Not After : Jul 29 05:36:03 2030 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = My Intermediate CA Org
            organizationalUnitName    = Intermediate CA Unit
            commonName                = My Intermediate CA
            emailAddress              = intermediateca@example.com
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                16:AF:A5:CE:08:5C:64:02:98:2C:71:21:13:CD:5B:B2:72:CB:00:98
            X509v3 Authority Key Identifier:
                DB:11:C4:ED:3E:C2:EE:C4:F7:9D:B3:F8:ED:4A:D4:98:E1:BA:ED:58
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
Certificate is to be certified until Jul 29 05:36:03 2030 GMT (1825 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
Database updated
[root@appserver-dev ~]#

<コマンド解説>

  • openssl ca
    CA(認証局)として証明書署名要求(CSR)に署名し、証明書を発行するコマンド。
  • -config /etc/pki/tls/pca/pca-openssl.conf
    ルートCAのOpenSSL設定ファイルを指定する。
  • -policy policy_loose
    CSRの内容を検証する際のポリシーを指定。ここではpolicy_looseを使い、必須項目を緩く設定している。
  • -extensions v3_ca
    発行する証明書に付与する拡張属性を指定する。v3_caはCA証明書用の拡張(例えばbasicConstraints=CA:trueなど)を付与する。
  • days 3650
    発行する証明書の有効期間(日数)。ここでは3650日(約10年)を指定する。
  • notext
    証明書の出力にテキスト形式の詳細情報を含めない(ファイルサイズを小さくするための指定)
  • md sha256
    証明書署名に使うハッシュ関数。SHA-256を指定し、安全性を高めている。
  • in /etc/pki/tls/ica/csr/ica.csr
    署名対象のCSRファイルを指定する。
  • out /etc/pki/tls/ica/certs/ica.crt
    発行した証明書の保存先ファイルを指定する。

サーバ証明書作成

最後に、サーバ証明書の作成を進めていきましょう。

ディレクトリ作成

先ほどと同様に、必要なディレクトリを作成してください。

[root@appserver-dev ~]# mkdir -p /etc/pki/tls/server/private
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/server/csr
[root@appserver-dev ~]# mkdir -p /etc/pki/tls/server/certs

設定ファイル作成

サーバ証明書作成のための設定ファイルを作成します。

[root@appserver-dev certs]# vi /etc/pki/tls/server/server-openssl.conf
[root@appserver-dev certs]# cat /etc/pki/tls/server/server-openssl.conf
[ req ]
default_bits        = 2048
distinguished_name  = req_distinguished_name
req_extensions      = v3_req
prompt              = no

[ req_distinguished_name ]
C  = JP
ST = Tokyo
L  = Adachi
O  = eeengineer Org
OU = Certificate Unit
CN = debug.quiz.eeengineer.com

[ v3_req ]
subjectAltName = @alt_names
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[ alt_names ]
DNS.1 = debug.quiz.eeengineer.com
[root@appserver-dev certs]#

<設定ファイルの解説>
[req]セクション
証明書署名要求(CSR)を作成するときの基本設定を行います。

  • default_bits = 2048
    鍵長を2048ビットに設定しています。
  • distinguished_name = req_distinguished_name
    CSRに含める識別名(DN)の項目設定を req_distinguished_name セクションから読み込みます。
  • req_extensions = v3_req
    CSRに付与する拡張属性を v3_req セクションから読み込みます。
  • prompt = no
    プロンプト入力を省略し、設定ファイル内の値を自動で使用します。

[req_distinguished_name] セクション
CSRの識別情報(DN)を具体的に指定しています。

[v3_req] セクション
CSRに含める拡張設定を記述します。

  • subjectAltName = @alt_names
    サブジェクト代替名(SAN)を指定。別セクション alt_names からドメイン名を読み込みます。
    SANはTLS証明書のホスト名検証で必須の項目です。
  • keyUsage = digitalSignature, keyEncipherment
    鍵の用途を制限します。
  • digitalSignature
    デジタル署名に利用します。
  • keyEncipherment
    鍵交換に利用(TLSの鍵交換に必須)する。
  • extendedKeyUsage = serverAuth
    証明書の用途として「サーバ認証」を指定する。

サーバの秘密鍵作成

サーバで使用する秘密鍵を作成します。

[root@appserver-dev ~]# openssl genrsa -out /etc/pki/tls/server/private/server.key 2048

CSRの作成

設定ファイル、秘密鍵を指定してCSRを作成します。

[root@appserver-dev ~]# openssl req -new -key /etc/pki/tls/server/private/server.key -out /etc/pki/tls/server/csr/server.csr -config /etc/pki/tls/server/server-openssl.conf

中間CAの秘密鍵による署名および証明書発行

中間CAがCSRに署名をし、証明書を発行します。

[root@appserver-dev ~]# openssl ca -config /etc/pki/tls/ica/ica-openssl.conf \
  -extensions server_cert -days 3650 -notext -md sha256 \
  -in /etc/pki/tls/server/csr/server.csr \
  -out /etc/pki/tls/server/certs/server.crt
Using configuration from /etc/pki/tls/ica/ica-openssl.conf
Enter pass phrase for /etc/pki/tls/ica/private/ica.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4096 (0x1000)
        Validity
            Not Before: Jul 30 05:40:53 2025 GMT
            Not After : Nov  2 05:40:53 2027 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = eeengineer Org
            organizationalUnitName    = Certificate Unit
            commonName                = debug.quiz.eeengineer.com
            emailAddress              = eeengineer@gmail.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            Netscape Comment:
                OpenSSL Generated Server Certificate
            X509v3 Subject Key Identifier:
                B2:9B:83:15:DF:51:2D:2D:EC:91:4F:96:DB:89:46:5C:42:37:41:A8
            X509v3 Authority Key Identifier:
                16:AF:A5:CE:08:5C:64:02:98:2C:71:21:13:CD:5B:B2:72:CB:00:98
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
Certificate is to be certified until Nov  2 05:40:53 2027 GMT (825 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
Database updated
[root@appserver-dev ~]#

証明書チェーンファイルの作成

catコマンドにて中間証明書とサーバ証明書を結合し、チェーン証明書(server-chain.crt)を作成します。Apache、Nginxなどのウェブサーバに配置する際にはこちらのチェーン証明書が必要となります。中間証明書、サーバ証明書の順に情報を記載する必要がありますので気をつけてください。

[root@appserver-dev ~]# cat /etc/pki/tls/server/certs/server.crt \
    /etc/pki/tls/ica/certs/ica.crt > /etc/pki/tls/server/certs/server-chain.crt
[root@appserver-dev ~]#
[root@appserver-dev ~]# cat /etc/pki/tls/server/certs/server-chain.crt
-----BEGIN CERTIFICATE-----
MIIFeTCCA2GgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgaUxCzAJBgNVBAYTAkpQ
MQ4wDAYDVQQIDAVUb2t5bzEfMB0GA1UECgwWTXkgSW50ZXJtZWRpYXRlIENBIE9y
~~~~
V9zFUV1d3iJhGD9mNY7nckDo3qrbENmSiaZ/v9yVB8+jRU+kncr2Wk1e45BGpY+q
npOh/Bu9A3bRv5DAyNO4ZmgbW1KitIBALFWYnjKof7/Db0ZkBtwvGfp0WUKMOg8b
SgjBhHRHPbhtP5P7XQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGGjCCBAKgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAkpQ
MQ4wDAYDVQQIDAVUb2t5bzEQMA4GA1UEBwwHQ2hpeW9kYTEXMBUGA1UECgwOTXkg
~~~~
uQ74+ir76BLXaWnzmbadJF4S1oVmhOZTWdYe3Vjiw16fsWVWYb2iddkjYT+8FCsI
odeNEZZY2Ol59N20yzo63gzytOZ9GU8mDvO6EzuF2kWKDNFDD6/5MBEbjK5SUBQE
5sha226CBEB2yW68GRxIuvM9gTyKP4T3zdrjBAV6
-----END CERTIFICATE-----
[root@appserver-dev ~]#

さいごに

プライベートCAと中間CAの構築、サーバ証明書の発行手順の説明は以上です。実際に発行した証明書をWebサーバに配置し、サーバ認証の仕組みを確認する方法については別記事で解説します。あわせてお読みいただくと、理解がさらに深まると思います。ぜひ読んでみてください。

参考文献

FreeKB
my Interwebs Free Knowledge Base
Verify certificate chain with OpenSSL | It's full of stars!
SAP and technology information from Tobias Hofmann. Insights on SAP Cloud, UI5, Portal and Mobility.

コメント