みなさんはインターネットを使うとき、セキュリティって意識していますか?
映画のチケットや飲み会の席は、ネットで簡単に取れる時代になりました。
中には「ネットからの予約だけ」というようなサービスもありますね。
HTTPSを使って、暗号化通信を意識せずに操作している方も多いかと思います。
ブラウザのURLの横のアイコンが南京錠になっていると、HTTPSを使っていることが分かりますが、みなさんはご存知でしょうか。
以前、XAMPPを使っているWindowsのサーバでHTTPS通信が必要になったので、CSRを作りました。
少し手間取ってしまったので、備忘の意味を込めて、書いておきたいと思います。
なお、前半は言葉の説明・解説です。作り方は後半に書いてあります。
HTTPS・SSL・CSRってなに?
HTTPS(Hypertext Transfer Protocol Secure)のSはセキュアのSです。つまりWebでセキュアな通信ができるプロトコルですね。URL(URI)の一番最初にスキームとして書きます。
このセキュアな通信をするために、SSL接続を行っています。
正確にいうとTLS(Transport Layer Security)を使っているのですが、TLSはSSL(Secure Sockets Layer)の後継として作成され、SSLのほうが名が通っていたため、TLSを含む広義的な意味があるそうです。TLS/SSLやSSL/TLSと併記されていることも良くあります。
HTTPSでは、SSLかTLSがクライアントとサーバ間で選択されます。
SSLには脆弱性が発見されているため、通常はTLS 1.0以上が選択されるそうです。
ブラウザの南京錠のアイコンをクリックすると、何が選択されているか確認できます。
但し、古いブラウザ(フューチャーフォンの付属など)でTLSに対応していないと、SSLになってしまうことがあるとのことなので、注意しましょう。
これ以降は、TLS,SSL含めて、SSLと記載しています。
CSRは、Certificate Signing Request(証明書発行要求)の略称です。
SSLではサーバ証明書が必要で、その発行のための申請書のようなものです。
SSLってなにができるの?
SSLでは、主にサーバの認証、通信の暗号化、改ざん検出ができます。サーバが持っている証明書を検証することで、サーバが「なりすまし」でないことを証明できます。
また、サーバの証明書と一緒になっている公開鍵で、通信の暗号化に使う共通鍵(正しくは共通鍵の種)を共有します。
この共通鍵で通信の暗号化と改ざん検出を行っています。
今回は、通信の暗号化をしたいためにSSLを導入していきます。
※この他にクライアントの認証ができますが、今回の目的から外れているので割愛します。
SSLってなにをやってるの?
SSLがどのように通信を開始するか、簡単に説明したいと思います。1.SSL通信の要求をする
最初にサイトの閲覧者が「SSLで通信したい」とリクエストを送るところから始まります。具体的には、URLの先頭(スキーム)が通常HTTPとなっているところをHTTPSにするだけで、「SSLで通信したい」とリクエストを送っていることになります。
これで、このWebページにSSLで通信したいとリクエストを送ることができ、あとはコンピュータ同士が勝手に対応してくれます。(だからこそのプロトコルですね)
2.Webサーバがサーバ証明書を送る
Webサーバがサーバ証明書(とサーバの公開鍵)をサイトの閲覧者のコンピュータに送ります。また、サーバ証明書を発行した認証局の証明書も同時に送ります。
さらに、認証局の証明書を発行した認証局があるならその認証局の証明書を送り、さらにまたその証明書を発行した認証局の証明書を送ります。
なんだか、雪だるま式に増えていきそうですが、たいていは認証局の証明書は1つか2つ先が最後になります。
最後の認証局をルート認証局といいます。
3.サーバ証明書の検証
サイトの閲覧者のコンピュータが、サーバ証明書の検証を行います。まずはルート認証局が信頼できるかを検証します。
あらかじめ信頼できるルート認証局の証明書を、コンピュータが持っているので、それをサーバからもらった証明書と突き合わせて確認して検証します。
ルート認証局が証明できたら、ルート認証局の公開鍵を使ってルート認証局から認証を受けた認証局の証明書を検証し、証明できたらさらにその証明書についている公開鍵で証明書を検証・・・という風に順に検証していきます。
4.共通鍵の共有
暗号化に使う共通鍵(の種)を生成し、サーバへ送って共有します。この共通鍵が漏れてしまっては暗号化の意味がないため、サーバ証明書についてきた公開鍵で暗号化します。
5.暗号化通信
共通鍵を使って暗号化された通信を開始します。データを送る時は共通鍵を使って暗号化し、データを受け取ったときは共通鍵を使って復号化(解読)します。
※公開鍵:公開鍵暗号に使われる「公開鍵」。暗号化した情報は「秘密鍵」がないと復号化(解読)できない。現在、秘密鍵の解析には数億年以上かかるのものが使用されている。
※共通鍵:共通鍵暗号に使われる「共通鍵」。暗号化した情報は同じ「共通鍵」でしか復号化(解読)できない。
※公開鍵暗号と共通鍵暗号:公開鍵暗号方式は、共通鍵暗号方式に比べて非常に処理に時間がかかる。共通鍵暗号方式は処理は早いが、共通鍵の共有のために通信が傍受されてしまう可能性がある。そのため、公開鍵暗号方式で共通鍵の共有を行い、暗号化自体は共通鍵暗号方式で行っている。
CSRってどうやってつくるの?
さて、今回はSSL通信をするためにサーバ証明書を取得しなければなりません。サーバ証明書を取得するには、CSR(証明書発行要求)を認証局に送る必要があります。
今回はXAMPPをインストールしてあるWindowsサーバで既にopensslが利用できるので、こちらを使っていきます。
また、暗号化メインのため、事業者の証明はできないものを取得しています。
手順は以下の通りです。
1.準備
・ドメイン
今回はドメインに対する証明書を取得します。なので、事前にドメインを取得しておく必要があります。また、できればwhoisに情報を登録しておきましょう。
whoisとCSRに書く情報が一致していると、審査が通りやすくなるそうです。
また、認証局によって、サブドメインから全部固定のもの、www付きとwww無し両方が取得できるもの、サブドメインを全て取得できるワイルドカードなものまであります。
それぞれ価格なども違うため、注意しましょう。
※今回はサブドメインまで固定で作っています。
・メール受信
認証局とのやり取りは主にメールなので、メールが利用できる必要があります。しかも、取得対象のドメインのメールアドレスが良いとのこと。
幸い、XAMPPにはMercuryというメールサーバのソフトが入っているので、こちらを利用しました。
ちなみに、受信だけで問題なさそうです。
認証用のURLや証明書データが送られてくるので、保存・コピペができれば問題ありませんでした。
なお、whoisに登録しているメールアドレスや、下記のCSRに記載するメールアドレスでも良い場合もあるようです。
・署名する情報の準備
署名するとあとから変えられず、再発行となってしまうので注意が必要です。また、英語での入力なのでミスタイプに注意しましょう。
ドメインを間違えたまま申請してしまったら、元も子もありません。
入力 | 意味 | 値 | |
---|---|---|---|
Country Name (2 letter code) |
国名(ISO 3166-1) | JP | 日本はJP |
State or Province Name (full name) |
州などの名前 | Tokyo | 都道府県名 |
Locality Name (eg, city) |
地名 | Taito-ku | 市区町村名 |
Organization Name (eg, company) |
組織名 | Risewill, Inc. | 会社名など |
Organization Unit Name (eg, section) |
組織内の部署名 | 部署名。なければ空で | |
Common Name (eg, YOUR NAME) |
コモンネーム 一般名 |
xxx.yyyy.zz | ドメイン名 今回はサブドメイン付き |
Email Address | メールアドレス | admin@ xxx.yyyy.zz |
連絡先。なければ空 |
補助として以下も入力します。空で可 | |||
A challenge password | チャレンジパスワード | ||
An optional company name | 会社名(補助) |
2.OpenSSLの設定値の変更
OpenSSLの設定ファイル(openssl.cnf)が「C:\xampp\apache\bin\」にあります。今回これを元に編集するので適当なディレクトリを作ってコピーします。
※XAMPPインストール先がデフォルトの「C:\xampp\」の場合です。
今回は「C:\xampp\apache\conf\ssl」としました。
中身を編集します。
RANDFILEの「$ENV::HOME/.rnd」を「.rnd」に
CA_defaultにあるdirの「./demoCA」を「demoCA」に変更しました。
また、ファイルパスの区切りが「/」になっているところを「\」に修正しています。
3.秘密鍵ファイルの作成
OpenSSLを起動して秘密鍵ファイルを作成します。openssl.exeは「C:\xampp\apache\bin\」にあります。
カレントディレクトリを先程設定ファイルを作ったディレクトリとして起動します。
コマンドはこんな感じです。
cd C:\xampp\apache\conf\ssl
..\..\bin\openssl.exe
OpenSSLが起動したら秘密鍵ファイルの作成コマンドです。秘密鍵ファイル名はなんでもよいです。XAMPPに初期で設定されているのは「server.key」なのでここではこれを使用しています。
キーの長さは2048bitにしています。
OpenSSL> genrsa -out server.key 2048
「C:\xampp\apache\conf\ssl」に秘密鍵ファイルができます。このファイルは暗号の要ですので、絶対に外部に漏れないように気を付けてください。
4.CSRファイルを作成する
続いて目標のCSRファイルを作成します。秘密鍵ファイルを作ったコマンドに引き続き、OpenSSLに入力します。
ここで、上で用意しておいたデータを入力してください。
拇印にはSHA1を使っていますが、SHA256も使えるようです。
OpenSSL> req -new -config openssl.cnf -key server.key -out csr.pem -sha1
対話形式でデータを入力すると「C:\xampp\apache\conf\ssl」にCSRができます。データ入力を間違ったら、もう1回コマンドを打ってCSRファイルを再度作って下さい。
CSRをテキストエディタで開くと以下のようなヘッダとフッタのあるなんだか長い文が出てきます。
-----BEGIN CERTIFICATE REQUEST-----
### 省略 ###
-----END CERTIFICATE REQUEST-----
あとは、認証局で手続きを行い、申請が通ればサーバ証明書(と中間証明書)が届きます。そこからのお話は、長くなってしまったのでまた今度に。
終わりに
昨今、いろんなサイトがHTTPSの導入しています。トレンドとしては、サイト全体をHTTPSで接続できるようにするのだそうです。
今は、格安で証明書を発行してくれるところも多くなりましたので、ちょこっと試してみるのもできるようになりました。
安く導入ができるようになったのは素晴らしいですね。けれど、HTTPSだからと安心して入力したら、そもそもURLが詐欺だったなんてこともあるので、注意が必要ですね。
今回、参考にさせていただいたサイトは以下の通りです。
HTTPS(Hypertext Transfer Protocol Secure) http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml http://tools.ietf.org/html/rfc7230#section-8.2
TLS(Transport Layer Security) SSL(Secure Sockets Layer) http://www.internetsociety.org/deploy360/resources/tls-developer-libraries/
openssl.cnfの変更 http://www.koikikukan.com/archives/2011/05/20-023456.php