5分でわかる!プライベート認証局(CA)の構築とサーバー証明書の発行方法

Linux
Linux
スポンサーリンク

プライベート認証局(「プライベートCA」や「オレオレ認証局」とも呼ばれます)は、会社など限られた組織内でのみ運用する認証局です。WEBブラウザにプライベート認証局のルート証明書をインストールする手間がありますが、自由に証明書を発行できるというメリットがあります。そこで今回は、CentOS にプライベート認証局を構築してサーバー証明書を発行する手順をまとめてみました。

プライベート認証局の構築

「プライベート認証局の構築」と書くとなにやら大変そうですが、CentOS には初期状態で認証局構築ツールが入っていますので、簡単にプライベート認証局を構築できます。

・OpenSSL の設定をプライベート認証局構築用に変更します。
vim /etc/pki/tls/openssl.cnf

[ usr_cert ]
(略)
basicConstraints=CA:FALSE
 ↓
basicConstraints=CA:TRUE
 
[ v3_ca ]
(略)
# nsCertType = sslCA, emailCA
 ↓
nsCertType = sslCA, emailCA

・プライベート認証局構築スクリプトを編集し、有効期限を30年に変更します。(長期間運用しなければ3年のままでもかまいません)
vim /etc/pki/tls/misc/CA

CADAYS="-days 1095" # 3 years
 ↓
CADAYS="-days 10950" # 30 years

(補足)CentOS8には /etc/pki/tls/misc/CA がありませんので、インストールしてください。
関連記事:CentOS8 に /etc/pki/tls/misc/CA をインストールする方法

「/etc/pki/CA/」ディレクトリ下に(もしこのディレクトリが無かったら作成してください)証明書のラベル付けに使用するシリアルファイルを作成します。

echo '00' > /etc/pki/CA/serial

・プライベート認証局を作成します。青文字の箇所以外は<空エンター>でOKです。
/etc/pki/tls/misc/CA -newca

CA certificate filename (or enter to create)
<空エンター>
(略)
Enter PEM pass phrase: 1234 ←表示されません
Verifying - Enter PEM pass phrase: 1234 ←表示されません
(略)
Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: private-ca
Email Address []:
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/./cakey.pem: 1234 ←表示されません
Check that the request matches the signature
Signature ok
 
(略:入力した認証局の情報が表示されます)
 
Certificate is to be certified until Feb 18 01:08:53 2026 GMT (3650 days)
 
Write out database with 1 new entries
Data Base Updated

プライベート認証局の秘密鍵のパスフレーズを削除します。

cd /etc/pki/CA/private/
openssl rsa -in cakey.pem -out cakey.pem
Enter pass phrase for cakey.pem: 1234 ←表示されません

プライベート認証局の秘密鍵のパーミションを変更

chmod 400 /etc/pki/CA/private/cakey.pem

以上で、プライベート認証局の構築完了です。「/etc/pki/CA/cacert.pem」が「プライベート認証局のルート証明書」になりますので、これをWEBブラウザにインストールします。

続いて、プライベート認証局でサーバー証明書を発行してみましょう。

サーバー証明書の発行

まずはじめにサーバー証明書用の秘密鍵を作成します。

openssl ecparam -name prime256v1 -genkey -out server.key

証明書発行要求(CSR)を作成します。プライベート認証局構築の時と同じく、青文字の箇所以外は<空エンター>でOKです。

openssl req -new -key server.key > server.csr
 
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:<空エンター>
Organization Name (eg, company) [Default Company Ltd]:<空エンター>
Organizational Unit Name (eg, section) []:<空エンター>
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:<空エンター>
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<空エンター>
An optional company name []:<空エンター>

・プライベート認証局構築用になっている OpenSSL の設定をサーバー証明書発行用に変更します。
vim /etc/pki/tls/openssl.cnf

[ usr_cert ]
(略)
basicConstraints=CA:TRUE
 ↓
basicConstraints=CA:FALSE
 
# nsCertType = server
 ↓
nsCertType = server

(補足)構築したプライベート認証局で発行するサーバー証明書の有効期間(default_days)は、デフォルトで1年(365日)に設定されています。

[ CA_default ]
(略)
default_days = 365

更新の手間がありますので、サーバー証明書の有効期限は長めに設定したいところですが、サーバー証明書の有効期間の上限を約1年とする動きがあります。実際に Apple の Safari は 2020年9月より有効期間を最大でも13ヶ月にすると発表していますので、サーバー証明書の有効期間は1年としておくことをオススメします。

参考資料:信頼済み証明書に関する今後の制限について | Appleサポート

証明書発行要求(CSR)を元に、プライベート認証局を使ってサーバー証明書を発行します。

openssl ca -in server.csr -out server.crt
 
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
 
(略:入力したCSRの内容が表示されます)
 
Certificate is to be certified until Oct 15 21:46:11 2027 GMT (3650 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
Data Base Updated

秘密鍵と発行したサーバー証明書を適切な場所に移動

mv -i server.key /etc/pki/tls/private/
mv -i server.crt /etc/pki/tls/certs/

パーミッションを変更

chmod 600 /etc/pki/tls/private/server.key
chmod 600 /etc/pki/tls/certs/server.crt

SELinux を有効にしている場合は、秘密鍵とサーバー証明書にセキュリティコンテキストをつけておきます。(WEBサーバーの起動時にエラーが発生することがあります)

restorecon -v /etc/pki/tls/private/server.key
restorecon -v /etc/pki/tls/certs/server.crt

CSRを削除

rm server.csr

プライベート認証局から発行したサーバー証明書をテストしてみましょう。

テスト用WEBサーバーの設定

テスト用のWEBサーバーをインストールして、プライベート認証局で発行したサーバー証明書を設定します。

テスト用のWEBサーバーとして Apache httpd と SSLモジュールをインストールします。

yum -y install httpd-devel
yum -y install mod_ssl

初期設定のWEBサイト(www.example.com)を有効にして、プライベート認証局で発行したサーバー証明書と秘密鍵を設定します。
vim /etc/httpd/conf.d/ssl.conf

#DocumentRoot "/var/www/html"
#ServerName www.example.com:443
 ↓
DocumentRoot "/var/www/html"
ServerName www.example.com:443
 
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
 ↓
SSLCertificateFile /etc/pki/tls/certs/server.crt
 
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
 ↓
SSLCertificateKeyFile /etc/pki/tls/private/server.key

firewalld で HTTP(80/tcp) と HTTPS(443/tcp) を開けておきます。

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

Apache httpd を起動します。

systemctl start httpd

クライアントの hosts ファイルに次の一行を追加しておきます。

<WEBサーバのIPアドレス> www.example.com

この時点でWEBブラウザから「https://www.example.com/」を表示すると、プライベート認証局のルート証明書がインストールされていないため、下のような信頼エラーが表示されます。

サーバ証明書の信頼エラー画面

ルート証明書のインストール(FireFox)

今回は WEBブラウザの FireFox にプライベート認証局のルート証明書をインストールしてみます。

プライベート認証局のルート証明書「/etc/pki/CA/cacert.pem」を手元のパソコンにコピーしておきます。

右上のハンバーガーメニューから「設定」を選択します。

ハンバーガーメニューから「設定」を選択

プライバシーとセキュリティをクリックします。

プライバシーとセキュリティをクリック

画面の下の方にある「証明書を表示」をクリックします。

「証明書を表示」をクリック

認証局証明書を選択し「読み込む」をクリックします。

認証局証明書の読み込みをクリック

プライベート認証局のルート証明書「cacert.pem」を選択します。

「cacert.pem」を選択

「この認証局によるウェブサイトの識別を信頼する」にチェックを入れて「OK」をクリックします。

「この認証局によるウェブサイトの識別を信頼する」にチェック

以上でプライベート認証局(private-ca)のルート証明書がインストールされました。

プライベート認証局ルート証明書インストール完了

再度WEBサイトを表示すると、信頼エラーがなくなり「安全な接続」と表示されます。

安全な接続と表示

おわりに

ここ最近、自己署名証明書へのWEBブラウザの警告が厳しくなってきているため、会社など限られた組織内とはいえ自己署名証明書でWEBサイトを運用するのが難しくなってきました。そろそろプライベート認証局を構築してクライアントへルート証明書を配布するといった、正しいPKI基盤の運用が求められそうですね。

コメント

タイトルとURLをコピーしました