HTTPSにするために必要な下準備

# 概要

HTTPSにするにはどうしたらいいんだ！？と困った自分に捧げるメモ。

# 積み残し

- **本番環境にHTTPSを反映する際にテストのやりかた**
- **本番環境をHTTPからHTTPSにするときの影響範囲の調査方法**

どなたか知見のある方教えていただけると嬉しいです・・・

# 基本用語
## HTTPS

httpsはSSLを利用したhttp通信のこと。情報の内容が暗号化されているため、万が一情報を抜き取られても中身を読むことは不可能と言われる。

## SSL
SSL(Secure Socket Layer)とは、インターネット上で情報を暗号化し、送受信できるプロトコル（一般にhttps://と表記されるもの）。顧客情報やクレジットカード情報、その他、管理情報などを扱う際はこのSSLを利用して通信する必要がある。

## SSLサーバー証明書
SSLを利用するにはSSLサーバー証明書をインストールする必要がある。正規にはサーバ証明書を購入する必要がある。

ここまでで基本用語の説明は終わり。手順に入ります。

# 手順概要

1. SSL証明書の手配と購入
2. SSL証明書の申請・インストール・サーバー設定
3. ソースコードの置き換え
4. サイトのHTTPS（SSL）化のテスト確認
5. HTTPからHTTPSへのリダイレクト
6. ウェブマスターツールへの新規設定

# 1. SSL証明書の手配と購入

SSL証明書には数千円～数十万と振れ幅が大きいですが、証明書によって、暗号化強度が異なったり、対応するブラウザ（テストされたブラウザ）に違いがあったり、「EV SSL」のように安全性の高さを視覚的にも強調したものなど種類がある。種類についての話はまた後日まとめる。また、安すぎて不安…、SSL発行元の企業に信頼性が置けないなどの判断をした場合は、少し高めで割とメジャーなrapidSSL（年間1万円前後）か、グローバルサインのクイックSSLなどがおすすめとのこと。

# 2. SSL証明書の申請・インストール・サーバー設定

SSL証明書はいきなり購入して設定できるわけではなく、
まず申請元の情報を提供して審査にかけてもらい、審査が通った場合に証明書が発行され、サイトの存在するWebサーバー上で設定作業をする必要がある。

そしてこの申請の際に必要なのがCSR（Certificate Signing Request）であり、サーバー上で作成することがある。

申請から設定までの大まかな作業は下記の通り。

1. CSRを作成する（組織情報や公開鍵の作成）
2. CSR情報の入ったファイルをSSL証明書ベンダーに渡して申請
3. 審査が通ればSSL証明書が発行され情報が送られる
4. 中間 CA 証明書と SSL サーバ証明書のインストール
5. この2と3はただの申請のやり取りなのですが、

1と4はコマンドライン上での作業がメインとなり、linuxに慣れていない場合や、SSLや公開鍵などの仕組み自体がわかっていない人が簡単にできる作業ではない。自分でできなくはないけれども、面倒なのでやりたくない。

そんなユーザを想定してか、レンタルサーバー（エックスサーバー、さくらインターネットのレンタルサーバー）では、SSLの申請からインストールまですべて対応してくれるという素敵なサービスがある。感動。お金をかけても手間を省きたい人はそちらにお任せすると良い。申請からの時間も結構短いらしい。

# 3. ソースコードの置き換え

具体的に置き換えるべきと思われる箇所は二つ。

1. HTTPでベタがきしている点
2. ソース内の「src="http://something"」や「srcset="../somthing"」などの点
3. ソースコードの一部をデータベースに入れているような構成にしている場合はそちらも上記２点

これらを置き換えが全て終われば、基本的にはHTTPSとなっている。

# 4. サイトのHTTPS（SSL）化のテスト確認

検索エンジンでインデックスされているURLやソーシャルリンクなどは旧URLのままのはず。
サイト内の回遊以外は原則HTTPSでのアクセスはほとんどない。

ここで再度サイト全体のチェックを行う。
1ページずつチェックして見ていくのはさすがにしんどいため、
なるべく一括でできる方法がよいのですが、うまい方法がわからない。積み残し。 
（再帰的にwgetで標準出力して、grepするなどあるのかもしれないが、使いこなせていない）

## ようやくHTTPS化が完了か

さてようやく、すべてのページでHTTPリソースの混合のないHTTPSページができあがったと思います。
気になる方は、いくつかページを実際に確認してチェックするのが良いと思います。
Chromeなどのブラウザでは、HTTPSページに問題がある場合、コンソール上に警告表示をしていますので、それを参考にできるはずです。

# HTTPからHTTPSへのリダイレクト

HTTPS対応が完了したら、従来までのHTTPでのアクセスのための作業を行う。

たとえば、検索エンジンのインデックスされたURLは当分はHTTPのまま。
TwitterやFacebookで共有されているリンクもHTTP。
サイトに訪問するユーザがHTTPSでウェブサイトを見れるように、
リダイレクト処理をしてあげるのが(今の所思いつく)ベストのはず。

リダイレクト方法には色々あるが、
ここでは、「.htaccess」でmod_rewrite.cを利用してリダイレクト処理を行う。
サーバーや利用モジュールによって方法は異なりますがやっていることはほとんど同じ。

```
<IfModule mod_rewrite.c>
RewriteEngine On
# Something
# …
# HTTP to HTTPS 
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
```

やっていることは

- HTTP（%{HTTPS} off）のアクセスの場合に、
- すべてhttpsから始まるリクエストのあったURLを引き継いで
- 301リダイレクト（R=301）し、処理を終了する（L）

の３つ。

# ウェブマスターツールの新規設定

ウェブマスターツールは、httpとhttpsのURLを区別して管理している模様。
新しくプロパティを新規追加して登録する。

また新規登録後なので、インデックス送信・サイトマップ送信を併せてしておくと良いとのこと。

**手順的には以上**

#　世間的にはオレオレ証明書と言われるものの作り方


### 秘密鍵(key)の作成
```bash
# モジュールのインストール
$ yum -y install mod_ssl

# 秘密鍵の作成
$ openssl genrsa -aes128 2048 > server.key
```

`-aes128`は暗号化方式。使用可能な暗号化方式を確認するには、`openssl enc --help`というコマンドを実行すれば一覧表示される。`2048`という数字は鍵の長さ。暗号を解く難易度による関係上、鍵の長さは__2048ビット以上が推奨__されている。拡張子は実はpemとかもある。

上記コマンドを実行すると、以下のようにパスフレーズを聞かれるので、任意のものを設定。

```bash

Generating RSA private key, 2048 bit long modulus
.............++++++......................++++++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase: パスフレーズ
Verifying - Enter pass phras: パスフレーズ
```

### 公開鍵(csr)の作成
CSR(Certificate Signing Request)とは、SSL証明書を作成する元になる情報が記載されているもの。小駒cで作成しておいて、依頼するといった手もある(さくらインターネットの代行サービスなどがそうだったはず)。内容は、組織名やサーバのアドレスなどの方法。

```bash
# 公開鍵の作成
# server.keyは先ほど作成したもの
$ openssl req -new -key server.key > server.csr
```

秘密鍵と同様に、上記コマンドを実行すると、以下のようにいろいろ聞かれるので、適宜変更して設定。

```bash

Enter pass phrase ofr 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,
fi you enter '.', the field will be left blank.
Country Name (2 letter code) [AU]: JP　　　←（国名）
State or Province Name (full name) [Some-state]: Kanagawa　　　<=（都道府県）
Locality Name (eg, city) []: Odawara-shi　　　←（市区町村）
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Example Inc.　　　<=（会社名）
Organizational Unit Name (eg, section) []: Example Section　　　<=（？）
Common Name (eg, YOUR name) []: example.com　　　<=（任意）
Email Address []: sample@sample.jp　　　<=（メールアドレス）


Pleaseenter thee following 'extra' attributes to be sent with your certificate request
A challenge password[]: パスワード　　　<=（任意）
An optional company name []: example　　　<=（任意）
```

よく分からなかったら、パスフレーズとパスワード以外は空白でも問題なかった（はず）なので、そのままenterでも作成される。

### デジタル証明書(crt)の作成
__デジタル証明書__とは、公開鍵が真正である証明するデータ。正式なものでは、認証局（CA）を通してデータの作成者を証明することができる。

```bash
# デジタル証明書の作成
# server.csrは先ほど作成した
$ openssl x509 -in server.csr -days 365000 -req -signkey server.key > server.crt
```

こちらもコマンドを実行すると、再度パスフレーズを聞かれるので、入力。

```bash
Signature ok
subject=/C=JP/ST=Tokyo/L=Shibadaimon,Minato-ku/O=ExampleInc./OU=Example
Section/CN=example.com/emailAddress=sample@sample.jp

Getting Private key
Enter pass phrase ofr server.key: パスワード
unable to write 'random state'
```

最後のパスフレーズはserver.keyを作成した時に設定したものを入力する。
以上で鍵、証明書の作成は終了。

### Apacheの設定
Apacheの設定では、通常のhttp(ポート:80)の設定とは別に、https(ポート:443)の設定を行う必要がある。（SSLではポート番号は443）

`/etc/httpd/conf/httpd.conf`または`httpd.conf`にてincludeされる`.conf`ファイルのどこでもいいので下記を追記。

```apache
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/httpd/conf/server.crt
    SSLCertificateKeyFile /etc/httpd/conf/server.key

    ... (以下httpでの設定と同様)
</VirtualHost>
```

鍵ファイルと証明書を上記で指定したディレクトリに移す。最後にApacheを再起動して完了。

以上。