SSLSecure 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 )
では次に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
では次にサーバ用の証明書に署名して発行する前に、認証局が使用するシリアルナンバーのファイルを作成しておく必要があるので、 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をクリックします。情報を入力しましょう。パスフレーズ(パスワード)は大文字小文字数値を入れる必要があります。 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で保存します。 TIPSCSRの内容確認openssl req -in hoge.pem -text リンク
参考書籍SSL/TLS導入ガイドブック UNIX USER 200507 |