Create: 2014/10/14
LastUpdate: 2014/10/15
≪ メニューに戻る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 が表示されたら証明書認証の成功です。