プライベート認証局(「プライベートCA」や「オレオレ認証局」とも呼ばれます)は、会社など限られた組織内でのみ運用する認証局です。WEBブラウザにプライベート認証局のルート証明書をインストールする手間がありますが、自由に証明書を発行できるというメリットがあります。そこで今回は、CentOS にプライベート認証局を構築してサーバー証明書を発行する手順をまとめてみました。
プライベート認証局の構築
「プライベート認証局の構築」と書くとなにやら大変そうですが、CentOS には初期状態で認証局構築ツールが入っていますので、簡単にプライベート認証局を構築できます。
・OpenSSL の設定をプライベート認証局構築用に変更します。
vim /etc/pki/tls/openssl.cnf
(略)
basicConstraints=CA:FALSE
↓
basicConstraints=CA:TRUE
[ v3_ca ]
(略)
# nsCertType = sslCA, emailCA
↓
nsCertType = sslCA, emailCA
・プライベート認証局構築スクリプトを編集し、有効期限を30年に変更します。(長期間運用しなければ3年のままでもかまいません)
vim /etc/pki/tls/misc/CA
↓
CADAYS="-days 10950" # 30 years
(補足)CentOS8には /etc/pki/tls/misc/CA がありませんので、インストールしてください。
関連記事:CentOS8 に /etc/pki/tls/misc/CA をインストールする方法
「/etc/pki/CA/」ディレクトリ下に(もしこのディレクトリが無かったら作成してください)証明書のラベル付けに使用するシリアルファイルを作成します。
・プライベート認証局を作成します。青文字の箇所以外は<空エンター>でOKです。
/etc/pki/tls/misc/CA -newca
<空エンター>
(略)
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
プライベート認証局の秘密鍵のパスフレーズを削除します。
openssl rsa -in cakey.pem -out cakey.pem
Enter pass phrase for cakey.pem: 1234 ←表示されません
プライベート認証局の秘密鍵のパーミションを変更
以上で、プライベート認証局の構築完了です。「/etc/pki/CA/cacert.pem」が「プライベート認証局のルート証明書」になりますので、これをWEBブラウザにインストールします。
続いて、プライベート認証局でサーバー証明書を発行してみましょう。
サーバー証明書の発行
まずはじめにサーバー証明書用の秘密鍵を作成します。
証明書発行要求(CSR)を作成します。プライベート認証局構築の時と同じく、青文字の箇所以外は<空エンター>でOKです。
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
(略)
basicConstraints=CA:TRUE
↓
basicConstraints=CA:FALSE
# nsCertType = server
↓
nsCertType = server
(補足)構築したプライベート認証局で発行するサーバー証明書の有効期間(default_days)は、デフォルトで1年(365日)に設定されています。
(略)
default_days = 365
更新の手間がありますので、サーバー証明書の有効期限は長めに設定したいところですが、サーバー証明書の有効期間の上限を約1年とする動きがあります。実際に Apple の Safari は 2020年9月より有効期間を最大でも13ヶ月にすると発表していますので、サーバー証明書の有効期間は1年としておくことをオススメします。
参考資料:信頼済み証明書に関する今後の制限について | Appleサポート
証明書発行要求(CSR)を元に、プライベート認証局を使ってサーバー証明書を発行します。
 
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.crt /etc/pki/tls/certs/
パーミッションを変更
chmod 600 /etc/pki/tls/certs/server.crt
SELinux を有効にしている場合は、秘密鍵とサーバー証明書にセキュリティコンテキストをつけておきます。(WEBサーバーの起動時にエラーが発生することがあります)
restorecon -v /etc/pki/tls/certs/server.crt
CSRを削除
プライベート認証局から発行したサーバー証明書をテストしてみましょう。
テスト用WEBサーバーの設定
テスト用のWEBサーバーをインストールして、プライベート認証局で発行したサーバー証明書を設定します。
テスト用のWEBサーバーとして Apache httpd と SSLモジュールをインストールします。
yum -y install mod_ssl
初期設定のWEBサイト(www.example.com)を有効にして、プライベート認証局で発行したサーバー証明書と秘密鍵を設定します。
vim /etc/httpd/conf.d/ssl.conf
#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=443/tcp --permanent
firewall-cmd --reload
Apache httpd を起動します。
クライアントの hosts ファイルに次の一行を追加しておきます。
この時点でWEBブラウザから「https://www.example.com/」を表示すると、プライベート認証局のルート証明書がインストールされていないため、下のような信頼エラーが表示されます。
ルート証明書のインストール(FireFox)
今回は WEBブラウザの FireFox にプライベート認証局のルート証明書をインストールしてみます。
プライベート認証局のルート証明書「/etc/pki/CA/cacert.pem」を手元のパソコンにコピーしておきます。
右上のハンバーガーメニューから「設定」を選択します。
プライバシーとセキュリティをクリックします。
画面の下の方にある「証明書を表示」をクリックします。
認証局証明書を選択し「読み込む」をクリックします。
プライベート認証局のルート証明書「cacert.pem」を選択します。
「この認証局によるウェブサイトの識別を信頼する」にチェックを入れて「OK」をクリックします。
以上でプライベート認証局(private-ca)のルート証明書がインストールされました。
再度WEBサイトを表示すると、信頼エラーがなくなり「安全な接続」と表示されます。
おわりに
ここ最近、自己署名証明書へのWEBブラウザの警告が厳しくなってきているため、会社など限られた組織内とはいえ自己署名証明書でWEBサイトを運用するのが難しくなってきました。そろそろプライベート認証局を構築してクライアントへルート証明書を配布するといった、正しいPKI基盤の運用が求められそうですね。
コメント