Recent Posts

RSS Feeds

3. OpenSSLでクライアント認証「クライアント認証環境構築編」

Translate to English / Google/Yahoo

今日は、OpenSSLを使用してディレクトリサーバとブラウザにクライアント証明書を
インストールして、Web サーバとブラウザ間でクライアント認証を行う
方法について紹介します。
設定手順は下記の通りです。


設定手順

手順1:Web サーバとディレクトリサーバの連携設定
手順2:Web サーバのHTTPリスナーの編集
手順3:Web サーバのアクセスコントロールの設定
手順4:Web サーバのcertmap.confの編集
手順5:ディレクトリサーバの拡張設定
手順6:新規ユーザの作成
手順7:クライアント証明書の作成
手順8:ブラウザへクライアント証明書のインストール
手順9:ディレクトリサーバへクライアント証明書のインストール


前提:
ブラウザから送信されたクライアント証明書を
Webサーバ側で比較するわけですが、比較対照の
クライアント証明書はディレクトリサーバ側で
保持します。そこで、Webサーバとディレクトリ
サーバの連携を行う必要があります。

※ Webサーバ上の静的ファイル中に証明書を
  保持する事もできますが、セキュアな環境を
  構築したい場合、外部のディレクトリサーバに
  証明書データを保持しておいた方が安全です。

※ ディレクトリサーバは既に別途インストールされている事を
  前提として記述します。


手順1:Web サーバとディレクトリサーバの連携設定

Web サーバの管理画面より、「構成」→「対象の構成(sw-120)」→「アクセス制御」
→「認証データベース」を選択してください。

ここでは、デフォルトで「keyfile」と呼ばれる認証データベースが存在しますが、
ディレクトリサーバと連携する為に、「新規」ボタンを押下してください。



「新規」ボタンを押下すると下記の画面が表示されます。
ここでディレクトリサーバに接続する為に必要な情報を入力し、
「了解」ボタンを押下してください。



「了解」ボタンを押下すると下記の画面が表示されます。
「配備保留中」リンクをクリックしてください。



「配備保留中」リンクをクリックすると下記のウィンドウが表示されます。「配備...」
ボタンを押下してください。





「配備...」ボタンを押下すると下記の画面が表示されます。
「閉じる」ボタンを押下してください。




「閉じる」ボタンを押下すると「認証データベース」一覧中に
「LDAP-SERVER」のエントリが追加されている事を確認できます。



次に、ディレクトリサーバと正常に接続ができているか確認する為に、下記の図のように
「アクセス制御」の「ユーザ」タブを選択してください。

「ユーザ」タブを選択すると、下記の画面が表示されます。
この画面ではユーザの参照、追加、削除等の操作ができます。

それでは、実際に「ユーザの検索」を行ってみましょう。
「認証データベースの選択:」で「LDAP-SERVER(ldap)」を選択し、
検索ボタンを押下しましょう。
既存のユーザが存在している場合、検索結果に一覧が表示されます。仮に既存ユーザが
存在しない場合、「新規」ボタンを押下するとディレクトリサーバに新規ユーザを
追加する事もできます。



以上で、Web サーバからディレクトリサーバに対して接続ができる事が確認できました。


手順2:Web サーバのHTTPリスナーの編集

次に、Web サーバの対象のインスタンスにおいて、クライアント認証を受け付ける事が
できるようにHTTPリスナーの設定を変更します。

既にWebサーバでSSLの設定がされている必要があります。
WebサーバのSSLの設定はWebサーバのサーバ証明書設定を参照してください。

「構成」→「対象の構成(sw-120)」→「HTTPリスナー」タブを選択し、
現在有効になっているHTTPリスナー(http-listener-1)のリンクを押下してください。





リンクを押下すると下記の画面が表示されます
「クライアント認証:」の「必要なディスク容量」を選択し
「適用」ボタンを押下してください。

※「必要なディスク容量」と表示されている日本語メッセージは
  日本語翻訳のバグです!!
  英語版では「Required」と表示されているので「必須」と訳されるべきです。

「適用」ボタンを押下した後、「閉じる」ボタンを押下してください。



「閉じる」ボタンを押下すると下記の画面が表示されます。
「配備保留中」リンクを押下してください。



「配備保留中」のリンクを押下すると、下記のウィンドウが表示されます
「配備...」ボタンを押下し配備して下さい。



配備が正常に完了すると下記の画面が表示されます。
「閉じる」ボタンを押下し配備を終了して下さい。



これで、HTTP リスナーの設定が完了しました。
以上の設定でクライアントのWeb ブラウザが443番ポートに
HTTPSで接続した際に、必ずクライアント証明書を要求するようになります。


手順3:Web サーバのアクセスコントロールの設定

HTTPリスナーの設定が完了した後、アクセスコントロール(ACL)の設定を行いましょう。
「構成」→「対象の構成(sw-120)」→「アクセス制御」→「アクセス制御リスト(ACL)」を
選択してください。「アクセス制御リスト(ACL)」を選択すると下記の画面が表示されます。

ここで、アクセス制御リスト中の「リソース欄」に「default」と記載された項目が
表示されますので、このリンクを押下します。



「default」のリソースを選択すると下記の画面が表示されます。
ここで、「認証方法:」をSSLに変更して下さい。
その後で、「アクセス制御エントリ(ACE)」中の「ACE動作」の
「編集」を行います。
「編集」のリンクを押下して下さい。

※ 「default」は全てのアクセスに対する設定になります。特定のURLに対して
  だけアクセス制限をかけたい場合は、「新規」ボタンを押下して別途作成
  してください。



「編集」のリンクを押下すると下記の画面が表示されます。
ここで、「ユーザとグループ」の設定を「認証データベース中
のすべて」に変更して、最後に「了解」ボタンを押下してください。



「了解」ボタンを押下すると下記の画面が表示されます。
再度、「認証方法:」が「SSL」になっている事を確認した後、
「了解」ボタンを押下します。



「了解」ボタンを押下すると下記の画面が表示されます。
「配備保留中」のリンクを押下してください。



「配備保留中」のリンクを押下すると下記の画面が表示されます。
「配備...」ボタンを押下してください。



配備が正常に終了すると下記の画面が表示されます。
「閉じる」ボタンを押下して終了してください。



以上で、アクセスコントロールの設定が完了しました。

上記までの設定を行う事により、Web サーバは接続する全てのクライアントである
Webブラウザに対して、クライアント証明書を要求し、クライアント認証が完了しない
リクエストは全て拒否するようになります。


手順4:Web サーバのcertmap.confの編集

次に、Web サーバのcertmap.confと呼ばれるファイルを編集します。
この設定ファイルはWeb ブラウザから送信されるクライアントの証明書と、
ディレクトリサーバ上に存在するクライアントの証明書を比較する為に必要な
マッピング等の設定を行います。

下記のように設定を変更して下さい。

修正前:
> vi /sun/webserver7/https-sw-120/config/certmap.conf
.....(前略)

certmap default default
#default:DNComps
#default:FilterComps e, uid
#default:verifycert on
#default:CmapLdapAttr certSubjectDN
#default:library <path_to_shared_lib_or_dll>
#default:InitFn <Init function's name>

修正後:
> vi /sun/webserver7/https-sw-120/config/certmap.conf
.....(前略)


certmap default default        //コメントアウト
default:DNComps          //コメントアウト
default:FilterComps e, cn      //コメントアウト
default:verifycert on        //コメントアウト
default:CmapLdapAttr certSubjectDN //コメントアウト


certmap.confの詳細は下記URLを参照してください。
http://docs.sun.com/app/docs/doc/819-2630/6n4thbjc4?l=Ja&a=view#abumq

certmap.conf設定ファイルを手動で変更後、管理画面に戻って「仮想サーバ」タブ、
もしくは他のタブを押下して下さい。
すると下記のように画面右上部に「インスタンス設定が変更されています」というリンクが
表示されます。このリンクを押下して下さい。

※ ここで表示されるリンクは設定ファイルが手動で変更された後に管理画面の操作
  を行った場合に表示されるようになります。(手動設定変更の自動検知)



リンクを押下すると下記の画面が表示されます。
ここで、「構成を取得し配備します」を選択し、「了解」ボタンを押下してください。



「了解」ボタンを押下する前に、「詳細を表示」ボタンを押下すると、
手動で変更されたファイル名を確認する事もできます。

実際に「了解」ボタンを押下すると今回手動で設定変更を行ったのは、
「config/certmap.conf」ファイルであることを確認できます。



「了解」ボタンを押下すると下記の画面が表示されます。
「閉じる」ボタンを押下し、配備を終了してください。



以上でWebサーバ側のクライアント認証を行うための全ての設定は完了です。

手順5:ディレクトリサーバの拡張設定

Webサーバの設定が完了しましたので、次にディレクトリサーバの設定を行いましょう。
今回ディレクトリサーバとして、Sun Java System Directory Server 5.2 Update 6を
使用しています。同様の設定は最新の、Sun Java System Directory Server Enterprise
Editionでも可能ですので、新しいバージョンを使用されている場合も、同様の設定を行ってください。
まず、ディレクトリサーバの管理コンソールにログインしてください。



次に、ディレクトリサーバのインスタンスを選択して「開く」ボタンを押下します。



「開く」ボタンを押下すると下記の画面が表示されます。
「設定」タブを押下し左のメニュー画面より「スキーマ」を選択してください。



「スキーマ」を選択すると下記の画面が表示されます。



右画面より「属性」を選択し「作成」ボタンを押下してください。
すると下記の画面が表示されます。

ここで、「属性名:」に「certSubjectDN」を入力し、「構文:」に「DN」を選択し、
「複数値」のチェックを外して「了解(O)」ボタンを押下してください。

※ ここで追加するLDAPの属性は、Web サーバの「certmap.conf」ファイル中に記載した
  下記の内容に一致します。
  仮に「certmap.conf」の「CmapLdapAttr」で名前を変更している場合、
  同一の名前の属性を作成してください。

certmap.conf
default:CmapLdapAttr certSubjectDN



「了解(O)」ボタンを押下すると下記の画面が表示されます。



次に、「オブジェクトクラス」タブを選択し、新規クラスを作成します。
「オブジェクトクラス」タブを押下し、「作成...」ボタンを押下してください。



「作成...」ボタンを押下すると下記の画面が表示されます。
オブジェクトクラスの「名前」に任意の名前(例:client-cert-person)を
入力し、「必須属性:」に「certsubjectdn」、「許可された属性」に
「usercertificate」を追加し、「了解」ボタンを押下してください。

※ usercertificateを必須属性にしない理由は後ほど説明します。



「了解」ボタンを押下すると下記の画面が表示されます。
作成したオブジェクトクラスが存在しているか確認してください。



以上でディレクトリサーバ上の設定は全て完了です。

手順6:新規ユーザの作成

それでは新規ユーザを登録しましょう。
Web サーバの管理画面より、「構成」→「対象の構成(sw-120)」→
「アクセス制御」→「ユーザ」より「新規...」ボタンを押下して下さい。



「新規」ボタンを押下すると下記の画面が表示されます。
ここで必要事項に入力して「了解」ボタンを押下してください。



ユーザが正常に追加されると下記の画面が表示されます。



また、ディレクトリサーバのコンソールから確認しても
ユーザが追加されている事を確認できます。



手順7:クライアント証明書の作成

新規ユーザを作成したので、このユーザに対する新規クライアント証明書を作成しましょう。

OpenSSLでクライアント証明書の秘密鍵を作成するには下記のコマンドを実行します。
下記では、トリプルDESを使い1024bitの秘密鍵(client-private-key)を生成しています。

> openssl genrsa -des3 -out client-private-key 1024
Generating RSA private key, 1024 bit long modulus
...........++++++
............................++++++
e is 65537 (0x10001)
Enter pass phrase for client-private-key:[******]
Verifying - Enter pass phrase for client-private-key:[******]
> ls
client-private-key

クライアントの秘密鍵を生成しましたので、次に署名要求(CSR)を作成します。
下記のコマンドを実行してください。
するとclientcsr.pemと呼ばれる署名要求(CSR)が生成されます。

> openssl req -new -days 365 -key client-private-key -out clientcsr.pem
Enter pass phrase for client-private-key: [******]
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) [US]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Setagaya
Organization Name (eg, company) [Unconfigured OpenSSL Installation]:Sun Microsystems K.K.
Organizational Unit Name (eg, section) []:Software Practice
Common Name (eg, YOUR name) []:Foo Bar
Email Address []:Foo.Bar@foo.bar.com


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


> ls
client-private-key clientcsr.pem


次に、認証局(CA)で署名を行いますが、その前に
認証局(CA)の設定を一部変更してください。

> cp /etc/sfw/openssl/openssl.cnf /etc/sfw/openssl/openssl-client.cnf
> vi /etc/sfw/openssl/openssl-client.cnf


basicConstraints=CA:FALSE <---FALSEより変更


# For normal client use this is typical
nsCertType = client, email <---- コメントアウト

それでは実際に、認証局(CA)でクライアント証明書の署名を行います。

>openssl ca -config /etc/sfw/openssl/openssl-client.cnf -in
./clientcsr.pem -out clientcert.pem
Using configuration from /etc/sfw/openssl/openssl-client.cnf Enter pass phrase for /etc/sfw/openssl/private/cakey.pem:
[******] DEBUG[load_index]: unique_subject = "yes" Check that the request matches the signature Signature ok Certificate Details: Serial Number: 10 (0xa) Validity Not Before: Mar 18 07:10:14 2008 GMT Not After : Mar 18 07:10:14 2009 GMT Subject: countryName = JP stateOrProvinceName = Tokyo organizationName = Sun Microsystems K.K. organizationalUnitName = Software Practice commonName = Foo Bar emailAddress = Foo.Bar@foo.bar.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Cert Type: SSL Client, S/MIME Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 56:64:98:F2:33:16:62:82:2B:50:91:36:29:87:48:46:74:26:00:44 X509v3 Authority Key Identifier: keyid:06:C7:E8:90:D1:04:7C:36:16:FE:AA:D2:B2:B6:EC:C4:13:84 :36:A1 DirName:/C=JP/ST=Tokyo/L=Setagaya/O=Sun Microsystems K.K./OU= Software Practice/CN=Hanako Yamada/emailAddress=Hanako.Yamada@foo.bar.jp serial:00 Certificate is to be certified until Mar 18 07:10:14 2009 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

上記で署名済みのクライアント証明書(clientcert.pem)が生成されました。

手順8:ブラウザへクライアント証明書のインストール

Web ブラウザへ証明書をインストールする為には、秘密鍵と
クライアント証明書をまとめた、PKCS#12形式のファイルを作成し、
PKCS#12形式のファイルをブラウザへインストールします。


下記のようにクライアント証明書とクライアントの秘密鍵、
認証局の証明書を使用してPKCS#12形式のファイルを作成しましょう。
下記のコマンドを実行するとclientcert.p12と呼ばれる
PKCS#12形式のファイルが生成されます。

> ls
client-private-key clientcert.pem clientcsr.pem
sw-120-web > openssl pkcs12 -export -in clientcert.pem -inkey client-private-key -certfile /etc/sfw/openssl/cacert.pem -out clientcert.p12
Enter pass phrase for client-private-key: [******]
Enter Export Password:[******]
Verifying - Enter Export Password:[******]
> ls
client-private-key clientcert.p12 clientcert.pem clientcsr.pem
>

上記で、PKCS#12形式の「clientcert.p12」ファイルを
生成しましたので、Webブラウザにインストールしましょう。

下記図のようにWebブラウザのメニューより「環境設定」→
「詳細」→「暗号化」タブを選択し、「証明書を表示」ボタンを
押下してください。(ブラウザがFirefoxの場合)



「証明書を表示」ボタンを押下すると下記の画面が表示されます。
ここで「インポート」ボタンを押下してください。



「インポート」ボタンを押下すると下記のファイルダイアログ画面が表示されます。
ここで、事前に作成した、PKCS#12形式のファイル(clientcert.p12)を選択し、
「開く」ボタンを押下します。



「開く」ボタンを押下すると下記の画面が表示されます。
ここで「パスワード」欄にPKCS#12を生成する際に入力した
Exportのパスワードを入力し「OK」ボタンを押下します。



「OK」ボタンを押下すると下記の警告画面が表示されます。
「OK」ボタンを押下し終了してください。


「OK」ボタンを押下しすると「証明書マネージャ」に
インストールされたクライアント証明書が表示されます。



念のためクライアント証明書の内容を確認してみましょう。
インストールしたクライアント証明書を選択し「表示」ボタンを押下してください。
ボタンを押下すると下記の画面が表示されます。 内容を確認すると、「この証明書は以下の用途に使用する証明書であると検証されました」
というメッセージが表示され、一覧の中に「SSLクライアント証明書」が含まれている事を
確認できます。



以上で、クライアントのWeb ブラウザ側の設定は完了です。

手順9:ディレクトリサーバへクライアント証明書のインストール

クライアント証明書より証明書のSubjectのDNを入手

クライアントの証明書の中に含まれるSubjectのDNをディレクトリサーバに格納します。
そしてアクセスして来たクライアントが提示したクライアント証明書よりSubjectのDNを抽出し、
ディレクトリサーバ上のSubjectのDNとクライアント証明書のSubjectのDNを比較します。
内容が異なる場合、アクセスを拒否します。

>openssl x509 -in clientcert.pem -text 
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 10 (0xa)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, L=Setagaya, O=Sun Microsystems K.K., OU=Softwa
re Practice, CN=Hanako Yamada/emailAddress=Hanako.Yamada@foo.bar.jp
        Validity
            Not Before: Mar 18 07:10:14 2008 GMT
            Not After : Mar 18 07:10:14 2009 GMT
        Subject: C=JP, ST=Tokyo, O=Sun Microsystems K.K., OU=Software Practi
ce, CN=Foo Bar/emailAddress=Foo.Bar@foo.bar.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:f6:4c:58:aa:bb:2b:80:71:fb:8f:21:f9:9d:03:
                    07:9e:91:58:b4:3a:6a:a6:fa:74:18:89:e1:99:a9:
                    45:79:70:ae:46:bd:91:22:62:9f:e0:d7:fd:d7:03:
                    c3:9e:10:36:f2:ef:37:52:cc:92:86:fa:c1:a7:3c:
                    08:af:4e:43:55:94:87:a1:22:ad:26:b3:f6:1b:65:
                    19:fe:81:50:92:84:a0:34:7a:b4:c7:2c:3e:45:b3:
                    7e:76:a7:44:87:e3:4b:75:9a:64:ea:81:c9:fa:94:
                    43:ad:b3:7a:75:92:87:89:fe:a5:8e:c6:5b:bb:59:
                    8d:50:e7:8b:75:9c:3a:47:6f
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Client, S/MIME
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                56:64:98:F2:33:16:62:82:2B:50:91:36:29:87:48:46:74:26:00:44
            X509v3 Authority Key Identifier: 
                keyid:06:C7:E8:90:D1:04:7C:36:16:FE:AA:D2:B2:B6:EC:C4:13:84:36:A1
                DirName:/C=JP/ST=Tokyo/L=Setagaya/O=Sun Microsystems K.K./OU=So
ftware Practice/CN=Hanako Yamada/emailAddress=Hanako.Yamada@foo.bar.jp
                serial:00

    Signature Algorithm: md5WithRSAEncryption
        4b:ec:fe:fb:c2:33:50:7c:86:bb:0d:ba:a7:c6:94:49:38:bf:
        49:92:4f:c3:40:71:d7:8c:15:b0:8e:19:38:ba:87:a6:04:6d:
        07:c8:fa:82:1f:11:ae:e4:2b:d8:aa:be:cf:29:e8:bf:ac:e7:
        2d:42:5b:9b:2e:ff:f4:b5:d9:00:e0:4c:92:57:44:93:f5:c6:
        dc:c1:7a:45:f6:20:14:9b:cd:09:e2:5f:e7:31:d7:74:d0:4c:
        22:37:bd:e3:e3:39:b5:be:0e:6a:97:4f:08:8c:89:46:f8:60:
        0a:f2:48:73:b3:36:8a:8d:84:bd:64:0f:d0:6d:91:2d:1b:35:
        08:e5
-----BEGIN CERTIFICATE-----
MIIEAjCCA2ugAwIBAgIBCjANBgkqhkiG9w0BAQQFADCBrTELMAkGA1UEBhMCSlAx
DjAMBgNVBAgTBVRva3lvMREwDwYDVQQHEwhTZXRhZ2F5YTEeMBwGA1UEChMVU3Vu
IE1pY3Jvc3lzdGVtcyBLLksuMRowGAYDVQQLExFTb2Z0d2FyZSBQcmFjdGljZTEW
MBQGA1UEAxMNSGFuYWtvIFlhbWFkYTEnMCUGCSqGSIb3DQEJARYYSGFuYWtvLllh
bWFkYUBmb28uYmFyLmpwMB4XDTA4MDMxODA3MTAxNFoXDTA5MDMxODA3MTAxNFow
gY8xCzAJBgNVBAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzEeMBwGA1UEChMVU3VuIE1p
Y3Jvc3lzdGVtcyBLLksuMRowGAYDVQQLExFTb2Z0d2FyZSBQcmFjdGljZTEQMA4G
A1UEAxMHRm9vIEJhcjEiMCAGCSqGSIb3DQEJARYTRm9vLkJhckBmb28uYmFyLmNv
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA9kxYqrsrgHH7jyH5nQMHnpFY
tDpqpvp0GInhmalFeXCuRr2RImKf4Nf91wPDnhA28u83UsyShvrBpzwIr05DVZSH
oSKtJrP2G2UZ/oFQkoSgNHq0xyw+RbN+dqdEh+NLdZpk6oHJ+pRDrbN6dZKHif6l
jsZbu1mNUOeLdZw6R28CAwEAAaOCAUwwggFIMAkGA1UdEwQCMAAwEQYJYIZIAYb4
QgEBBAQDAgWgMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0
aWZpY2F0ZTAdBgNVHQ4EFgQUVmSY8jMWYoIrUJE2KYdIRnQmAEQwgdoGA1UdIwSB
0jCBz4AUBsfokNEEfDYW/qrSsrbsxBOENqGhgbOkgbAwga0xCzAJBgNVBAYTAkpQ
MQ4wDAYDVQQIEwVUb2t5bzERMA8GA1UEBxMIU2V0YWdheWExHjAcBgNVBAoTFVN1
biBNaWNyb3N5c3RlbXMgSy5LLjEaMBgGA1UECxMRU29mdHdhcmUgUHJhY3RpY2Ux
FjAUBgNVBAMTDUhhbmFrbyBZYW1hZGExJzAlBgkqhkiG9w0BCQEWGEhhbmFrby5Z
YW1hZGFAZm9vLmJhci5qcIIBADANBgkqhkiG9w0BAQQFAAOBgQBL7P77wjNQfIa7
DbqnxpRJOL9Jkk/DQHHXjBWwjhk4uoemBG0HyPqCHxGu5CvYqr7PKei/rOctQlub
Lv/0tdkA4EySV0ST9cbcwXpF9iAUm80J4l/nMdd00EwiN73j4zm1vg5ql08IjIlG
+GAK8khzszaKjYS9ZA/QbZEtGzUI5Q==
-----END CERTIFICATE-----

実際に、ディレクトリサーバに格納するSubjectのDNは上記のSubjectのDNと逆の
下記の文字列を生成します。
上記の強調(ボールド)文字を下記のように変換してください。

E=Foo.Bar@foo.bar.com, CN=Foo Bar, OU=Software Practice, O=Sun Microsystems K.K., ST=Tokyo,C=JP

次に、ディレクトリサーバに保存するクライアント証明書のバイナリを作成します。
下記のコマンドを実行してクライアント証明書のバイナリデータ(DER形式)を作成してください。

> ls
client-private-key clientcert.p12 clientcert.pem clientcsr.pem
> openssl x509 -in clientcert.pem -outform DER -out clientcert.der
> ls
client-private-key clientcert.der clientcert.p12 clientcert.pem clientcsr.pem

ディレクトリサーバの該当のユーザにクライアント証明書と証明書のSubject DNを設定します。
ディレクトリサーバの該当のユーザを選択し、右マウスクリックで「汎用エディタで編集」を
選択してください。



汎用エディタで開くと下記の画面が表示されます。ここで、「オブジェクトクラス」に
マウスカーソルをあてて「値を追加」ボタンを押下して下さい。



「値を追加」ボタンを押下すると下記のウィンドウが表示されます。ここで、先ほど、
ディレクトリサーバに新しく追加したオブジェクトクラス「client-cert-person」を選択し、
「了解」ボタンを押下します。



上記の新規オブジェクトクラスを追加すると、下記の属性が現れます。



ここには、下記のクライアント証明書のSubject DNを入力してください。

E=Foo.Bar@foo.bar.com, CN=Foo Bar, OU=Software Practice, O=Sun Microsystems K.K., ST=Tokyo,C=JP



次にクライアント証明書のバイナリファイルをディレクトリサーバに保存します。
証明書のバイナリファイルを追加するために、「属性の追加」ボタンを押下してください。



「属性の追加」ボタンを押下すると下記の画面が表示されます。ここで、「usercertificate」を
選択して、「サブタイプ」の「バイナリ」を選択して「了解」ボタンを押下してください。



※ 「usercertificate」の属性を「必須属性」ではなく、
  「許可された属性」にしたのは理由があります。
  Web サーバがクライアント証明書のSubjectDNで
  パターンマッチを行った後、取得する属性は、
  「usercertificate」ではなく「usercertificate;binary」です。

  そこで、「許可された属性」で属性を追加する際に
  「サブタイプ」で「バイナリ」を選択しなければ
  なりません。「バイナリ」を選択することで
  「usercertificate;binary」という属性が作成されます。

  仮に必須属性にした場合デフォルトで、「usercetificate」
  になりますので、この属性にクライアント証明書の
  バイナリデータを入力しても「usercertificate;binary」
  の属性は空ですので、証明書比較に失敗し、
  全てのアクセスは拒否されてしまいます。
  属性は、「usercertificate」ではなく
  「usercertificate;binary」になっている事を
  確認して下さい。



ディレクトリサーバのアクセスログより、実行された検索フィルタの確認
[18/Mar/2008:18:46:17 +0900] conn=252 op=1 msgId=2 - SRCH base="dc=japan, dc=sun,dc=com" scope=2 filter="(certSubjectDN=E=Foo.Bar@foo.bar.com,CN=Foo Bar,OU=Software Practice,O=Sun Microsystems K.K.,ST=Tokyo,C=JP)" attrs="uid userCertificate;binary"


「了解」ボタンを押下すると、下記の属性が追加されます。



上記は、ラジオボタンの「属性の名前を表示」を選択すると表示されます。



次に「値の設定」のボタンを押下してください。ボタンを押下すると下記の画面が表示されます。
ここで、事前に入手したクライアント証明書のバイナリ(DER)を指定して「了解」ボタンを押下します。

> ls
client-private-key clientcert.der clientcert.p12 clientcert.pem clientcsr.pem



「了解」ボタンを押下すると下記の画面に戻りますので、「了解」ボタンを押下して終了してください。



以上で、クライアント認証に必要な全てのデータの登録は完了です。
実際にユーザの情報が正常に登録されているかldapsearchコマンドを使用し確認してみましょう。

>ldapsearch -h localhost -p 389 -b "dc=japan,dc=sun,dc=com" -D "cn=Directory Manager" -w adminadmin "(uid=foobar)"
version: 1
dn: uid=foobar,ou=People,dc=japan,dc=sun,dc=com
telephoneNumber: +81-3-1234-5678
sn: Bar
title: Solution Architect
givenName: Foo
uid: foobar
mail: Foo.Bar@foo.bar.com
cn: Foo Bar
userPassword: {SSHA}wWRFRscPqeZgMiKlih1VcRem5G1dQFBxqWLRfw==
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: client-cert-persion
certSubjectDN: E=Foo.Bar@foo.bar.com, CN=Foo Bar, OU=Software Practice, O=Sun 
 Microsystems K.K., ST=Tokyo,C=JP
userCertificate;binary:: MIIEAjCCA2ugAwIBAgIBCjANBgkqhkiG9w0BAQQFADCBrTELMAkG
 A1UEBhMCSlAxDjAMBgNVBAgTBVRva3lvMREwDwYDVQQHEwhTZXRhZ2F5YTEeMBwGA1UEChMVU3Vu
 IE1pY3Jvc3lzdGVtcyBLLksuMRowGAYDVQQLExFTb2Z0d2FyZSBQcmFjdGljZTEWMBQGA1UEAxMN
 SGFuYWtvIFlhbWFkYTEnMCUGCSqGSIb3DQEJARYYSGFuYWtvLllhbWFkYUBmb28uYmFyLmpwMB4X
 DTA4MDMxODA3MTAxNFoXDTA5MDMxODA3MTAxNFowgY8xCzAJBgNVBAYTAkpQMQ4wDAYDVQQIEwVU
 b2t5bzEeMBwGA1UEChMVU3VuIE1pY3Jvc3lzdGVtcyBLLksuMRowGAYDVQQLExFTb2Z0d2FyZSBQ
 cmFjdGljZTEQMA4GA1UEAxMHRm9vIEJhcjEiMCAGCSqGSIb3DQEJARYTRm9vLkJhckBmb28uYmFy
 LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA9kxYqrsrgHH7jyH5nQMHnpFYtDpqpvp0
 GInhmalFeXCuRr2RImKf4Nf91wPDnhA28u83UsyShvrBpzwIr05DVZSHoSKtJrP2G2UZ/oFQkoSg
 NHq0xyw+RbN+dqdEh+NLdZpk6oHJ+pRDrbN6dZKHif6ljsZbu1mNUOeLdZw6R28CAwEAAaOCAUww
 ggFIMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgWgMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NM
 IEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUVmSY8jMWYoIrUJE2KYdIRnQmAEQwgdoG
 A1UdIwSB0jCBz4AUBsfokNEEfDYW/qrSsrbsxBOENqGhgbOkgbAwga0xCzAJBgNVBAYTAkpQMQ4w
 DAYDVQQIEwVUb2t5bzERMA8GA1UEBxMIU2V0YWdheWExHjAcBgNVBAoTFVN1biBNaWNyb3N5c3Rl
 bXMgSy5LLjEaMBgGA1UECxMRU29mdHdhcmUgUHJhY3RpY2UxFjAUBgNVBAMTDUhhbmFrbyBZYW1h
 ZGExJzAlBgkqhkiG9w0BCQEWGEhhbmFrby5ZYW1hZGFAZm9vLmJhci5qcIIBADANBgkqhkiG9w0B
 AQQFAAOBgQBL7P77wjNQfIa7DbqnxpRJOL9Jkk/DQHHXjBWwjhk4uoemBG0HyPqCHxGu5CvYqr7P
 Kei/rOctQlubLv/0tdkA4EySV0ST9cbcwXpF9iAUm80J4l/nMdd00EwiN73j4zm1vg5ql08IjIlG
 +GAK8khzszaKjYS9ZA/QbZEtGzUI5Q==

最後に、ブラウザからWeb サーバに対して接続が可能か確認してみましょう。
作成したクライアント証明書を指定して「OK」ボタンを押下してください。



下記のように表示されれば正常にクライアント認証後にアクセスができています。



以上で、クライアント認証を行うために必要な設定はすべて完了です。
Webサーバ、もしくはProxyサーバをDMZに配置して、クライアント認証を
完了したユーザだけ、後段のアプリケーションサーバが提供するサービスを
うける為には、上記のような設定を行い実現できます。
リバース機能を設定する場合は、上記の設定を行った後で設定を行ってください。

ちなみに上記の設定は、他にSun Java System Proxy Server4.0.xでも同じような手順で設定を行います。
Web サーバ、Proxyサーバでクライアント認証を実現したい方は是非、本エントリを
是非参考にして頂ければと思います。

Permalink     No Comments
Track Back :




Post a Comment:
Comments are closed for this entry.