はじめに
2018年7月時点でさくらVPSのSSL証明書が最も安いJPRSを利用したけど、レンタルサーバーだけでしか動かないような記載に見えた。結論、そんなことない。JPRSでも利用できるので、さくらVPSでJPRSを利用してSSL環境を構築するまでの手順ををまとめてみました。
自分はJPRSの2年契約後にJPRSはレンタルサーバーしかできないもんかと勘違いした。ググってもラピッドSSLの情報しか出てこなかったので、この記事を作成するにいたりました。
環境
・ CentOS 7.2
・ Apache 2.4.6
必要なモジュールのインストール
①Apacheの確認
Apacheが入っていないなら yum install httpd
$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Jun 27 2018 13:48:59
②mod_sslのインストール
ApacheをSSL対応にするためのモジュールであるmod_sslを入れる
$ yum install mod_ssl
$ httpd -M |grep ssl
ssl_module (shared)
③OpenSSLのインストール
SSL用の暗号化ライブラリであるOpenSSLを入れる
$ sudo yum install openssl
OpenSSL 1.0.2k-fips 26 Jan 2017
CSRを認証局に提出
CSR(Certificate Signing Request) とは?
CSRは認証局(ここではJPRS)に「このサイト僕のだから、SSL許可の証明書ください」とお願いする申請データです。
では、なぜ外部の認証局に申請するのでしょうか?認証局を自分で作成して、自分のサイトのSSLサーバ証明書を発行することで通信を暗号化することができます。いわゆるオレオレ証明書。
SSL通信は「通信の暗号化」以外に「通信相手の実在性証明」の役割も担っています。認証局は厳しい審査をクリアして、WindowsやMacなどのOSに信頼ある認証局として内蔵されています。その認証局がドメイン所有や企業情報などを確認して許可するので、「通信相手の実在性証明」がある信頼できるサイトとして認められます。要は、認証局経由で暗号化だけでなく、信頼される認証局が認めた信頼できるサイトの証明となるってこと。
僕もそこまで詳しくはないので、もっと知りたい人は下記を見てください。
※ウェブマスターはオレオレ証明書は利用せずに、認証局を利用してSSL通信しましょう。社内だけの利用でもやめましょう。また、ブラウザで「信頼性がないけどいい?」と確認が出てきたときも許可するのをやめましょう。
秘密鍵を生成する
少し脱線しましたが、認証局からSSLサーバ証明書をもらう手続きを行っていきます。これから秘密鍵とCSRを生成して、CSRを認証局に渡します。「公開鍵と秘密鍵ってなに」って方は4枚の図解でわかる公開鍵暗号をみてくてください。
#ディレクトリの作成
$ cd /etc/httpd/conf
$ mkdir ssl.key
$ cd ssl.key
#秘密鍵の作成
$ openssl genrsa -des3 -out server.key 2048
Enter pass phrase for server.key: (パスワード入力、Apache起動するたびにパスワード確認します)
Verifying - Enter pass phrase for server.key: (パスワードの再確認)
ディレクトリは管理しやすいように作成していますが、作成しなくてもいいです。
このパスワードは後で使うだけでなく、Apache起動時に毎度確認します。毎度入力が手間なので、自動化する方法もあります。ここではパスワード生成ツールなどのを利用して、ランダムな文字列を入力すればいいと思います。
CSR生成
CSRを生成する上で管理しやすいようにフォルダを分けてます。
#ディレクトリの作成
$ cd /etc/httpd/conf
$ mkdir ssl.csr
#秘密鍵を用いてCSRを生成
$ openssl req -new -key ssl.key/server.key -out ssl.csr/server.csr
…
Country Name (2 letter code) [XX]: (国、日本ならJP)
State or Province Name (full name) []: (都道府県)
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 hostname) []: (SSLするドメイン)
Email Address []: (メルアド)
…
A challenge password []: (空白で可)
An optional company name []: (空白で可)
CSRが生成できているか確認。下記はすぐ使うのでコピっておきましょう。
$ cat ssl.csr/server.csr
-----BEGIN CERTIFICATE REQUEST-----
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----END CERTIFICATE REQUEST-----
認証局でSSL証明書を購入
ここではさくらのSSLでJPRS(ドメイン認証)を購入した場合の説明をしていきます。
購入手続きを進めていくと、CSRを求められるので、さきほどコピったCSRを貼り付けしましょう。確認画面で登録情報と同じかを確認して手続きを進めていきます。
問題なく購入できたら次に進みます。
認証局にドメイン所有者であることを証明する
「CSRとは?」で説明しましたが、認証局はドメインの所有者であることを確認します。確認方法は認証局が指定するファイルを自分のサイトに配置させることでドメイン所有者であると確認します。(ドメイン認証以外はやったことないので、わかりません。。)
さくらの会員ページで「契約情報 > 契約サービスの確認」に移動して、購入できているか確認します。購入後にサーバー証明書というボタンが表示されるので、クリックします。
購入後、10分以内くらいには出てきました。
遷移先ページで「認証ファイルDL」ボタンが出るので、ポチるとテキストファイルがダウンロードされます。このテキストファイルを自分のウェブサイト上に表示させます。
ラピッドSSLはドメイン配下みたいですが、JPRSは http://example.com/.well-known/pki-validation/ランダムな文字列.txt
という場所に配置します。状態が「準備中」から「利用中」になったら確認が取れたことになります。配置後、10分後くらいで確認がとれます。確認が取れたら、もう使わないので、このテキストファイルやフォルダは消してしまいましょう。
これで認証局から許可が降りたことになります。
サーバで証明書を設定する
認証局に認められた証明書をサーバに配置
状態が「利用中」になると、さきほどテキストファイルDLで利用した「認証ファイルDL」をポチると「server.crt」が取得できます。これがSSLサーバー証明書です。これをサーバに配置します。
#ディレクトリ作成
$ cd /etc/httpd/conf
$ mkdir ssl.crt
$ cd ssl.crt/
$ touch server.crt
$ vim server.crt
DLしたファイルの中身をコピーして server.crt
に貼り付けましょう。ここではファイル作成にしていますが、scpなどで配置してもいいです。
中間証明書をサーバに配置
認証局は「ルート認証局」と「中間認証局」に別れます。「CSRとは?」にある「WindowsやMacなどのOSに信頼ある認証局」は「ルート認証局」であり、その認証局は審査が厳しく、すごく少ないです。「中間認証局」はそのルート認証局から信頼を受けた認証局です。いわゆる信頼の連鎖です。「中間認証局」を利用した場合は、この中間認証局の証明書も必要というわけです。ほとんどが中間認証局のため、中間認証書が必要となるはずです。
日本国-国民のやりとりでは効率が悪いため、日本国-市区町村-国民にすることで効率よくしてると考えれば理解しやすいかな。
ということで中間証明書をサーバに配置します。
JPRSの中間証明書ページからダウンロードしてファイルの中身をコピーしておきます。
$ cd /etc/httpd/conf/ssl.crt
$ touch internal.crt
$ vim internal.crt
コピーした内容を貼り付けて保存して完了です。
Apacheに証明書のパスを配置
あとはApacheに証明書の保存先を伝えればSSL証明書ができます。
mod_ssl
をインストールしたときに /etc/httpd/conf.d/ssl.conf
が作成されてます。
このファイルを読むように設定しておきます。
$ vim /etc/httpd/conf/httpd.conf
#一番最後に記載
IncludeOptional conf.d/*.conf
証明書の記載をします。この辺はひとそれぞれですが、SSLEngineらへんを記載することと、ポート番号は80ではなく、443を利用することにしましょう。
conf.d配下にconfファイルを置きます。名前はなんでもいいです。
$ vim /etc/httpd/conf.d/vhost.conf
#下記を記載
NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine on
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.crt
ServerName example.com
DocumentRoot /var/www/html/
<Directory "/var/www/html/">
AllowOverride All
Options Indexes FollowSymLinks
</Directory>
</VirtualHost>
Apache2.4.8以降は書き方が異なるので下記を参考にしてください。
ファイヤーウォール設定してApache再起動
新たに443ポートを使うので、443ポートを開通する必要があります。
$ firewall-cmd --permanent --zone=public --add-service=http
$ firewall-cmd --permanent --zone=public --add-service=https
$ firewall-cmd --reload
Apacheを再起動してアクセスすればhttpsでアクセスできているはず。パスワードは秘密鍵の作成で作成したパスを入力ください。
$ systemctl restart httpd.service
Enter SSL pass phrase for webdirector-blog.com:443 (RSA) :
毎度入力が手間なので、自動化したい方は下記を設定ください。
httpからhttpsへのリダイレクト
https通信できたかもしれませんが、80ポートを残している場合、httpにアクセスしている人とhttpsにアクセスしている人が出てきてしまいます。httpsにすべて統一するためにもリダイレクトしましょう。wwwありもついでに、wwwなしにリダイレクトしています。Apache再起動して最後確認してみてください。
$ vim /etc/httpd/conf.d/rewrite.conf
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
</ifModule>
マルチドメイン利用の場合はrewrite.confに下記を記載するかvhost.confに上記をそれぞれ書くか。
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]