SSL

Secure Socket Layerです。暗号化通信で、いまやこれを使っていないWeb上のショップはだいぶん少なくなってきています。

暗号

暗号技術をまず大きく3つに分類して考えます。このあたりが混ざってしまうと説明書の通りにやるとSSLの設定はできたが、よくわからないままになってしまいます。

機密性:これがふつう思い浮かぶ暗号化です。解読できないよう暗号化します。
完全性:情報が改ざんされていないことを確認できる技術です。
信頼性:情報を送ってくれた相手が本物かどうかを確認する技術です。

ではまず通常のやりとりについて考えます。印鑑証明がいるような場合、銀行等で必要だといった場合、まず

1.市役所に自分の判子を印鑑登録しにいく
2.市役所から印鑑証明書が発行される。
3.その登録した判子で書類に判子を押す。
4.その書類と印鑑証明書を銀行に提出
5.銀行は書類に押してある判子と印鑑証明書の判子が同じであることの確認

ではコンピュータ上ではどうなるのでしょうか。まず市役所が

認証局(CA)

となります。また判子が

秘密鍵

となり、1の登録しにいくことが、

証明書要求(CSR)

になります。この証明書要求ファイルをベリサイン等(市役所)へ送って、電子証明書をもらうことになります。この中に公開鍵が含まれます。これが2にあたります。そして、デジタル証明書(印鑑証明書)を秘密鍵(判子)で暗号化して相手(銀行)におくります。受け取った相手(銀行)は、公開鍵を使って解読することになります。これが解読できれば、本人であることがわかります。ここで解読できるのでは、あくまでもデジタル証明書です。ではデータはどうなるのでしょうか。当たり前のことですが、データもサーバ側で秘密鍵で暗号化してしまうと、誰でもが公開鍵で解読されてしまいますので、問題がありますので、公開鍵ではなく、共通鍵を使います。ハイブリッドですね。通常公開鍵よりも共通鍵の方が早いのですが、秘密鍵には配送問題がつきまといます。このためクライアントが秘密鍵を生成して、(実際はプリマスターシークレット)その秘密鍵をサーバの公開鍵で暗号化しておくります。それをサーバが受け取り秘密鍵で解読し、共通鍵を共有し、その後やりとりを行っていきます。(参考:http://www.atmarkit.co.jp/fnetwork/rensai/cell05/ssl1.html)

ここで、機密性に当たるのが公開鍵暗号で、機密性はハッシュ計算で確認し、信頼性は、電子署名にあたります。

語彙

CA(Certificate Authority) 認証局
CSR(Certificate Signing Request) 証明書署名要求 証明書を発行してもらうために認証期間へ送る申請データ。
CRL(Certificate Revocation List) 失効したデジタル証明書のリスト。認証局(CA)や検証局(VA)が管理する。

証明書作成

/usr/share/ssl

/usr/share/ssl/openssl.cnf サンプル設定ファイル 対話モード時のデフォルトはここに記述
/usr/share/ssl/misc/CA 認証局証明書作成スクリプト -newcaで新規作成

とりあえず

yum install openssl-perl

していれてあります。 では、まず、

/usr/share/ssl/openssl.cnf (redhatの場合。openSUSEは/etc/ssl/openssl.cnf )

があるか確認しておきます。(参考:http://moca.wide.ad.jp/notes/ca_doc/openssl.html ) では/usr/share/ssl/openssl.cnfを編集します。

#nsCertType = server

のコメントをとって

nsCertType = server

に、また

# nsCertType = sslCA, emailCA

nsCertType = sslCA, emailCA

とします。 次に

/usr/share/ssl/misc/CA.pl

を編集します。(openSUSE:CA.sh)

DAYS="-days 365"

DAYS="-days 3650"

とすると10年有効になります。

CATOP=./demoCA

は、作成されるディレクトリです。適当に名前を変えておきましょう。では、

mkdir /usr/local/mycerts
cd /usr/local/mycerts

としてディレクトリをつくっておいて

/usr/share/ssl/misc/CA.pl -newca

でCAをつります。

linux:~ # /usr/share/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)
Making CA certificate ...
Generating a 1024 bit RSA private key
.........++++++
...++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase: パスフレーズ
Verifying - Enter PEM pass phrase:もう一度パスフレーズ
-----
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) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka-shi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hidekazu_ca
Organizational Unit Name (eg, section) []:hidekazu
Common Name (eg, YOUR name) []:hidekazu_private
Email Address []:msrx178mk2@hotmail.com

これで作成した場所にdemoCAというディレクトリができてます。

demoCA/
|-- cacert.pem CA用証明書
|-- certs 証明書のディレクトリ
|-- crl CRLのディレクトリ
|-- index.txt クライアント証明書用のDB
|-- newcerts クライアント証明書ディレクトリ
|-- private CAの秘密鍵ディレクトリ
|   `-- cakey.pem CAの秘密鍵 
`-- serial クライアント証明書のシリアル

ではCA証明書をブラウザにインポートするためのファイルを作成します。

openssl x509 -inform pem -in ./demoCA/cacert.pem -outform der -out ./demoCA/ca.der

(参考:http://www.aconus.com/~oyaji/www/ssl_client.htm
ではサーバの秘密鍵を作成します。

openssl genrsa -out server.key 1024
(des3の場合 openssl md5 *.* > rand.dat
 openssl genrsa -rand rand.dat -des3 1024 > server.key )
  • genrsa RSA鍵を作成
  • des3 DES3アルゴリズム使用
  • out 鍵ファイルの名前を指定
  • 1024 鍵の長さ

では次にCSR(証明書要求)を作成します。Organization NameはCAと違うものにしておきます。

openssl req -new -days 3650 -key server.key -out server.csr
(x509の場合 openssl req -new -x509 -days 3650 -key server.key -out server.csr)
Country Name             (2 letter code) [GB]:JP<リターン>
State or Province Name   (full name)     [Berkshire]:Osaka
Locality Name            (eg, city)      [Newbury]:Osaka-shi
Organization Name        (eg, company)   [My Company Ltd]:hidekazu
Organizational Unit Name (eg, section)   []:IT
Common Name              (eg, your name or your server's hostname)[]:hidekazu.dhs1.sst.ne.jp
Email Address            []:msrx178mk2@hotmail.com
  • req CSRの作成
  • new 新規に作成
  • x509 X.509形式のCSR作成
  • days 証明書の有効期限を設定
  • key 先ほど作成した鍵
  • out 作成するCSR

では次にサーバ用の証明書に署名して発行する前に、認証局が使用するシリアルナンバーのファイルを作成しておく必要があるので、

echo 01 > ca-cert.srl

ではサーバ用の証明書(server.crt)を作成します。

openssl x509 -CA demoCA/cacert.pem -CAkey demoCA/private/cakey.pem -CAserial ca-cert.srl -req -days 3650 -in server.csr -out server.crt

これで証明書ができました。apacheで利用する場合は、ssl.confに

SSLCertificateFile /usr/local/mycerts/server.crt
SSLCertificateKeyFile /usr/local/mycerts/server.key 

クライアント用証明書

これを使うとクライアント用の証明書がないマシンがアクセスしてきても拒否されるので、セキュリティはかなりあがります。 ではクライアントの証明書作成用リクエストファイルを作ります。

cd /usr/local/mycerts
echo 02 > ca-cert.srl

でシリアルをあげておきます。これをしていないとFirefoxでうまくインポートできなかったからです。 では、クライアント証明書用に/usr/share/ssl/openssl.cnfを編集します。

#nsCertType = server
#nsCertType = sslCA, emailCA

にして、

nsCertType = client, email

としておき、

/usr/share/ssl/misc/CA.pl -newreq
writing new private key to 'newreq.pem'
Enter PEM pass phrase: クライアント用パスフレーズ
Verifying - Enter PEM pass phrase:
-----
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) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka-shi 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:soshiki1
Organizational Unit Name (eg, section) []:user1 
Common Name (eg, YOUR name) []:user1
Email Address []:msrx178mk2@hotmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: リターン
An optional company name []: リターン
Request (and private key) is in newreq.pem

これでnewreq.pemができました。 ではクライアントの証明書を作成します。

/usr/share/ssl/misc/CA.pl -sign
sing configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:  CA用パスフレーズ
Check that the request matches the signature
Signature ok
Certificate Details:
       Serial Number:
           da:8f:3b:9c:bc:4f:69:27
       Validity
           Not Before: Apr 29 17:21:00 2006 GMT
           Not After : Apr 29 17:21:00 2007 GMT
       Subject:
           countryName               = JP
           stateOrProvinceName       = Osaka
           localityName              = Osaka-shi
           organizationName          = soshiki1
           organizationalUnitName    = user1
           commonName                = user1
           emailAddress              = msrx178mk2@hotmail.com
       X509v3 extensions:
           X509v3 Basic Constraints:
               CA:FALSE
           Netscape Comment:
               OpenSSL Generated Certificate
           X509v3 Subject Key Identifier:
               97:98:28:0C:3C:DB:5A:DB:6A:50:9D:0C:77:BD:5E:54:1B:62:8D:8F
           X509v3 Authority Key Identifier:
               keyid:65:24:1C:0D:57:53:2A:5A:FC:1C:50:A8:63:84:C0:2E:90:84:BD:6E
               DirName:/C=JP/ST=Osaka/L=Osaka-shi/O=Private_CA/OU=Admin/CN=Private_CA/emailAddress=msrx178mk2@hotmail.com
               serial:DA:8F:3B:9C:BC:4F:69:26
Certificate is to be certified until Apr 29 17:21:00 2007 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
Signed certificate is in newcert.pem

ここで

TXT_DB error number 2

とかエラーが場合は、demoCA/index.txtとca-cert.srlのシリアル番号の整合性がとれていない可能性があります。 何度もやり直している場合に起こりやすいので、一度index.txtをクリアにしてやるかすれば、エラーはでなくなります。 ではこれでnewcert.pemが作成されました。demoCA/index.txtに追加されているか確認しておきます。 では、pkcs12形式(鍵と証明書を固める)のクライアント用証明書を作成します。になります。

openssl pkcs12 -export -clcerts -inkey newreq.pem -in newcert.pem -out user1.p12 -name "user1key"
Enter pass phrase for newreq.pem: クライアント用パスフレーズ
Enter Export Password: Export用パスフレーズ
Verifying - Enter Export Password:

もしくは

/usr/share/ssl/misc/CA.pl -pkcs12 user1

ではこれをクライアントにインポートしておきます。(参考:http://www.aconus.com/~oyaji/www/ssl_client.htm#client) FireFox?の場合は、ツール>オプションでセキュリティタブの「証明書の表示」ボタンをクリックするとインポートできます。 さてここで問題になるのが、newcert.pemとnewreq.pemの2つのファイルです。クライアント証明書を作成するごとに作り直されるので、ここでは、

mkdir back
mv newcert.pem back/user1cert.pem
mv newreq.pem back/user1req.pem

としてバックアップをとってます。 ではapacheで利用する場合は、ssl.confに

SSLCACertificatePath /usr/local/mycerts/demoCA
SSLCACertificateFile /usr/local/mycerts/demoCA/cacert.pem
SSLVerifyClient require
SSLVerifyDepth 10

また特定のURLにだけにしたい場合は、そのディレクティブに

SSLVerifyClient require
SSLVerifyDepth 10

を設定します。 参考:http://japache.infoscience.co.jp/Apache-SSL/docs.html

ではクライアント証明書が必要なURLでphp等のプログラムを動かしたらどうなるでしょうか。この場合、ページを表示できませんと表示される場合があります。これにつきまてはApacheの方で。 [error] SSL Re-negotiation in conjunction with POST method not supported! hint: try SSLOptions +OptRenegotiate?

CAcert

フリーの承認機関です。では、アカウントを作っていきましょう。http://www.cacert.org/より右のメニューのJoin CAcert.org>Joinをクリックします。情報を入力しましょう。パスフレーズ(パスワード)は大文字小文字数値を入れる必要があります。
登録するとメールがきますので、24時間以内にクリックしておきましょう。
では、My Account>Normal Loginからログインしましょう。ログイン後、Translationsの日本語をクリックして、Domains>Addをクリックして、ドメイン名を入力して登録しておきましょう。するとメールを選択して、そのメールにURLがありますので、そのURLにとんで、確認が終わります。ではCSRを作成します。 https://www.cacert.org/help.php?id=4を参考に、

openssl md5 * > rand.dat
openssl genrsa -rand rand.dat -des3 1024 > server.key 
openssl req -new -key server.key -out myserver.csr

CAcertのServer Certificatesを選択し、newをクリックするとPaste your CSR below...とでますので、先ほど作成したCRSを貼り付けます。Submit後、証明書が表示されます。 ではこれをmyserver.crtで保存します。

TIPS

CSRの内容確認

openssl req -in hoge.pem -text

リンク

参考書籍

SSL/TLS導入ガイドブック
前半が大変ためになりました。後半はIISの設定だったんです...

UNIX USER 200507
「SSLで安心Webサービス」がためになりました。CAcertの記事があります。


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-11-01 (土) 06:11:00 (5671d)