実践で学ぶ、一歩進んだサーバ構築・運用術

第 6 回 stone (後編)


公開かぎと秘密かぎ

Web 用の暗号化方式として有名な SSL は, 暗号通信に先だってまず RSA 暗号*7 を使って サーバー・クライアント間で共通かぎ*8 を交換し, この共通かぎを使って通信を暗号化します。 その仕組みを簡単に図 5 に示しました。 より詳しく知りたい方は, 日本ベリサインのホームページの FAQ (http://www.verisign.co.jp/repository/faq/SSL/) を参照すると良いでしょう。

共通かぎを使って通信を暗号化する仕組み
図 5 共通かぎを使って通信を暗号化する仕組み

クライアントから接続要求(1)があると, サーバーは公開かぎ証明書(2)を返します。 クライアントは, この公開かぎ証明書からサーバーの公開かぎ(3)を取り出します。 次にクライアントはランダムな共通かぎ(4)を生成し, この共通かぎ(4)をサーバーの公開かぎ(3) を使って暗号化してサーバーへ送ります。

サーバーは, 自身で持っている秘密かぎ(5)を使って, クライアントから送られてきた共通かぎ(3)を復号化します。 以上で, クライアントとサーバーの双方が同じ共通かぎを持つことになりので, この共通かぎを使って暗号通信を行います(6)。

したがって SSL 通信を行うサーバーは, 公開かぎ証明書(2)と秘密かぎ(5)を持っている必要があります*9。 公開かぎ証明書は, 日本ベリサインなどの認証局(Certification Authority, CA) に発行してもらう*10 ほか, 後述するように自前の認証局をでっち上げれば, 自分で発行することもできます。

秘密かぎの作成と登録申請書の作成

認証局に公開かぎ証明書を発行してもらうために必要なのが, 登録申請書です。 OpenSSL の req コマンドを使って, 秘密かぎと登録申請書を生成する例を図 6 に示します。 登録申請書には, サーバーが属する組織名や所在地, メール・アドレスが含まれますから, それらのデータを入力しています。 入力し終えると, 秘密かぎのファイル「key.pem 」と登録申請書ファイル 「newreq.pem 」がカレント・ディレクトリに作成されます。


% openssl req -new -nodes -keyout key.pem -out newreq.pem Using configuration from /usr/local/ssl/openssl.cnf Generating a 512 bit RSA private key ..................................+++++.....+++++ writing new private key to 'key.pem' 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 )[JP]: State or Province Name (full name )[Some-State]:Kanagawa Locality Name (eg, city )[]:Kawasaki Organization Name (eg, company )[Internet Widgits Pty Ltd]:GCD Organizational Unit Name (eg, section )[]: Common Name (eg, YOUR name )[]:www.gcd.org Email Address []:webmaster@gcd.org Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
図 6 OpenSSL のreq コマンドを使って秘密鍵と登録申請書を生成する例

ここで注意することは, 生成する RSA 暗号かぎのビット長です。 デフォルトでは, 1024 ビットになっているのですが, 国内で使われている Web ブラウザの多くは, 512 ビットを超えるかぎを扱うことができません。 SSL 通信の対象として不特定多数の Web ブラウザを想定しているならば, かぎ長を 512 ビットにしておいた方が無難です。

かぎ長を 512 ビットにするには, req コマンドの引数に「-newkey rsa:512」オプションを付け加えるか, 設定ファイル「/usr/local/ssl/openssl.cnf」において, 「default_bits」の行を,


default_bits = 512
に変更します。 図 6 で req コマンドの出力の 2 行目が, 「Generating a 512 bit RSA private key」となっていることを確認してください。

秘密かぎ「key.pem」は サーバー・プログラム以外から読み出せないようにパーミッションを変更し, /usr/local/ssl/private ディレクトリに, ファイル名「www.pem」で保管します(図 7)。


# chown root.sslkey key.pem
# mv key.pem /usr/local/ssl/private/www.pem
図 7 秘密かぎを保管する

生成した登録申請書「newreq.pem」の例を図 8 に示します。 これを認証局に送れば*11, 公開かぎ証明書を得ることができます。


-----BEGIN CERTIFICATE REQUEST-----
MIIBMzCB3gIBADB5MQswCQYDVQQGEwJKUDERMA8GA1UECBMIS2FuYWdhd2ExETAP
BgNVBAcTCEthd2FzYWtpMQwwCgYDVQQKEwNHQ0QxFDASBgNVBAMTC3d3dy5nY2Qu
b3JnMSAwHgYJKoZIhvcNAQkBFhF3ZWJtYXN0ZXJAZ2NkLm9yZzBcMA0GCSqGSIb3
DQEBAQUAA0sAMEgCQQDev3CZ7ldEMJlPBYKxJhty1EdBl+HFs0a6r5oahBuqSYE3
nSUmwfP0pinBWkZ9+WQflwUHRe1lK5sqfZNv9pTRAgMBAAGgADANBgkqhkiG9w0B
AQQFAANBAMq02r3LCWP6IDZ8MwWxfVcC2u9C2A2BWgGxnp0EPFLIvK+Tohql7J+M
/rHr+/4fZwc2vVRBq9L4ft7c31/4L9Q=
-----END CERTIFICATE REQUEST-----

図 8 登録申請書「newreq.pem」の例

認証局の作成

ベリサインの場合, 法人格のない団体への公開かぎ証明書の発行は行っていないので, 個人で立ち上げているサーバーの場合は自前で認証局を立てた方が簡単です。

認証局の役割は,


(1)申請内容の確認申請者が当該ドメイン名の正規の所有者であることを確認する
(2)公開かぎ証明書の発行認証局の秘密かぎで電子署名を施す
ですが, 自前で認証局を立てる場合は, 申請者は自分自身あるいは周囲の人であることがほとんどでしょうから, (1)は確認するまでもないでしょう。

(2)を行うためには, 認証局の秘密かぎが必要になります。 まず, 認証局のためのディレクトリを決めます。 ここでは, /usr/local/ssl/CA とします。 このディレクトリ名を /usr/local/ssl/openssl.cnf の 「dir =」の行と(図 9), /usr/local/ssl/misc/CA.sh の「CATOP=」の行に設定します(図 10)。


[ CA_default ]

dir       = /usr/local/ssl/CA   # Where everything is kept

図 9 /usr/local/ssl/openssl.cnf の設定例


CATOP=/usr/local/ssl/CA
図 10 /usr/local/ssl/misc/CA.sh の設定例

次に /usr/local/ssl/misc/CA.sh -newca を実行します。 認証局の秘密かぎを守るためのパスフレーズを入力してください。 そして, 認証局の名称, 所在地,メール・アドレスを入力します(図 11)。


# /usr/local/ssl/misc/CA.sh -newca CA certificate filename (or enter to create ) Making CA certificate ... Using configuration from /usr/local/ssl/openssl.cnf Generating a 512 bit RSA private key ...........+++++................+++++ writing new private key to '/usr/local/ssl/CA/private/cakey.pem' Enter PEM pass phrase:XXXXXXXXXXXXXXX (伏せ字) Verifying password - Enter PEM pass phrase:XXXXXXXXXXXXXXX (伏せ字) 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 )[JP]: State or Province Name (full name )[Some-State]:Kanagawa Locality Name (eg, city )[]:Kawasaki Organization Name (eg, company )[Internet Widgits Pty Ltd]:GCD Organizational Unit Name (eg, section )[]: Common Name (eg, YOUR name )[]:Hiroaki Sengoku Email Address []:sengoku@gcd.org
図 11 /usr/local/ssl/misc/CA.sh -newca を実行してパスフレーズ, 認証局の名称,所在地,メール・アドレスを入力する

これで, /usr/local/ssl/CA/private/cakey.pem に認証局の秘密かぎが, /usr/local/ssl/CA/cacert.pem に認証局の証明書がそれぞれ作成されます。

公開かぎ証明書の発行

次に, 登録申請書「newreq.pem」のあるディレクトリで, 「/usr/local/ssl/misc/CA.sh -sign」を実行します(図 12)。 これでカレント・ディレクトリに, 公開かぎ証明書「newcert.pem」が作成されます。 これを /usr/local/ssl/certs ディレクトリに, 「www.pem」というファイル名で保管します(図 13)。


# /usr/local/ssl/misc/CA.sh -sign Using configuration from /usr/local/ssl/openssl.cnf Enter PEM pass phrase:XXXXXXXXXXXXXXX (伏せ字) Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Kanagawa' localityName :PRINTABLE:'Kawasaki' organizationName :PRINTABLE:'GCD' commonName :PRINTABLE:'www.gcd.org' emailAddress :IA5STRING:'webmaster@gcd.org' Certificate is to be certified until Jul 2 04:36:48 2001 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 Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=JP, ST=Kanagawa, L=Kawasaki, O=GCD, CN=Hiroaki Sengoku/Email=sengoku@gcd.org Validity Not Before: Jul 2 04:36:48 2000 GMT Not After : Jul 2 04:36:48 2001 GMT Subject: C=JP, ST=Kanagawa, L=Kawasaki, O=GCD, CN=www.gcd.org/Email=webmaster@gcd.org Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (512 bit) Modulus (512 bit): 00:de:bf:70:99:ee:57:44:30:99:4f:05:82:b1:26: 1b:72:d4:47:41:97:e1:c5:b3:46:ba:af:9a:1a:84: 1b:aa:49:81:37:9d:25:26:c1:f3:f4:a6:29:c1:5a: 46:7d:f9:64:1f:97:05:07:45:ed:65:2b:9b:2a:7d: 93:6f:f6:94:d1 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: B1:C5:6B:5A:83:3D:B4:42:13:37:EC:CC:C3:FF:14:C5:86:AB:19:AC X509v3 Authority Key Identifier: keyid:80:7B:D3:A7:F1:D4:33:46:1F:5E:FB:23:70:30:87:53:33:A5:EB:4F DirName:/C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/CN=Hiroaki Sengoku/Email=sengoku@gcd.org serial:00 Signature Algorithm: md5WithRSAEncryption 3e:c2:c1:e7:95:79:25:c9:32:dd:48:d9:10:10:3e:6f:50:47: bd:f2:a8:62:7e:dd:62:a7:78:21:4e:3b:af:60:d9:49:e2:25: 6f:93:b3:c7:c0:50:99:ab:ac:3c:69:ba:87:2d:ed:ab:f4:df: 84:81:f0:c6:e3:85:57:26:92:8b -----BEGIN CERTIFICATE----- MIIC6zCCApWgAwIBAgIBATANBgkqhkiG9w0BAQQFADB7MQswCQYDVQQGEwJKUDER MA8GA1UECBMIS2FuYWdhd2ExETAPBgNVBAcTCEthd2FzYWtpMQwwCgYDVQQKEwNH Q0QxGDAWBgNVBAMTD0hpcm9ha2kgU2VuZ29rdTEeMBwGCSqGSIb3DQEJARYPc2Vu Z29rdUBnY2Qub3JnMB4XDTAwMDcwMjA0MzY0OFoXDTAxMDcwMjA0MzY0OFoweTEL MAkGA1UEBhMCSlAxETAPBgNVBAgTCEthbmFnYXdhMREwDwYDVQQHEwhLYXdhc2Fr aTEMMAoGA1UEChMDR0NEMRQwEgYDVQQDEwt3d3cuZ2NkLm9yZzEgMB4GCSqGSIb3 DQEJARYRd2VibWFzdGVyQGdjZC5vcmcwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA 3r9wme5XRDCZTwWCsSYbctRHQZfhxbNGuq+aGoQbqkmBN50lJsHz9KYpwVpGfflk H5cFB0XtZSubKn2Tb/aU0QIDAQABo4IBBDCCAQAwCQYDVR0TBAIwADAsBglghkgB hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE FLHFa1qDPbRCEzfszMP/FMWGqxmsMIGlBgNVHSMEgZ0wgZqAFIB706fx1DNGH177 I3Awh1MzpetPoX+kfTB7MQswCQYDVQQGEwJKUDERMA8GA1UECBMIS2FuYWdhd2Ex ETAPBgNVBAcTCEthd2FzYWtpMQwwCgYDVQQKEwNHQ0QxGDAWBgNVBAMTD0hpcm9h a2kgU2VuZ29rdTEeMBwGCSqGSIb3DQEJARYPc2VuZ29rdUBnY2Qub3JnggEAMA0G CSqGSIb3DQEBBAUAA0EAPsLB55V5Jcky3UjZEBA+b1BHvfKoYn7dYqd4IU47r2DZ SeIlb5Ozx8BQmausPGm6hy3tq/TfhIHwxuOFVyaSiw== -----END CERTIFICATE----- Signed certificate is in newcert.pem
図 12 公開かぎ証明書「newcert.pem」を作成する


# mv newcert.pem /usr/local/ssl/certs/www.pem
図 13 作成した「newcert.pem」を「www.pem」というファイル名で /usr/local/ssl/certs ディレクトリに保管する

着呼側の設定

stone を SSL 暗号通信を受け付けるサーバーとして動作させるには, -z オプションで秘密かぎと公開かぎ証明書のパスを設定してから, 「受けポート」に「/ssl」を付けます。 例えば, ポート 1540 番で UUCP over SSL を受け付けるには, 図 14 のように実行します。 図 14 において, 「-z key=ファイル名」が秘密かぎのパスの設定, 「-z cert=ファイル名」が公開かぎ証明書のパスの設定です。 ただし, localhost のポート 540 番(uucp ポート)で UUCP over TCP/IP を受け付ける設定になっているものとします。


stone -z key=/usr/local/ssl/private/www.pem \
  -z cert=/usr/local/ssl/certs/www.pem \
  localhost:uucp 1540/ssl &

図 14 stone を SSL 暗号通信を受け付けるサーバーとして 動作させるための実行例
*7 RSA 暗号
代表的な公開かぎ暗号。米RSA Security 社の暗号化技術である。
*8
共通かぎは, 暗号化と復号化に同じかぎを用いる対称暗号方式におけるかぎを指す。
*9
図 5 から分かるように, クライアント側は事前にかぎを用意する必要がありません。
*10
日本ベリサインの場合は年間 12 万 6000 円かかります。
*11
14 日間無料のテスト用公開かぎ証明書が次の URL から取得できるので, とりあえず試してしてみたい方は利用してみると良いでしょう。 http://www.verisign.co.jp/landing/go_vsi.htm

(stone 利用の実例)


banner 本稿は日経Linux 2000 年 9 月号に掲載された、 実践で学ぶ、一歩進んだサーバ構築・運用術, 第 6 回「stone (後編)」を日経BP 社の許可を得て転載したものです。

Copyright(C)2000 by 仙石浩明 <sengoku@gcd.org>
無断転載を禁じます

| home | up |

sengoku@gcd.org