🔐

OpenSSLで構築するプライベート認証局とサーバ証明書の発行手順

に公開

はじめに

開発環境や内部向けサービスでHTTPS通信を有効化する際、自己署名証明書(オレオレ証明書)ではクライアント側での警告が避けられません。この問題を解決するため、本記事ではOpenSSLを利用して独自のプライベート認証局(ルートCA、中間CA)を構築し、それによって署名されたサーバ証明書を発行する一連の手順を解説します。

構成

  1. ルート認証局 (Root CA): 信頼の起点となる最上位の認証局。
  2. 中間認証局 (Intermediate CA): ルートCAによって署名され、サーバ証明書に署名する役割を担う。セキュリティリスクを軽減するために導入。
  3. サーバ証明書: 中間CAによって署名され、実際にWebサーバ等に設置する証明書。

1. ルート認証局 (Root CA) の構築

まず、信頼の起点となるルートCAを作成します。

# 作業ディレクトリの準備
cd /etc/pki/tls
mkdir RCA
cp openssl.cnf openssl_rca.cnf

# openssl_rca.cnf を編集し、dirのパスを /etc/pki/tls/RCA に変更
# (計2箇所)
vi openssl_rca.cnf

次に、CA作成用のスクリプトをカスタマイズします。

cd /etc/pki/tls/misc/
cp CA RCA

# RCA スクリプトを編集
# CATOP=/etc/pki/tls/RCA
# SSLEAY_CONFIG="-config /etc/pki/tls/openssl_rca.cnf"
# の2行を追記・編集
vi RCA

ルートCAを作成します。対話形式で国コード、組織名、コモンネーム(ルート認証局名)などを入力します。

/etc/pki/tls/misc/RCA -newca

# --- 入力例 ---
# Country Name (2 letter code) [XX]:JP
# State or Province Name (full name) []:Tokyo
# Organization Name (eg, company) [Default Company Ltd]:My Company
# Common Name (eg, your name or your server's hostname) []:My Company Root CA

クライアントにインポートするためのder形式の証明書を生成します。

cd /etc/pki/tls/RCA
openssl x509 -in cacert.pem -outform der -out rca.der
  • ルートCA秘密鍵: /etc/pki/tls/RCA/private/cakey.pem
  • 配布用ルートCA証明書: /etc/pki/tls/RCA/rca.der

2. 中間認証局 (Intermediate CA) の構築

ルートCAの秘密鍵を直接使わず、中間CAを介して署名することでセキュリティを高めます。

# 設定ファイルとスクリプトをルートCAから複製して作成
cd /etc/pki/tls
mkdir ICA
cp openssl_rca.cnf openssl_ica.cnf
# openssl_ica.cnf のパスをすべて /etc/pki/tls/ICA に置換
vi openssl_ica.cnf

cd /etc/pki/tls/misc/
cp RCA ICA
# ICA スクリプト内のパスを /etc/pki/tls/ICA と openssl_ica.cnf に変更
vi ICA

中間CAの証明書署名要求(CSR)を作成します。

cd /etc/pki/tls/ICA
/etc/pki/tls/misc/ICA -newreq

# --- 入力例 ---
# Common Name: My Company Intermediate CA

ルートCAで中間CAのCSRに署名します。

# /etc/pki/tls/ICA/newreq.pem がCSR
# /etc/pki/tls/ICA/newcert.pem が署名済み証明書として生成される
/etc/pki/tls/misc/RCA -signCA

最後に、署名された証明書を使って中間CAを有効化します。

# CA certificate filename (or enter to create) と聞かれたら
# 先ほど生成した /etc/pki/tls/ICA/newcert.pem を指定
/etc/pki/tls/misc/ICA -newca

# 秘密鍵を所定の場所に移動
mv newkey.pem private/cakey.pem

Apache等で使用するため、crt形式のファイルも作成しておきます。

openssl x509 -in cacert.pem -out ica.crt
  • 中間CA証明書: /etc/pki/tls/ICA/ica.crt

3. サーバ証明書の発行と設置

Webサーバに設置する証明書を発行します。

# 証明書を設置するサーバで秘密鍵とCSRを作成
mkdir /etc/httpd/ssl/
cd /etc/httpd/ssl/
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr

# --- 入力例 ---
# Common Name: dev.example.com  <- サーバのホスト名

作成したserver.csrを中間CAサーバーに転送し、署名作業を行います。

# 中間CAサーバにて
# server.csr の内容を newreq.pem として保存
vi /etc/pki/tls/ICA/newreq.pem

# 中間CAで署名
/etc/pki/tls/misc/ICA -sign

# 生成された newcert.pem がサーバ証明書
# これを server.crt としてWebサーバに設置する

Apacheでの設定例

ssl.confなどで、発行した3つのファイルを指定します。

SSLCertificateFile      /etc/httpd/ssl/server.crt         # サーバ証明書
SSLCertificateKeyFile     /etc/httpd/ssl/server.key         # サーバの秘密鍵
SSLCertificateChainFile   /etc/pki/tls/ICA/ica.crt          # 中間CA証明書

クライアントPCやブラウザにルートCA証明書 (rca.der) をインポートすることで、このプライベートCAが発行したすべての証明書が警告なしに信頼されるようになります。


さいごに

より詳しい情報や他の技術メモについては、私のブログもご覧ください。

MyNote
https://mynote.meantix.com/

Discussion