2011年11月23日水曜日

Tomcat 6(Windows X64版) MySQLとのSSL通信

TomcatのJDBC認証において、MySQLへの接続をSSL通信にします。
実際には、MySQL Connector/JとMySQL間の通信がSSL通信になります。MySQL Connector/Jの仕様では、サーバ証明書に加えて、クライアント証明書が必要となります(SSL通信では、クライアント認証とサーバ認証が実行されます)。
なお、MySQLのSSL通信(サーバ認証)の設定に関しては、「http://memoyasu.blogspot.com/2011/11/mysql55-ssl.html」を参照してください。


手順の流れは以下になります。
①クライアント証明書と鍵ペアを発行する。
②MySQLの設定ファイル(my.ini)を修正する(クライアント証明書と鍵のパスを指定)。
③MySQLを再起動する。
④Tomcatの設定ファイル(server.xml)を修正する。
⑤Tomcatの起動時のJavaオプションを追加する。
⑥Tomcatを再起動する。


(1)OpenSSLを使用し、MySQL Connector/Jに対する鍵ペアと証明書を発行します。
c:\tomcat>c:\OpenSSL-Win64\bin\openssl.exe req -new -keyout "client-key.pem" -ou
t "client-req.pem" -days 3600
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
..........++++++
.................++++++
writing new private key to 'client-key.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]:.
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:client.yasuyasu.com
Email Address []:


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


c:\tomcat>c:\OpenSSL-Win64\bin\openssl.exe x509 -req -days 3600 -CA "ca-cert.pem
"  -CAkey "ca-key.pem" -CAserial "serial.conf" -in "client-req.pem" -out "client
-cert.pem"
Loading 'screen' into random state - done
Signature ok
subject=/C=JP/CN=client.yasuyasu.com
Getting CA Private Key
Enter pass phrase for ca-key.pem:
unable to write 'random state'


(2)MySQLの設定ファイル(my.ini)を修正します。太字箇所を追加します。
★パスの区切りは、"\"ではなく、"/"であることに注意!
[client]
ssl-ca=C:/tomcat/ca-cert.pem 
ssl-cert=C:/tomcat/client-cert.pem
ssl-key=C:/tomcat/client-key.pem


(3)MySQLを再起動します。


(4)server.xml(C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf配下)を編集します。connectURL属性に、太字箇所を追加します。


      <Realm className="com.yosiyosi.realm.CustomJDBCRealm"
             driverName="org.gjt.mm.mysql.Driver"
             connectionURL="jdbc:mysql://localhost:3306/bushido?useSSL=true"
             userTable="auth_users" userNameCol="user_name" userCredCol="user_password"
             userRoleTable="auth_roles" roleNameCol="role_name"
             connectionName="root" connectionPassword="password"/>


(5)keytoolコマンドを使用し、CA証明書をPEM形式からDER形式に変換します。
c:\tomcat>c:\OpenSSL-Win64\bin\openssl.exe x509 -outform DER -in ca-cert.pem -out ca.cert

c:\tomcat>keytool -import -file ca.cert -keystore server.jks -alias ca
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
所有者: CN=ca.yasuyasu.com, C=JP
発行者: CN=ca.yasuyasu.com, C=JP
シリアル番号: f0fc15b1f79fb38b
有効期間の開始日: Tue Nov 22 22:29:35 JST 2011 終了日: Thu Dec 22 22:29:35 JST 2
011
証明書のフィンガープリント:
         MD5:  3E:E5:C6:97:57:AB:44:2C:1C:67:04:39:3C:5C:F0:C6
         SHA1: 66:A8:7E:03:B2:33:5D:4F:80:2A:BA:56:E2:BC:2A:E2:49:02:6C:71
         署名アルゴリズム名: SHA1withRSA
         バージョン: 3


拡張:


#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 01 6D FE 40 0F CD 30 16   0B B1 E3 69 7E 1B D1 2A  .m.@..0....i...*
0010: 7D 38 CC 22                                        .8."
]
]


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


#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 01 6D FE 40 0F CD 30 16   0B B1 E3 69 7E 1B D1 2A  .m.@..0....i...*
0010: 7D 38 CC 22                                        .8."
]


]


この証明書を信頼しますか? [no]:  yes
証明書がキーストアに追加されました。



(6)keytoolコマンドを使用し、クライアント証明書をPEM形式からDER形式に変換します。


c:\tomcat>c:\OpenSSL-Win64\bin\openssl.exe x509 -outform DER -in client-cert.pem
 -out client.cert
c:\tomcat>keytool -import -file client.cert -keystore client.jks -alias client
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
所有者: CN=client.yasuyasu.com, C=JP
発行者: CN=ca.yasuyasu.com, C=JP
シリアル番号: 5
有効期間の開始日: Wed Nov 23 00:22:25 JST 2011 終了日: Fri Oct 01 00:22:25 JST 2
021
証明書のフィンガープリント:
         MD5:  15:78:E2:00:B1:A0:BF:03:AB:47:1B:CF:91:B0:E6:99
         SHA1: 10:0C:11:64:CE:A2:41:FB:35:1D:13:16:29:E8:CB:EA:C6:14:12:C5
         署名アルゴリズム名: SHA1withRSA
         バージョン: 1
この証明書を信頼しますか? [no]:  yes
証明書がキーストアに追加されました。




(7)Tomcatの起動時に、Javaのオプションとして以下を追加します。


-Djavax.net.ssl.keyStore=c:\tomcat\client.jks
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=c:\tomcat\server.jks
-Djavax.net.ssl.trustStorePassword=password

(8)Tomcatを再起動します。
「http://127.0.0.1:8080/sampleapp/sample.html」にアクセスし、FORM認証が成功することを確認します。




■補足■
SSL通信でエラーが発生した場合には、Javaオプションに以下を設定してTomcatを起動します。SSL通信する際の詳細なログが標準出力に出力されて便利です。


-Djavax.net.debug=all


<出力例>

2011-11-23 01:42:15 Commons Daemon procrun stdout initialized
trustStore is: c:\tomcat\server.jks
trustStore type is : jks
trustStore provider is : 
init truststore
adding as trusted cert:
  Subject: CN=ca.yasuyasu.com, C=JP
  Issuer:  CN=ca.yasuyasu.com, C=JP
  Algorithm: RSA; Serial number: 0xf0fc15b1f79fb38b
  Valid from Tue Nov 22 22:29:35 JST 2011 until Thu Dec 22 22:29:35 JST 2011


trigger seeding of SecureRandom
done seeding SecureRandom
***
found key for : server
chain [0] = [
[
  Version: V3
  Subject: CN=yasu.hoge.com, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=jp
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5


  Key:  Sun RSA public key, 1024 bits
  modulus: 122242012982209662923393081262187509019889149396697912939693246792421045784628744532131386668778037133171905458919922944159056873911220455399771810893972594625969976059362725970167560234465556141102327452863823309180840502041205195494958180017978965410060359966763326464061148776167266441521233069679259172879
  public exponent: 65537
  Validity: [From: Mon Oct 17 21:34:43 JST 2011,
               To: Sat Apr 14 21:34:43 JST 2012]
  Issuer: CN=yasu.hoge.com, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=jp
  SerialNumber: [    4e9c20e3]


]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 60 CA 23 E8 32 1B A8 73   51 6F A8 AE A2 BE E3 92  `.#.2..sQo......
0010: 0F BD 05 FF AB B0 C3 EE   17 62 53 49 AF 1E F1 EF  .........bSI....
0020: 36 FC F5 79 75 FF A3 44   AA 8D 4A C4 91 47 1A A5  6..yu..D..J..G..
0030: 05 60 8F 2A E0 FE 07 52   13 1C BD 09 11 10 92 74  .`.*...R.......t
(省略)



0 件のコメント: