SSL

 SSL(Secure Socket Layer)とは

SSL(Secure Socket Layer)とは、 インターネット上で情報を暗号化して送受信するプロトコルで、 Netscape Communications社より開発されました。
その後、 IETFよりRFC2246としてTLS1.0を公表されました。 現在ではこのTLS(Transport Layer Security)という名称が使われ、 TLS 1.1、TLS 1.2と発展しています。
これらはコネクション型のトランスポート層プロトコルの暗号用として使われます。
したがって、この上位アプリケーションであるHTTP、SMTP、POP3、FTPなどで、 アプリケーションに変更なしで暗号通信を使えるようになります。
以下で簡単にSSLの動作を(サーバー側のみの認証の動作)説明します。

  1. サーバー側は予め、公開鍵をCAに登録し、電子証明書を取得してサーバーに配置します。
  2. 1で得られる電子証明書は、CAが署名します。同時にリポジトリで公開します。
  3. クライアントからサーバーに接続して、電子証明書を取得します。
  4. その証明書をCAのリポジトリで確認し、証明書よりサーバー側の公開鍵を取り出します。
  5. 暗号通信に使う共通鍵の生成用に使うプリマスタシークレットを生成し、 4で取り出した鍵で暗号化してサーバーへ送信します。
  6. クライアントとサーバーで、同じプリマスタシークレットから共通鍵を生成します。
  7. 以上で鍵交換が終わりで、その鍵で暗号化した通信を行います。

実際のアルゴリズムは 複数の選択肢が定義されており、 SSL通信の開始時に行われるネゴシエーション時に、 双方で可能なアルゴリズムの中から選択されます。 SSL通信時開始時にサーバーとブラウザとの間でSSL セッションIDと呼ばれる識別番号が取り決められ, サーバーとクライアントのそれぞれで通信時にIDを管理し、 IPアドレスとポート番号との組み合わせに対応付けていいます。 その意味から、SSLはセッション層のプロトコルと言えます。 またこのIDは、SSL通信のサーバー負荷分散などにも利用されます。

 OpenSSLを使ったApacheサーバーの設定例

このページのステップ1で作成したダミー認証局で、サーバー証明書を作成する例です。 その環境と同じ場合の説明です。 また、申請側の秘密鍵は tarou.key の名前で作ってあるとします。

サーバー証明書署名要求申請 

まず、X.509のサーバー証明書署名要求ファイル(Certification Signing Request)を作成して、認証局(CA)に申請します。
以下は、カレントディレクトリに申請側の秘密鍵は tarou.key がある場合の、 opensslを使って、サーバー証明書署名要求ファイルのtarou-web.csrを作っている例です。

-bash-3.2$ openssl req -new -key  ./tarou.key -out ./tarou-web.csr
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) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:chiyoda-ku
Organization Name (eg, company) [My Company Ltd]:dummyCA
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:f270na-53
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
-bash-3.2$

f270na-53の部分が、FQDN(完全修飾ドメイン名)を記述する部分です。 実験ではローカルアドレスの指定も可能でした

認証局側のサーバー証明書作成 

実際の申請形態はWebやメール、書類など認証局によりさまざまです。 認証局では、この資料によって、申請者が記載通りに存在するかなどの身元調査を行います。 また使うサーバーによって鍵の保存形式も異なるのでその種類が求められるでしょう。
以下は、上記のように作成された署名要求ファイル(tarou-web.csr)から サーバー証明書(tarou-web-ca.crt)をopensslコマンドで作成している例です。

-bash-3.2$ openssl ca -config /home/koushi/suzuki/etc/CA/openssl.cnf -out ./tarou-web-ca.crt -infiles ./tarou-web.csr
Using configuration from /home/koushi/suzuki/etc/CA/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 8 (0x8)
        Validity
            Not Before: Oct 21 04:24:18 2011 GMT
            Not After : Oct 20 04:24:18 2012 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = dummyCA
            commonName                = f270na-53
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                ED:AB:74:E0:7D:B6:E4:84:F2:62:5F:F6:20:89:2B:60:4F:F6:AC:AB
            X509v3 Authority Key Identifier:
                DirName:/C=JP/ST=Tokyo/L=Shinjuku-ku/O=dummyCA/CN=test/emailAddr
ess=test@dummy.ne.jp
                serial:B7:29:5A:3C:E2:41:5F:5B

Certificate is to be certified until Oct 20 04:24:18 2012 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
-bash-3.2$

取得したサーバー証明書をサーバーに設定する例 

必要なファイルは、上記で取得したサーバー証明書(tarou-web-ca.crt)と 秘密鍵(tarou.key -out)がある状態です。鍵の設定ファイルを編集して、 鍵をパスを設定します。
apacheの例を以下に示します。
鍵が、/etc/keysの位置にある場合です。 /etc/httpd/conf.d/ssl.confを編集します。
次の2項目を、以下のように変更します。
SSLCertificateFile /etc/keys/tarou-web-ca.crt
SSLCertificateKeyFile /etc/keys/tarou.key
そして、apacheを再起動します。

[root@akia keys]# /etc/rc.d/init.d/httpd restart
httpdを停止中:                                             [  OK  ]
httpdを起動中:                                             [  OK  ]
[root@akia keys]#

もう一つ、XAMPPのapache設定例を示します。
E:\xampp\apache\conf\ssl.crt\に、tarou-web-ca.crtとtarou.keyをコピーした場合の例です。その場合、
E:\xampp\apache\conf\extra\httpd-ssl.confの内容の次の2項目を変更します。
SSLCertificateFile "conf/ssl.crt/tarou-web-ca.crt"
SSLCertificateKeyFile "conf/ssl.key/tarou.key"

このようにして、このサーバーにInternet Explorer 8で接続した場合の例を示します。
次のような警告が出るでしょう。

このような表示の場合は、閲覧すべきではありません。
上記で作成した証明書が、正規の認証局で署名したものではないからです。
この例では、ダミーの認証局の証明書がInternet Explorer 8に登録されていないからです。

このような場合、安易に対応の認証局の証明書インポートすべきではありませんが、以下でインポートの例を示します。
「ツール」メニューの「インターネットオプション」で出現するダイアログで、 『コンテンツ』タブを選んでいるの状況が下記イメージです。

ここで。「証明書」のボタンをクリックします。

この場合は、「信頼されたルート証明機関」でインポートします。

次へ進みます

tarou-web-ca.crtの署名をしたダミー認証局の証明書を参照して、次のボタンをクリックします。 (なお、ここで作成した認証局証明書ファイル(cacert.pem)の拡張子を.crtに変更したものを参照している例です。)

次へ進みます

これで設定が終わりです。これで再びサーバーに接続した例を下記に示します。


アドレスの部分に鍵のマークが付いて、この時にブラウザとサーバー間の通信が暗号化されていることになります。 また鍵の部分のクリックで、サーバーの証書が確認できます。

Extended Validation 証明書
現在、安直な確認による証明書と、厳格な審査をした証明書とが区別されてこなかったため、 逆に悪意ある者たちによって信頼性を見せかけるためにSSLが使われ始めるようになるなどの 混乱が生じています。
そこで、発行者の審査に厳格な一定の基準を設けたサーバー用の公開鍵証明書として EV SSL証明書と呼ばれるものが使われるようになっています。 参考ページ→日本ベリサイン

SET:Secure Electronic Transaction

例えば、SSLをオンラインショッピングの電子決済に使ったとします。 その場合、通信途中でクレジット会社の盗聴を防げます。 しかしショッピングサイトがクレジット情報を悪用する恐れに対応できません。 そこで支払い中継所を用いてクレジットカードの認証を行い、 ショッピングサイトにクレジット情報を流さないようにした手法が 、米ビザ・インターナショナルと米マスターカード・インタナショナルが共同開発されました。 これは、セット(SET:Secure Electronic Transaction)と呼ばれ、その取引の流れは以下のとおりです。 あらかじめ、顧客/電子商店の双方で、所定の手続きにより、認証局から証明書を取得して、 当該システムを作ります。
  1. 顧客から電子商店に対し、商品購入の申し込み
  2. 電子商店からクレジットカード会社へ取引承認要求
  3. クレジットカード会社から電子商店へ承認結果応答
  4. 電子商店から顧客へ販売確認応答