CentOS8のApacheで信頼のある認証局で署名したサーバ証明書でSSL化をする方法

投稿者: | 2020-05-21

前回はApacheでプライベート認証局を作成し、自己署名証明書を作成してSSL化を行う方法について説明しました。今回は信頼のある認証局で署名したサーバ証明書でSSL化を行う方法について説明します。

前提条件

今回は、Apacheをソースインストールしている前提で設定等を行うため、Apacheのインストールがまだ終わっていない人は以下のページでApacheのソースインストールを行ってください。

・CentOS8にApache2.4.43をソースインストールする方法

https://www.kdkwakaba.com/archives/735

また、今回はSSL化するドメインの例として当ブログのwww.kdkwakaba.comを使用します。手順の中でドメインを使用する箇所があるため、お名前ドットコムやさくらのドメイン等で事前にドメインを取得し、Webサーバへの名前解決ができる状態で作業を行ってください。

自己署名証明書との違い

信頼のある認証局で署名したサーバ証明書と自身で認証局を作成して自己署名したサーバ証明書の違いは、外部から見た際にそのWebサーバやドメインが信頼できるかどうかです。

データの暗号化を行っていても、接続するWebサーバやドメインが信頼できるかどうかはわかりません。もし接続先がなりすまし等を行った悪意のあるサイトであった場合、フィッシング詐欺やウィルス等の不利益を被る可能性があります。

信頼できるサイトかどうかを外部の人に示すには、信頼のある認証局でこのWebサーバとドメインは信頼できます、という署名が必要になります。このWebサーバやドメインは信頼できます、という認証局の署名はどこにあるかというと、認証局が発行するサーバ証明書の中にあります。

ここで、認証局がサーバ証明書を発行するプロセスを簡単に説明します。信頼のある認証局を通したサーバ証明書の発行は以下の流れで行われています。

  1. Webサーバの管理人が認証局に対して署名要求等を送る
  2. 認証局は署名要求等を確認し審査を行う
  3. 審査後、問題がなければ認証局の秘密鍵で署名要求に署名しサーバ証明書を発行する

自己署名証明書と違う点は、認証局が署名要求に対して審査を行っているということです。認証局が審査を行うため、適当な情報等で認証しようとすると審査に落ちてサーバ証明書を発行してもらえません。こうした認証局の審査があることから、認証局を通じて作成されたサーバ証明書は信頼性があるとされています。

そして、認証局の署名が入ったサーバ証明書を使いSSL化することで、データ通信を暗号化すると共にこのWebサーバやドメインは信頼できますというのを外部の人に示すことができます。

自己署名証明書の場合、信頼のある認証局を通していないためサーバ証明書の内容が正しいかどうかを判断できません。そのため、認証局を通したサーバ証明書と違い、外部の人から信頼できないWebサーバとして見られてしまいます。

社内だけで使用するツールやSSLの検証等の場合は信頼がなくても良いですが、外部の人が利用するWebサイトやWebサービスの場合、ユーザーから危険なサイトやサービスの可能性があると見られてしまいます。それではサイト・サービスの運営としてはよろしくないため、外部の人が利用するサイトやサービスでは、信頼のある認証局で署名されたサーバ証明書で問題のないWebサーバ・ドメインであることの証明が大事になります。

サーバの秘密鍵、署名要求の作成

初めにサーバ証明書を作成するための秘密鍵を作成します。鍵作成時にパスフレーズを要求されるため秘密鍵のパスフレーズを設定します。

・サーバの秘密鍵をTriple-DES、4096ビットで作成
# openssl genrsa -out server.key -des3 4096

Generating RSA private key, 4096 bit long modulus (2 primes)
..................++++
......++++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

次にサーバの秘密鍵を使用し署名要求を作成します。パスフレーズを求められるため先程設定したパスフレーズを入力します。入力後、情報の入力があるため正しい情報を入力します。

・サーバの秘密鍵を基に署名要求を作成
# openssl req -new -key server.key -out server.csr

Enter pass phrase for server.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) [XX]:JP    # 国の名前
State or Province Name (full name) []:Tokyo    # 州の名前、日本だと都道府県
Locality Name (eg, city) [Default City]:Minato-ku    # 都市の名前
Organization Name (eg, company) [Default Company Ltd]:Young Leaves Co.    # 会社名 
Organizational Unit Name (eg, section) []:Development    # 会社の部署名
Common Name (eg, your name or your server's hostname) []:www.kdkwakaba.com    # ドメイン名やサーバのホスト名 
Email Address []:leavesadmin@kdkwakaba.com    # サーバ管理者のメールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:    # 証明書の破棄時のパスワード、空欄でOK
An optional company name []:    # オプションの会社名、空欄でOK

署名要求の送信、審査

秘密鍵と署名要求の作成が完了したら、署名要求等をSSL認証サービスを行っているところに送ります。有名なSSL認証サービスには、さくらのSSLやGlobalSign等があります。手順については、それぞれのサイト等によって変わるためここでは割愛します。

ここで認証の種類について簡単に説明します。サーバ証明書作成のための認証には以下の3つがあります。

DV認証 ドメイン名のみを証明する認証。個人サイトや単発のキャンペーンサイト等、小規模なサイトに使われる認証で、3つの認証の中では審査が通りやすい。
OV認証 ドメイン名と企業の存在を証明する認証。中小企業のコーポレートサイトやクレジットカードや個人情報を使用する中規模程度までのECサイト、Webサービス等に使われる認証。署名要求以外に書類での審査や電話確認等が必要になる。
EV認証 ドメイン名と企業の存在を証明する認証。大企業のコーポレートサイトや有名なECサイト、Webサービス等に使われる認証。登記簿等の審査があるためOV認証よりも審査が厳しいが信頼度は3つの中で一番高い。

どの認証を使用するかについてはサイトの種類や規模、予算等で決めていきます。このブログに関してはDV認証でSSL化をしています。

署名要求等をSSL認証サービスに送信すると、認証側で審査を行います。審査については2~3日程度で終わるものもあれば1週間程度かかるものもあります。

審査を通過すると、認証局で署名されたサーバ証明書が送付されたり、サイトからダウンロードできるようになります。また、サービスによっては中間CA証明書を別途ダウンロードできるURLが送られてきたりします。

サーバ証明書の設定

初めにサーバ証明書、中間CA証明書の内容をまとめたcrtファイルを作成します。サーバの秘密鍵、証明書については以下のパスに配置しているものとします。

  • サーバ証明書:/etc/pki/tls/certs/server.crt
  • サーバ秘密鍵:/etc/pki/tls/private/server.key
・サーバ証明書、中間CA証明書をまとめる
# vi /etc/pki/tls/certs/server.crt

■server.crt
--------------------------------------------------
-----BEGIN CERTIFICATE-----
<サーバ証明書の中身>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<中間CA証明書の中身>
-----END CERTIFICATE-----
--------------------------------------------------

2つのファイルがまとまったcrtファイルができたら、次に秘密鍵のパスフレーズ入力を回避するシェルスクリプトを作成します。

・秘密鍵回避用のシェルスクリプトを作成する
# vi /usr/local/apache2/conf/pass.sh

■pass.sh
--------------------------------------------------
#!/bin/sh
echo '3ogj$jgHEE!5'
--------------------------------------------------

・シェルスクリプトの権限を変更する
# chmod 500 /usr/local/apache2/conf/pass.sh

シェルスクリプトの作成が完了したら、ApacheにSSL関連の設定をします。

・ApacheにSSL関連の設定をする
# vi /usr/local/apache2/conf/httpd.conf

■httpd.conf
--------------------------------------------------
# mod_sslを読み込む
LoadModule ssl_module modules/mod_ssl.so

# 秘密鍵のパスワード入力回避シェルの設定
SSLPassPhraseDialog exec:/usr/local/apache2/conf/pass.sh

# VirtualHostの設定 
<VirtualHost _default_:443>
    SSLEngine on    # SSLの有効化
    SSLCertificateFile /etc/pki/tls/certs/server.crt    # サーバ証明書のパスを指定 
    SSLCertificateKeyFile /etc/pki/tls/private/server.key    # サーバ秘密鍵のパスを指定 
    ServerName www.kdkwakaba.com    # URL部分となるサーバ名を指定
    DocumentRoot /usr/local/apache2/htdocs    # Webサイトの起点となるフォルダの指定 
</VirtualHost>
--------------------------------------------------

Apacheの設定が完了したらFirewallでHTTPSの443ポートを開放します。今回はHTTPSサービスを設定します。

・FirewallでHTTPSサービスの通信を許可する
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload

Firewallの設定が完了したら、Apacheを再起動します。

・Apacheを再起動する
# systemctl restart httpd

動作確認

Apacheの再起動後、httpsから始まるURLで接続を行いURLの横に鍵のマークが表示され、証明書に認証局の名前が表示されればSSL化完了です。

secure

もしhttpsのページで上手く表示されない場合は、少し時間を置いてみたりブラウザのキャッシュを削除して接続しましょう。

また、使用しているセキュリティソフトによってはWebサイト上の証明書の認証局にセキュリティソフトの証明書が表示されることがあります。

最後に、当ブログのSSL化の設定や各種ファイルの名前はセキュリティの関係で今回のブログの設定内容とは異なるためご了承ください。