MySQL Connector/J の SSL は、JDBC ドライバとサーバ間のすべてのデータ ( 最初のハンドシェイク以外 ) を暗号化します。SSL を有効にした場合の性能上の影響として、クエリの処理時間が、クエリのサイズと戻すデータの量によって、35% から 50% 長くなります。
SSL Support の作動には、以下が必要になります :
JDK-1.4.1 以降などの、JSSE ( Java Secure Sockets Extension ) を高める JDK 。SSL は現在、次のバグにより、JDK-1.2.x または JDK-1.3.x などの JESSE を追加できる JDK とは作動しません : http://developer.java.sun.com/developer/bugParade/bugs/4273544.html
SSL をサポートし、そのためにコンパイルおよび構成された、MySQL-4.0.4 以降の MySQL サーバ。詳細は 項4.8.7. 「接続安全」 をご覧ください。
クライアント証明書 ( このセクション内であとに説明 ) 。
まず最初に、MySQL サーバ CA Certificate を Java
truststore にインポートしてください。CA Certificate
のサンプルは、MySQL ソース配布物の
SSL
サブディレクトリにあります。SSL
はこれを使用して、安全な MySQL
サーバと交信しているかを判断します。
Java の keytool を使って truststore
を現行のディレクトリに作成し、サーバの CA
証明書 (cacert.pem
)
をインポートするには、次の手順で行うことができます
( keytool
がパスにあることを前提としています。keytool
は JDK または JRE の bin
サブディレクトリにあります ) :
shell> keytool -import -alias mysqlServerCACert \ -file cacert.pem -keystore truststore
Keytool は次の情報で応答します :
Enter keystore password: ********* Owner: EMAILADDRESS=walrus@example.com, CN=Walrus, O=MySQL AB, L=Orenburg, ST=Some-State, C=RU Issuer: EMAILADDRESS=walrus@example.com, CN=Walrus, O=MySQL AB, L=Orenburg, ST=Some-State, C=RU Serial number: 0 Valid from: Fri Aug 02 16:55:53 CDT 2002 until: Sat Aug 02 16:55:53 CDT 2003 Certificate fingerprints: MD5: 61:91:A0:F2:03:07:61:7A:81:38:66:DA:19:C4:8D:AB SHA1: 25:77:41:05:D5:AD:99:8C:14:8C:CA:68:9C:2F:B8:89:C3:34:4D:6C Trust this certificate? [no]: yes Certificate was added to keystore
その後、クライアント証明書を生成し、安全なクライアントと交信していることをMySQL サーバに知らせます :
shell> keytool -genkey -keyalg rsa \ -alias mysqlClientCertificate -keystore keystore
Keytool
は次の情報のプロンプトを出し、keystore
と名付けられた keystore
を現行のディレクトリに作成します。
その状況に適した情報で応答してください :
Enter keystore password: ********* What is your first and last name? [Unknown]: Matthews What is the name of your organizational unit? [Unknown]: Software Development What is the name of your organization? [Unknown]: MySQL AB What is the name of your City or Locality? [Unknown]: Flossmoor What is the name of your State or Province? [Unknown]: IL What is the two-letter country code for this unit? [Unknown]: US Is <CN=Matthews, OU=Software Development, O=MySQL AB, L=Flossmoor, ST=IL, C=US> correct? [no]: y Enter key password for <mysqlClientCertificate> (RETURN if same as keystore password):
最後に、生成した keystore と truststore を JSSE に使わせるには、JVM を起動する時に次のシステム プロパティを設定し、path_to_keystore_file を作成した鍵ストアへの完全パスに、path_to_truststore_file を作成した truststore に置き換え、各プロパティに適したパスワード値を使用する必要があります。
-Djavax.net.ssl.keyStore=path_to_keystore_file -Djavax.net.ssl.keyStorePassword=********* -Djavax.net.ssl.trustStore=path_to_truststore_file -Djavax.net.ssl.trustStorePassword=*********
また、useSSL=true
を URL
に加えるか、DriverManager.getConnection()
に渡す java.util.Properties
インスタンスでプロパティ useSSL
を true
に設定して、MySQL Connector/J
の接続パラメータで useSSL を
true
に設定する必要があります。
JESSE デバッグ ( 下記参照 ) を有効にし、次のキー イベントを探すことで、SSL が作動しているかテストすることができます :
... *** ClientHello, v3.1 RandomCookie: GMT: 1018531834 bytes = { 199, 148, 180, 215, 74, 12, » 54, 244, 0, 168, 55, 103, 215, 64, 16, 138, 225, 190, 132, 153, 2, » 217, 219, 239, 202, 19, 121, 78 } Session ID: {} Cipher Suites: { 0, 5, 0, 4, 0, 9, 0, 10, 0, 18, 0, 19, 0, 3, 0, 17 } Compression Methods: { 0 } *** [write] MD5 and SHA1 hashes: len = 59 0000: 01 00 00 37 03 01 3D B6 90 FA C7 94 B4 D7 4A 0C ...7..=.......J. 0010: 36 F4 00 A8 37 67 D7 40 10 8A E1 BE 84 99 02 D9 6...7g.@........ 0020: DB EF CA 13 79 4E 00 00 10 00 05 00 04 00 09 00 ....yN.......... 0030: 0A 00 12 00 13 00 03 00 11 01 00 ........... main, WRITE: SSL v3.1 Handshake, length = 59 main, READ: SSL v3.1 Handshake, length = 74 *** ServerHello, v3.1 RandomCookie: GMT: 1018577560 bytes = { 116, 50, 4, 103, 25, 100, 58, » 202, 79, 185, 178, 100, 215, 66, 254, 21, 83, 187, 190, 42, 170, 3, » 132, 110, 82, 148, 160, 92 } Session ID: {163, 227, 84, 53, 81, 127, 252, 254, 178, 179, 68, 63, » 182, 158, 30, 11, 150, 79, 170, 76, 255, 92, 15, 226, 24, 17, 177, » 219, 158, 177, 187, 143} Cipher Suite: { 0, 5 } Compression Method: 0 *** %% Created: [Session-1, SSL_RSA_WITH_RC4_128_SHA] ** SSL_RSA_WITH_RC4_128_SHA [read] MD5 and SHA1 hashes: len = 74 0000: 02 00 00 46 03 01 3D B6 43 98 74 32 04 67 19 64 ...F..=.C.t2.g.d 0010: 3A CA 4F B9 B2 64 D7 42 FE 15 53 BB BE 2A AA 03 :.O..d.B..S..*.. 0020: 84 6E 52 94 A0 5C 20 A3 E3 54 35 51 7F FC FE B2 .nR..\ ..T5Q.... 0030: B3 44 3F B6 9E 1E 0B 96 4F AA 4C FF 5C 0F E2 18 .D?.....O.L.\... 0040: 11 B1 DB 9E B1 BB 8F 00 05 00 .......... main, READ: SSL v3.1 Handshake, length = 1712 ...
次のシステム プロパティを設定する時、JSSE は
( STDOUT に ) デバッグを提供します :
-Djavax.net.debug=all
これは、どの鍵ストアおよび truststore
を使用しているか、SSL
ハンドシェイクと証明書交換の間に何が起きているかを報告します。SSL
接続を開きたい時に、何が作動していないか判断するのに便利です。