安全なWEBサーバーを目指して

Amazonなどのお買いものをする時のアドレスってhttp://ほにゃらら.com
ではなくhttps//となっていると思います。
そういうページはユーザーとサーバーの間の通信が暗号化に使用しており
通販サイトではもはや必須の機能となっています。

誰だってそうです、顔の見えない通販だから
少しでも信頼できる安心なサイトから買いたいものですよね。

SSL設定の手順

※SSL環境構築の条件
・ApacheのWEBサーバーを構築済み
・独自ドメインを取得済みでドメインでWEBにアクセスできる

【オレオレ自己署名サーバー認証局の場合】

〇手順

1. 秘密鍵.keyを作成
2. 秘密鍵を使って認証局への申請書.csrファイルを作成
3. .csrファイルを使ってサーバー証明書.crtファイルを発行する

〇WEBサーバーに設定するもの

・ 秘密鍵.key
・ オレオレサーバー証明書.crt

【※正規の認証局に申請する場合】

〇手順
1. 秘密鍵.keyを作成
2. 秘密鍵を使って認証局への申請書.csrファイルを作成
3. 認証局(ベリサインなど)にサーバー申請書の.csrを提出する
4. 認証局からサーバー証明書.crt、中間CA証明書が送られてくる。
5. 中間CA証明書とクロスルート証明書の混合した.cerを生成する。

〇WEBサーバーに設定するもの
・ 秘密鍵.key
・ 正規のサーバー証明書.crt
・ 中間CA証明書とクロスルート証明の混合ファイル.cer

が必要です。
SSL自体は秘密鍵.keyとサーバー証明書.crtの2つがあれば
実現できます。

RapidSSLなど格安の正規の認証局を使えば1500円前後で
サーバー証明書を発行して貰う事も可能です。
通販サイトの場合は顧客の信頼に繋がる部分でもあるので
多少高価でも知名度の高い認証局を選ぶ事をお勧めします。

今回は記事用なのでお金をかけずオレオレ認証局でのSSLを実現してみます。
まずはSSLに必要なモジュールをインストールします。

[bash]
# yum install openssl
# yum -y install mod_ssl
[/bash]

サーバー証明書を作るスクリプトがあるところに移動します。

[bash]
# cd /etc/pki/tls/certs
[/bash]

【.keyファイル 秘密鍵生成】

[bash]
# make server.key
または
certs]# openssl genrsa -aes128 2048 > 20141007server.key
[/bash]

Generating RSA private key, 2048 bit long modulus
……………+++
…………..+++
e is 65537 (0x10001)
Enter pass phrase:パスフレーズ入力
Verifying – Enter pass phrase:パスフレーズ入力

【確認します】

[bash]
certs]# ls
20141007server.key Makefile ca-bundle.crt ca-bundle.trust.crt
localhost.crt make-dummy-cert renew-dummy-cert
[/bash]

keyファイル(秘密鍵)が出来てます

【csr発行 認証機関への申請書】

[bash]
certs]# make server.csr
または
certs]# openssl req -utf8 -new -key 20141007server.key -out 20141007server.csr

Enter pass phrase for 20141007server.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]:Akihabara←市区町村名
Organization Name (eg, company) [Default Company Ltd]:jibanyanwatcher←組織名
Organizational Unit Name (eg, section) []:IT Dept←部署名
Common Name (eg, your name or your server’s hostname) []:www.hoge.net←FQDN
Email Address []:root@hoge.net←管理者連絡先

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:←空エンター
An optional company name []:←空エンター
[/bash]
[bash]
certs]# ls
20141007server.csr Makefile ca-bundle.trust.crt make-dummy-cert
20141007server.key ca-bundle.crt localhost.crt renew-dummy-cert
[/bash]

csrファイルが出来てますね。

【.crtファイル 自己署名証明書発行】

商用ではcsrファイルを認証局(ベリサインなど)に提出し
.crt署名証明書ファイルを貰いますが、今回はオレオレ認証局なので
自分で署名を発行します。

※公開ページの場合、自己署名では警告が出るのでつけないほうがいいです。

[bash]
certs]# openssl x509 -in 20141007server.csr -out 20141007server.crt -req -signkey 20141007server.key -days 3650

Signature ok
subject=/C=JP/ST=Tokyo/L=Akihabara/O=jibanyanwatcher/OU=IT Dept/CN=www.hoge.net/emailAddress=root@hoge.net
Getting Private key
Enter pass phrase for 20141007server.key:パスフレーズ入力
[/bash]
[bash]
certs]# ls
20141007server.crt 20141007server.key ca-bundle.crt localhost.crt renew-dummy-cert
20141007server.csr Makefile ca-bundle.trust.crt make-dummy-cert
[/bash]

バーチャルホストファイルを設定します。
個別につくることで複数のWEBサイトにSSLを設定することが可能です。

[bash]
# vi /etc/httpd/conf.d/hoge.net.conf

<VirtualHost *:80>
ServerName hoge.net
DocumentRoot /home/hoge.net/public_html/Serverdir/
ErrorLog logs/virtual-error_log
CustomLog logs/virtual-access_log combined env=!no_log
&lt;Directory “/home/hoge.net/public_html/Serverdir/”&gt;
AllowOverride all
</Directory>
</VirtualHost>

↓変更します。

<VirtualHost *:443>
ServerName hoge.net
DocumentRoot /home/hoge.net/public_html/Serverdir/
ErrorLog logs/virtual-error_log
CustomLog logs/virtual-access_log combined env=!no_log
&lt;Directory “/home/hoge.net/public_html/Serverdir/”&gt;
AllowOverride all
</Directory>

SSLEngine on
#SSLCertificateChainFile /etc/httpd/conf/ssl.crt/server.cer
SSLCertificateFile /etc/pki/tls/certs/20141007server.crt
SSLCertificateKeyFile /etc/pki/tls/certs/20141007server.key
</VirtualHost>
[/bash]

設定をWEBサーバーに反映させます。わくわく
[bash]
# service httpd restart
httpd を停止中: [失敗]
httpd を起動中: [Tue Oct 07 23:06:16 2014] [warn] _default_ VirtualHost overlap on port 443, the first has precedence
Apache/2.2.15 mod_ssl/2.2.15 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server hoge.net:443 (RSA)
Enter pass phrase:パスフレーズ入力します。

OK: Pass Phrase Dialog successful.
[ OK ]
[/bash]

アクセスします。

https://www.hoge.net/

sslの設定

警告マークが出たら成功です。
※商用の正式な認証局から認証されたcrtファイルを登録していれば
警告マークはでません。

中間CA証明書とルート証明書の混合ファイル cerファイル

※#SSLCertificateChainFile /etc/httpd/conf/ssl.crt/server.cer

と今回無効にしましたが、
これは中間証明書とルート証明書の混合ファイルの指定です。
認証局にサーバー申請書csrファイルを提出すると、
サーバ証明書crtファイルのほかに
中間CA証明書も送付されます。
その中間CA証明書にクロスルート証明書を追記したファイルが混合ファイルcerです。

ルートCAについては下記サイトを。
http://valuessl.net/support/intermediate.php

[bash]
# vi /etc/httpd/conf/ssl.crt/20141007server.cer

※メールに記載された中間CA証明書

—–BEGIN CERTIFICATE—–
MIIF7DCCBNSgAwIBAgIQbsx6pacDIAm4zrz06VLUkTANBgkqhkiG9w0BAQUFADCB
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5IC0gRzUwHhcNMTAwMjA4MDAwMDAwWhcNMjAwMjA3MjM1OTU5WjCBtTEL

GzEZMBcGA1UEAxMQVmVyaVNpZ25NUEtJLTItNjAdBgNVHQ4EFgQUDURcFlNEwYJ+
HSCrJfQBY9i+eaUwHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6Aq8zMTMwDQYJ
KoZIhvcNAQEFBQADggEBAAyDJO/dwwzZWJz+NrbrioBL0aP3nfPMU++CnqOh5pfB
WJ11bOAdG0z60cEtBcDqbrIicFXZIDNAMwfCZYP6j0M3m+oOmmxw7vacgDvZN/R6
bezQGH1JSsqZxxkoor7YdyT3hSaGbYcFQEFn0Sc67dxIHSLNCwuLvPSxe/20majp
dirhGi2HbnTTiN0eIsbfFrYrghQKlFzyUOyvzv9iNw2tZdMGQVPtAhTItVgooazg
W+yzf5VK+wPIrSbb5mZ4EkrZn0L74ZjmQoObj49nJOhhGbXdzbULJgWOw27EyHW4
Rs/iGAZeqa6ogZpHFt4MKGwlJ7net4RYxh84HqTEy2Y=
—–END CERTIFICATE—–

※クロスルート証明書(必ずクロスルート証明書は下に)

—–BEGIN CERTIFICATE—–
MIIE0DCCBDmgAwIBAgIQJQzo4DBhLp8rifcFTXz4/TANBgkqhkiG9w0BAQUFADBf
MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT
LkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
HhcNMDYxMTA4MDAwMDAwWhcNMjExMTA3MjM1OTU5WjCByjELMAkGA1UEBhMCVVMx

j+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24uY29t
L3ZzbG9nby5naWYwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v
b2NzcC52ZXJpc2lnbi5jb20wPgYDVR0lBDcwNQYIKwYBBQUHAwEGCCsGAQUFBwMC
BggrBgEFBQcDAwYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEBBQUA
A4GBABMC3fjohgDyWvj4IAxZiGIHzs73Tvm7WaGY5eE43U68ZhjTresY8g3JbT5K
lCDDPLq9ZVTGr0SzEK0saz6r1we2uIFjxfleLuUqZ87NMwwq14lWAyMfs77oOghZ
tOxFNfeKW/9mz1Cvxm1XjRl4t7mi0VfqH5pLr7rJjhJ+xr3/
—–END CERTIFICATE—–
[/bash]

おまけ .htaccessを使って特定のページやディレクトリに設定

amazon ssl
amazonなどはログインページなど一部のページのみに認証を設定しています。
.htaccessを使って設置を行うことでサイト全体ではなく
必要な部分のみにSSLを設定するやり方です。

[bash]
# vi .htaccess

RewriteEngine on

RewriteCond %{REQUEST_URI} .*/ssl_contact.php$ [OR]
RewriteCond %{REQUEST_URI} .*/ssl_login.php$ [OR]
RewriteCond %{REQUEST_URI} .*/ssl_dir/.*$
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_URI} !(.*/ssl_contact.php$)
RewriteCond %{REQUEST_URI} !(.*/ssl_login.php$)
RewriteCond %{REQUEST_URI} !(.*/ssl_dir/.*$)
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
[/bash]

ssl_contact.phpとssl_login.php
およびssl_dirのみがSSL対応(https)になるようになりました。

優 ( エンジニア )
この記事を書いた人:優 ( エンジニア )

システムガーディアン爆弾処理班。アクセス負荷対策やNginxへの移行案件が多いこの頃。IBM SoftLayerやAWSなどクラウド案件も多くなってきました。