[CentOS6][OpenAM10] クライアント証明書で認証する


Create: 2014/10/14
LastUpdate: 2014/10/15
≪ メニューに戻る

OpenAMのシングル構成で、クライアント証明書を利用した 証明書認証 を試してみます。
検証環境(XenServer6.2+CentOS6.5)で使用するドメインは、"blue21.local" とします。
OpenAMをインストールしたサーバのFQDN は "exam01.blue21.local" とします。
OpenAMのインストールについては、「 [CentOS6][OpenAM10] OpenAMを試す - OpenAMのシングルサインオン(SSO)を試す(1/4)」を参照してください。
また、今回は、自分で発行する「オレオレ証明書」を使用します。
OpenAMをインストールしたサーバには、証明書発行に必要な OpenSSLなどのパッケージもインストールされるので、証明書発行の作業は、OpenAMサーバで行うことにします。

1.プライベートCA(認証局)の作成


クライアント証明書の署名に必要なCA(認証局)を作成します。
openssl を使用するので実行できるように準備します。
[root@exam01 ~]# touch /etc/pki/CA/index.txt
[root@exam01 ~]# echo "01" > /etc/pki/CA/serial
プライベートCAのキーペアを作成し、パスワードとして <パスワード01> を設定します。
[root@exam01 ~]# mkdir ca
[root@exam01 ~]# openssl req -keyout ./ca/cakey.pem -out ./ca/cacert.pem -new -x509
Generating a 2048 bit RSA private key
.............+++
..............................................+++
writing new private key to 'ca/cakey.pem'
Enter PEM pass phrase: <パスワード01>
Verifying - Enter PEM pass phrase: <パスワード01>
-----
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Tokyo
Organization Name (eg, company) [Default Company Ltd]:blue21
Organizational Unit Name (eg, section) []:<ENTER>
Common Name (eg, your name or your server's hostname) []:demo
Email Address []:<ENTER>
ca ディレクトリに cakey.pem と cacert.pem が作成されたらOKです。
プライベートCAの内容を参照してみます。
[root@exam01 ~]# openssl x509 -text -in  ca/cacert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            e1:97:50:53:e8:e3:49:42
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, L=Tokyo, O=blue21, CN=demo
        Validity
            Not Before: Oct 14 01:31:13 2014 GMT
            Not After : Nov 13 01:31:13 2014 GMT
        Subject: C=JP, ST=Tokyo, L=Tokyo, O=blue21, CN=demo
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:bf:82:9d:7b:8a:8c:a0:b7:b1:4a:1a:6b:e5:a2:
                    0d:d0:cf:0d:2c:bc:71:31:a5:02:10:bb:c5:3a:74:
                    f1:5d:08:85:46:d6:08:52:80:ad:91:8a:90:c5:b0:
                    96:39:df:2e:a5:1a:54:2c:0a:5b:27:6e:56:86:b6:
                    2e:de:bf:ef:b4:e0:d1:ad:d0:85:39:df:92:1e:9f:
                    62:3a:54:2b:69:89:79:c5:38:1a:e8:ad:d3:d6:83:
                    ff:02:de:9b:72:14:f2:2d:7a:aa:ef:fe:f2:7a:60:
                    66:c0:91:99:05:68:ec:4e:d0:ba:0c:67:f3:3a:e1:
                    5a:03:92:3b:cc:0b:ee:a3:77:e1:6c:d8:86:78:7b:
                    a3:d6:37:6b:cb:15:c4:b6:17:a1:a0:8c:74:ad:89:
                    17:8a:2a:0f:6f:08:80:81:85:c0:69:16:1b:26:b7:
                    c0:12:68:a3:c9:20:e7:ec:8e:2c:e6:06:a2:e0:a2:
                    16:cf:a3:2c:d8:05:00:77:96:8f:bf:d2:0f:fe:9d:
                    81:5c:0e:ab:e4:47:88:a7:2f:27:f8:22:38:6c:24:
                    c3:cf:4e:e2:f8:a1:24:d6:e6:7a:4c:04:27:b7:9e:
                    ef:f9:92:e0:a2:f0:21:ac:34:ff:6a:c9:ab:75:8a:
                    a7:dd:b4:03:86:4a:20:2c:6f:71:0d:56:87:61:09:
                    0e:41
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                95:C7:3C:03:CB:8B:4B:83:07:21:8D:0C:E5:AB:6B:3E:BE:64:92:C9
            X509v3 Authority Key Identifier:
                keyid:95:C7:3C:03:CB:8B:4B:83:07:21:8D:0C:E5:AB:6B:3E:BE:64:92:C9

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
         98:dd:47:e2:20:94:41:18:e5:62:10:3e:b8:ee:b5:6d:de:6c:
         3e:b1:d5:08:fe:69:1b:5e:54:88:8a:c4:1f:f8:1a:4b:8d:d8:
         17:a7:cc:73:f5:21:ba:ec:67:19:89:11:1d:41:9c:7c:a3:d2:
         90:56:97:ec:d9:e9:5b:ae:0c:6a:45:3f:3c:ea:b2:f0:0b:86:
         3e:18:fb:62:52:9d:b0:33:e9:6a:12:e1:22:27:7e:e6:22:0a:
         e5:e7:bc:7e:3a:70:07:e6:f2:bc:e1:f8:85:28:63:3c:86:e2:
         ec:bd:7c:3b:fc:46:85:5f:a3:db:b4:3b:da:c5:7e:3d:60:83:
         a3:5c:c5:1b:80:37:67:d2:a8:51:4b:8b:7d:f7:80:d5:c9:7e:
         46:8f:52:c1:77:1b:82:8d:4c:45:ee:d5:81:43:0f:e5:6a:6f:
         37:f8:22:f2:c4:ce:d9:9c:4a:b6:92:26:8c:7d:59:ad:22:d6:
         31:f3:ea:88:52:75:ef:56:bf:47:7f:e1:6e:78:aa:48:4c:d8:
         45:ec:87:c7:65:0a:0f:53:c4:8a:89:c2:69:c5:e0:03:d6:fa:
         ad:94:01:a3:3b:db:f1:13:13:90:7a:83:3c:4d:e6:2f:9d:70:
         0f:1d:04:5a:67:17:73:83:29:17:e9:5d:0a:7e:83:1f:51:0d:
         d5:a4:02:85
-----BEGIN CERTIFICATE-----
MIIDbTCCAlWgAwIBAgIJAOGXUFPo40lCMA0GCSqGSIb3DQEBBQUAME0xCzAJBgNV
BAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEOMAwGA1UEBwwFVG9reW8xDzANBgNVBAoM
BmJsdWUyMTENMAsGA1UEAwwEZGVtbzAeFw0xNDEwMTQwMTMxMTNaFw0xNDExMTMw
MTMxMTNaME0xCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEOMAwGA1UEBwwF
VG9reW8xDzANBgNVBAoMBmJsdWUyMTENMAsGA1UEAwwEZGVtbzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAL+CnXuKjKC3sUoaa+WiDdDPDSy8cTGlAhC7
xTp08V0IhUbWCFKArZGKkMWwljnfLqUaVCwKWyduVoa2Lt6/77Tg0a3QhTnfkh6f
YjpUK2mJecU4Guit09aD/wLem3IU8i16qu/+8npgZsCRmQVo7E7Qugxn8zrhWgOS
O8wL7qN34WzYhnh7o9Y3a8sVxLYXoaCMdK2JF4oqD28IgIGFwGkWGya3wBJoo8kg
5+yOLOYGouCiFs+jLNgFAHeWj7/SD/6dgVwOq+RHiKcvJ/giOGwkw89O4vihJNbm
ekwEJ7ee7/mS4KLwIaw0/2rJq3WKp920A4ZKICxvcQ1Wh2EJDkECAwEAAaNQME4w
HQYDVR0OBBYEFJXHPAPLi0uDByGNDOWraz6+ZJLJMB8GA1UdIwQYMBaAFJXHPAPL
i0uDByGNDOWraz6+ZJLJMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
AJjdR+IglEEY5WIQPrjutW3ebD6x1Qj+aRteVIiKxB/4GkuN2BenzHP1IbrsZxmJ
ER1BnHyj0pBWl+zZ6VuuDGpFPzzqsvALhj4Y+2JSnbAz6WoS4SInfuYiCuXnvH46
cAfm8rzh+IUoYzyG4uy9fDv8RoVfo9u0O9rFfj1gg6NcxRuAN2fSqFFLi333gNXJ
fkaPUsF3G4KNTEXu1YFDD+Vqbzf4IvLEztmcSraSJox9Wa0i1jHz6ohSde9Wv0d/
4W54qkhM2EXsh8dlCg9TxIqJwmnF4APW+q2UAaM72/ETE5B6gzxN5i+dcA8dBFpn
F3ODKRfpXQp+gx9RDdWkAoU=
-----END CERTIFICATE-----

2.プライベートCAのトラストストアへのインポート


OpenAMには、LDAPサーバにクライアント証明書を登録して、認証時に照合する機能などがありますが、それらの機能を使用する場合は、JAVA のトラストストア(ex. /usr/java/jdk1.6.0_45/jre/lib/security/cacerts)にプライベートCAをインポートする必要があります。
今回は、証明書の照合などは使用しないので、Tomcat用にトラストストア(keystore.jks.ORE)を作成してプライベートCAをインポートします。
トラストストアにはパスワードとして <パスワード02> を設定します。
[root@exam01 ~]# /usr/java/default/bin/keytool -import -alias my_ca -keystore /usr/share/tomcat6/keystore.jks.ORE -file ./ca/cacert.pem -storepass <パスワード02> -keypass <パスワード02>
所有者: CN=demo, O=blue21, L=Tokyo, ST=Tokyo, C=JP
発行者: CN=demo, O=blue21, L=Tokyo, ST=Tokyo, C=JP
シリアル番号: e1975053e8e34942
有効期間の開始日: Tue Oct 14 10:31:13 JST 2014 終了日: Thu Nov 13 10:31:13 JST 2014
証明書のフィンガープリント:
         MD5:  49:97:FF:04:71:90:F8:C0:19:4A:0E:4D:69:47:07:63
         SHA1: 55:58:BD:EA:D7:32:24:26:71:61:6B:0A:35:0F:B9:F9:5F:7C:28:0E
         署名アルゴリズム名: SHA1withRSA
         バージョン: 3

拡張:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 95 C7 3C 03 CB 8B 4B 83   07 21 8D 0C E5 AB 6B 3E  ..<...K..!....k>
0010: BE 64 92 C9                                        .d..
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 95 C7 3C 03 CB 8B 4B 83   07 21 8D 0C E5 AB 6B 3E  ..<...K..!....k>
0010: BE 64 92 C9                                        .d..
]

]

この証明書を信頼しますか? [no]:  yes
証明書がキーストアに追加されました。
トラストストアは Tomcat が使用するので、Tomcatの実行ユーザである tomcatユーザが参照できる場所に配置します。

3.Tomcat の設定変更


Tomcat がクライアント証明書を要求するように SSL の設定を追加します。
Tomcat の設定ファイル(/usr/share/tomcat6/conf/server.xml)に下記を追加します。
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"
               truststoreFile="/usr/share/tomcat6/keystore.jks.ORE"
               truststorePass="<パスワード02>"
               keystoreFile="/usr/share/tomcat6/openam/openam/keystore.jks"
               keystorePass="changeit" />
truststoreFile は上記2で作成したファイルです。traststorePass は、上記2で設定した <パスワード02> です。
keystoreFile は、OpenAM付属のファイルです。初期状態では テスト用の "test" 証明書が入ってます。
keystoreFile は、OpenAM付属keystoreの初期パスワードです。
一応、truststoreFile と keystoreFile に登録されている証明書を見てみます。
[root@exam01 ~]# /usr/java/default/bin/keytool -list -keystore /usr/share/tomcat6/keystore.jks.ORE
キーストアのパスワードを入力してください:<パスワード02>

キーストアのタイプ: JKS
キーストアのプロバイダ: SUN

キーストアには 1 エントリが含まれます。

my_ca, 2014/10/14, trustedCertEntry,
証明書のフィンガープリント (MD5): 88:2A:4D:4D:8A:61:FB:5B:30:D6:7A:DB:15:88:53:84
[root@exam01 ~]#
[root@exam01 ~]# /usr/java/default/bin/keytool -list -keystore /usr/share/tomcat6/openam/openam/keystore.jks
キーストアのパスワードを入力してください:<changeit>

キーストアのタイプ: JKS
キーストアのプロバイダ: SUN

キーストアには 1 エントリが含まれます。

test, 2008/07/17, PrivateKeyEntry,
証明書のフィンガープリント (MD5): 8D:89:26:BA:5C:04:D8:CC:D0:1B:85:50:2E:38:14:EF
設定ファイルを修正したら、Tomcat を再起動します。
[root@exam01 ~]# service tomcat6 restart

4.OpenAM の設定


下記URLにアクセスしてOpenAM管理画面に管理者ユーザ(amadmin)でログインします。
  • http://exam01.blue21.local:8080/openam
今回は、新規レルムを作成して、そこで証明書認証の設定を行います。
[アクセス制御] タブで、[新規]ボタンをクリックして、新しいレルムの "test01" を作成します。
下図のように新規レルムが表示されたら "test01" をクリックします。



[認証]タブをクリックします。



画面を下へスクロールし、[モジュールインスタンス]の[新規]ボタンをクリックします。



[名前]に "x509" を入力し、[タイプ]に "証明書" を選択して、[了解]ボタンをクリックします。



下図のように作成した証明書認証のモジュールインスタンスが表示されたら、"x509" をクリックします。



今回テストで使用する demo ユーザの情報は、OpenAMのデータストア(OpenDJ)に登録されています。
SSOに成功するには、クライアント証明書のCN(CommonName) と同じユーザが、 OpenDJ(LDAP) に登録されている必要があります。
下図の画面は、初期値がOpenDJにアクセスできるように設定されていますが、パスワードだけは未設定になっているので、赤枠の項目を入力します。
OpenDJのパスワードの初期値は、amadmin と同じです。



画面を上へスクロールして、[保存]ボタンをクリックしてから、[認証へ戻る]ボタンをクリックします。



画面を下にスクロールして、[認証連鎖]の[新規]ボタンをクリックします。



[名前]に"x509" を入力して、[了解]ボタンをクリックします。



[追加]ボタンをクリックします。



[インスタンス]は、"x509" を選択し、[条件]は "必須" を選択します。
[保存]ボタンをクリックしてから、[認証へ戻る]ボタンをクリックします。



[組織認証設定] で "x509" を選択し、[保存]ボタンをクリックします。



5.クライアント証明書の作成


今回、SSOに使用するユーザは、OpenAMに初期登録されている demo です。
この demo ユーザ用にクライアント証明書を作成します。
demo ユーザのキーペアを作成し、CN(Common Name) には、demo ユーザの[フルネーム]を設定します。



キーペアの作成は、以下のようにコマンドを実行し、パスワードとして <パスワード03> を設定します。
[root@exam01 ~]# openssl req -new -keyout demo-key.pem -out demo-req.pem -days 3600
Generating a 2048 bit RSA private key
................................+++
.......+++
writing new private key to 'demo-key.pem'
Enter PEM pass phrase: <パスワード03>
Verifying - Enter PEM pass phrase: <パスワード03>
-----
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Tokyo
Organization Name (eg, company) [Default Company Ltd]:blue21
Organizational Unit Name (eg, section) []:<ENTER>
Common Name (eg, your name or your server's hostname) []:demo
Email Address []:<ENTER>

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<ENTER>
An optional company name []:<ENTER>
プライベートCAで署名します。上記1で設定した<パスワード01>を入力します。
[root@exam01 ~]# openssl x509 -req -days 3600 -CA ca/cacert.pem -CAkey ca/cakey.pem -CAserial /etc/pki/CA/serial -in demo-req.pem -out demo-cert.pem
Signature ok
subject=/C=JP/ST=Tokyo/L=Tokyo/O=blue21/CN=demo
Getting CA Private Key
Enter pass phrase for ca/cakey.pem:<パスワード01>
証明書をPEM形式 → x509形式 → PKCS#12形式に変換します。
demo.p12 には、パスワードとして、<パスワード04> を設定します。
[root@exam01 ~]# openssl x509 -in demo-cert.pem -out demo.x509.pem
[root@exam01 ~]# openssl pkcs12 -export -inkey demo-key.pem -in demo.x509.pem -out demo.p12
Enter pass phrase for demo-key.pem:<パスワード03>
Enter Export Password:<パスワード04>
Verifying - Enter Export Password:<パスワード04>

6.クライアント証明書のブラウザへのインポート


今回は、Windows8 の IE10 でSSOを行うので、IE10 が  demo ユーザのクライアント証明書を使用できるようにします。
上記5で作成した demo.p12 ファイルをWindows8にダウンロードしてダブルクリックします。



[次へ]ボタンをクリックします。



[次へ]ボタンをクリックします。



 [パスワード]に上記5で設定した<パスワード04>を入力し、[次へ]ボタンをクリックします。



[次へ]ボタンをクリックします。



 [完了]ボタンをクリックします。



下図のメッセージが表示されたら成功です。



一応、登録したクライアント証明書を見てみます。
IEの[メニュー] > [インターネットオプション] > [コンテンツ] > [証明書] ボタンをクリックします。



下図のように demoユーザの クライアント証明書が見れたらOKです。



7.動作確認


クライアント証明書でSSOできるか確認します。
ブラウザで下記URLにアクセスして、レルム(test01)にログインし、証明書認証を行います。
  • https://exam01.blue21.local:8443/openam/UI/Login?realm=test01
下図のようにクライアント証明書を確認するメッセージが表示されます。
demo ユーザの証明書なので、[OK]ボタンをクリックします。



プライベートCAで署名しているので、下図の画面が表示されます。
赤枠をクリックして続行します。



再度、クライアント証明書を確認されます。
demo ユーザなので [OK]ボタンをクリックします。



OpenAMのログイン画面が表示されずに、下図の demo ユーザの idm が表示されたら証明書認証の成功です。