DEMOサーバーにSSLを設定したので次回楽になる為のメモ その3
DEMOサーバーにSSLを設定したので次回楽になる為のメモ その3
SSL化のやる事リスト。1~7は以前の記事で(1~3 / 4~8)
mod_sslのインストールOpenSSLのインストールopenssl.cnfで証明書期間の設定を行う乱数ファイルの作成秘密鍵の作成CSRの作成SSL証明書の発行手続き(申し込み)証明書発行を待つ※認証局やサービスによって即日~数週間かかるものまである- 発行された証明書をDL
- 中間証明もDL
- サーバーに証明書を配置
- /etc/httpd/conf.d/ssl.conf に証明書&Keyの場所を指示
- /etc/httpd/conf/httpd.conf に ssl.confの読込を指示
- sudo systemctl restart httpd (Apache再起動)を実行してSSLの稼働を確認※https://で実際にアクセスしてみる
- 80番ポート⇒443のリダイレクトを設定する
- プログラム側の設定(サーバー設定や http://で組んでいるパーツ等)を改修する
- Apache再起動でパスワードを求められない様に設定する※サーバー再起動でそのまま立ち上がるように。
- sudo systemctl restart httpd (Apache再起動) で設定完了
前回記事の続き書くのさぼってたらSSL化の記事へアクセスが増えていたので慌ててます。
と言う事で、今回は項目8~17について一気に行きます。
発行された証明書をダウンロードする
工程6で申請した証明書に対し無事発行が完了すると証明書をダウンロードできるようになります。
これは、証明書の発行申請をどのようなルートで行ったかにより『どこでダウンロードするか』が変わるので、其々の申請方法に合った場所の指示に従いましょう。
私の場合は通常利用している【さくらインターンネット】からの申請なので、さくらインターネットの場合の操作を記載します。さくらインターネット×JPRSの場合、証明書は申請から1時間後には発行されていました。
まず管理画面にログインします。

【サーバー、SSL等サービスの確認ボタン】をクリックします。発行が完了していると、遷移先画面にSSLの項目が追加されていますので【サーバー証明書ボタン】をクリックします。

遷移した画面の先で【サーバー証明書DLボタン】をクリックすると server.crt というファイルがダウンロードされます。
これでサーバー証明書のダウンロードは終わりです。
中間証明もダウンロードする
つぎは中間証明。
私の申請したJPRS SSLの場合は【JPRS のルート証明書・中間CA証明書について】のページから取得します。
サーバー証明書の発行日と認証型によって取得するファイルが異なるのでどれを取得するかは注意が必要です。
サーバー証明書も中間証明書も中身は次のような感じになっています。

サーバーに証明書を配置する
ちなみに、ここまでの過程で/etc/httpd/confディレクトリは以下のようになっています。
【/etc/httpd/conf】
├── ssl.key/
│ ├── 乱数鍵ファイル/
│ └── server.key ※秘密鍵
└── ssl.csr/
└── server.csr ※csr
最終的には証明書を配置した場所をssl.confに書き入れるのでどこに置いてもいいのですが、一般的にという所で/etc/httpd/confの中に専用ディレクトリを作成し配置します。
サーバー証明書の設置
sudo mkdir /etc/httpd/conf/ssl.crt sudo touch /etc/httpd/conf/ssl.crt/server.crt sudo vim /etc/httpd/conf/ssl.crt/server.crt
touchコマンド:タイムスタンプを変更する。ファイルが無い場合はファイルの作成も行う。
vim で開いたserver.crtファイルに【工程9】でダウンロードしたserver.crt値をコピペします。
無知な私はFTPでダウンロードしたファイル上げればいいんじゃね?などと思っていましたが、どうやら権限周りで色々問題がある様子。と言う事で、ちゃんとsudo vim を使って証明書の内容を貼り付けます。
$ sudo vim /etc/httpd/conf/ssl.crt/server.crt -----BEGIN CERTIFICATE----- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -----END CERTIFICATE-----
中間証明書の設置
$ touch /etc/httpd/conf/ssl.crt/internal.crt $ sudo vim /etc/httpd/conf/ssl.crt/internal.crt
今度は工程10でダウンロードした中間証明書をコピペします。
$ sudo vim /etc/httpd/conf/ssl.crt/internal.crt -----BEGIN CERTIFICATE----- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -----END CERTIFICATE-----
お手本にはtouchで作成してからvimで編集をしていたためここではこのように記載しましたが、touchを飛ばしてvimで編集と新規作成を一気に行っても問題ありませんでした。
-----BEGIN CERTIFICATE----- と -----END CERTIFICATE----- も含め全てコピーします。
ここまでで私が混乱したパートがあります。
それは拡張子です。server.csr に server.crt 実は同じものだと勝手に勘違いしserver.csrにserver.crtの内容を上書きしてしまってました。そりゃNG食らうわけですよ。
この証明書の配置でフォルダ構成は以下のように変化しました。
【/etc/httpd/conf】
├── ssl.key/
│ ├── 乱数鍵ファイル/
│ └── server.key ※秘密鍵
├── ssl.csr/
│ └── server.csr ※csr
└── ssl.crt/
├── server.crt ※サーバー証明書
└── internal.crt ※中間証明書
/etc/httpd/conf.d/ssl.conf に証明書&Keyの場所を指示する
$ sudo vim /etc/httpd/conf.d/ssl.conf
【工程1】mod_sslのインストールで /ehc/httpd/conf.d ディレクトリ配下に、ssl.confが作成されているはずです。
※vimコマンドを実行して何の値もない画面が出てきたらmod_sslのインストールに失敗しています。
DocumentRoot の設定などを除くと記載箇所は4か所です。バーチャルホストの設定もついでにしておきます。
#61行目あたり DocumentRoot "/Laravelプロジェクトの場所/public" ServerName ドメイン名:443 #102行目あたり:サーバー証明書の場所 SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt #109行目あたり:秘密鍵の場所 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key #118行目あたり:中間証明書の場所 SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.crt
バーチャルホストにも証明書の場所を記載します。
$ sudo 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/
ServerName ドメイン名
DocumentRoot /Laravelプロジェクトの場所/public/
# <Directory "/var/www/html/">
<Directory /Laravelプロジェクトの場所/public/>
AllowOverride All
Options Indexes FollowSymLinks
</Directory>
</VirtualHost>
/etc/httpd/conf/httpd.conf に ssl.confの読込を指示する
$ sudo vim /etc/httpd/conf/httpd.conf
一番下に1行加えます。
IncludeOptional /etc/httpd/conf.d/*.conf
アスタリスクを入れる事で、/etc/httpd/conf.d/ディレクトリの 拡張子.confのファイルをすべて読んでねとの指示になります。
sudo systemctl restart httpd (Apache再起動)を実行してSSLの稼働を確認する
ここまでくると設定はほぼ終わりです。ただし、Apacheに変更した設定がまだ適応されてないので再起動します。
$ sudo systemctl restart httpd
再起動が完了したら実際に【https:// 申請ドメイン名】でアクセスしてみます。
注意点は【工程6】で書いたURLにアクセスする事です。www.を付けて申請した場合はwwwを付けて確認してください。また、SSLはドメインに対してのセキュリティ証明なのでIPアドレスでアクセスも確認になりません。
意図したページが表示されたらOKです。
80番ポート⇒443のリダイレクトを設定する
現在の状態は80番と443番が両方とも生存している状態です。なので、http:// にアクセスしても何も問題なく利用できます。SSL化したのだから、80番(http)にアクセスしたら443番(https)で開きたいのが本音です。
と言う事で、リダイレクトの設定を行います。
作成しているツールがLaravelなのでLaravel流の設定方法です。
通常は(Laravelでもできますが).htaccess を以下のように編集します。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
しかし、この記載方法の場合Laravelでは Form::open などでhttp://を案内される事がある様です。
したがって、ミドルウェアにリダイレクトを設定します。
■ミドルウェアを作成 ※kernelに登録するので名前は何でもOKです。
$ php artisan make:middleware HttpsProtocol
■ミドルウェアを編集 【プロジェクト\app\Http\Middleware\HttpsProtocol.php】
<?php
namespace App\Http\Middleware;
use Closure;
class HttpsProtocol
{
public function handle($request, Closure $next) {
if (!$request->secure() && env('APP_ENV') === 'production') {
return redirect()->secure($request->getRequestUri(), 301);
}
return $next($request);
}
}
■カーネルにミドルウェアを登録 【プロジェクト\app\Http\kernel.php】
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middleware = [
....登録されたミドルウェアリスト....
\App\Http\Middleware\HttpsProtocol::class,
];
....
}
これで常時SSL化が完了しました。
プログラム側の設定(サーバー設定や http://で組んでいるパーツ等)を改修する
SSL化したのですが1点問題があります。
直接 プログラム作成中にhttp://から書いてしまったリンクはそのままになっています。
これは相当スマートではないので直します。
私はNetBeansIDEを使っているので変更は一気に終わりました。
Projectを選んで【 ファイル >> 編集 >> 置換 】これでhttp://を検索して https://に置換するだけ。
ヤベー、超便利。
Apache再起動でパスワードを求められない様に設定する
さて、上までの状態でしばらく運用していたのですが、大問題が発生しました。
アクセスするとサーバーに接続を落とされる
もうね、泣きそうですよ。必死に原因を探しました。
その結果わかった事。Apache起動してないんじゃない?
と言う事で、Apacheの状態を確認してみます。
$ sudo service httpd status
やっぱり起動していない...。
原因は、さくらインターネットさんのメンテナンスによるサーバー再起動だったようです。
【工程5】で作成した秘密鍵の作成にて、Apacheの起動にパスワードが求められるようになっています。
その為、Serverが再起動してもApacheが立ち上がってこなかったわけです。
となると、やはりApacheの自動起動でパスワード承認を自動クリアさせる必要があります。
パスワード自動応答スクリプトを作成
パスワードを出力するshellを作成してこのshellをApache起動時に読み込むように設定します。場所は管理しやすい所でどこでもいいです。
$ sudo vim /etc/ssl/certs/pass_ssl.sh
起動時に使うパスワードを登録します。このパスワードに【工程4】で作った乱数を利用すればガードは固くなります。
#!/bin/sh echo '起動時に求められるパスワード'
ROOTのみで読み書きできるように鍵を書けます。
$ sudo chmod 500 /etc/ssl/certs/pass_ssl.sh
Apacheの設定ファイルにpass_ssl.shの場所を示します。
NameVirtualHost *:443 SSLPassPhraseDialog exec:/etc/ssl/certs/pass_ssl.sh #シェルの場所を指定 <VirtualHost *:443> ・・・いろいろ設定書いてある・・・ </VirtualHost>
VirtualHostの中に書き入れると動かないのでその前に書く事。
SSL証明書をを複数管理している場合は、また別の方法になるみたいです。
sudo systemctl restart httpd (Apache再起動) で設定完了
さぁ、再起動!
無事に動けばオールクリアです。
まとめ
SSL設定やること多いですよね。
でも覚えてしまえば早いんだろうなぁ~と実感している今日この頃です。
過去記事はこちらからどうぞ 【工程:1~3】/【工程:4~8】

