Spec-Zone .ru
спецификации, руководства, описания, API

21.3.5.5. Соединение Надежно Используя SSL

SSL в MySQL, Connector/J, шифрует все данные (кроме начального квитирования) между драйвером JDBC и сервером. Потеря производительности для того, чтобы включить SSL является увеличением во время обработки запроса между 35 % и 50 %, в зависимости от размера запроса, и объемом данных, который это возвращает.

Поскольку SSL поддерживает к работе, у Вас должно быть следующее:

Системные работы через два файла базы доверенных сертификатов Java, один файл содержит информацию о сертификате для сервера (truststore в примерах ниже). Другой файл содержит сертификат для клиента (keystore в примерах ниже). Все файлы базы доверенных сертификатов Java являются защищёнными паролем, предоставляя подходящий пароль к keytool, когда Вы создаете файлы. Вы нуждаетесь в именах файлов и связанных паролях, чтобы создать соединение SSL.

Вы должны будете сначала импортировать Сертификат CA сервера MySQL в базу доверенных сертификатов Java. Демонстрационный Сертификат CA сервера MySQL располагается в SSL подкаталог исходного распределения MySQL. Это - то, что SSL будет использовать, чтобы определить, связываетесь ли Вы с безопасным сервером MySQL. Альтернативно, используйте Сертификат CA, который Вы генерировали или были предоставлены Вашим провайдером SSL.

Использовать keytool Java, чтобы создать базу доверенных сертификатов в текущем каталоге, и импортировать сертификат CA сервера (cacert.pem), можно сделать следующий (предполагающий, что keytool находится в Вашем пути. keytool обычно располагается в bin подкаталог Вашего JDK или JRE):

shell> keytool -import -alias mysqlServerCACert \						-file cacert.pem -keystore truststore

Введите пароль когда запрошено keystore файл. Взаимодействие с keytool похоже на это:

Enter keystore password:  *********Owner: EMAILADDRESS=walrus@example.com, CN=Walrus,       O=MySQL AB, L=Orenburg, ST=Some-State, C=RUIssuer: EMAILADDRESS=walrus@example.com, CN=Walrus,       O=MySQL AB, L=Orenburg, ST=Some-State, C=RUSerial number: 0Valid from:   Fri Aug 02 16:55:53 CDT 2002 until: Sat Aug 02 16:55:53 CDT 2003Certificate 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:6CTrust this certificate? [no]:  yesCertificate was added to keystore

У Вас тогда есть две опции: или импортируйте клиентский сертификат, который соответствует, CA сертифицировали Вас только импортированный, или создают новый клиентский сертификат.

Импорт существующего сертификата требует, чтобы сертификат был в формате DER. Можно использовать openssl, чтобы преобразовать существующий сертификат в новый формат. Например:

shell> openssl x509 -outform DER -in client-cert.pem -out client.cert

Теперь импортируйте преобразованный сертификат в свой keystore, использующий keytool:

shell> keytool -import -file client.cert -keystore keystore -alias mysqlClientCertificate

Чтобы генерировать Ваш собственный клиентский сертификат, используйте keytool, чтобы создать подходящий сертификат и добавить это к keystore файл:

shell> keytool -genkey -keyalg rsa \     -alias mysqlClientCertificate -keystore keystore 

Keytool запросит Вас следующую информацию, и создаст названный keystore keystore в текущем каталоге.

Ответьте информацией, которая является подходящей для Вашей ситуации:

Enter keystore password:  *********What is your first and last name?  [Unknown]:  MatthewsWhat is the name of your organizational unit?  [Unknown]:  Software DevelopmentWhat is the name of your organization?  [Unknown]:  MySQL ABWhat is the name of your City or Locality?  [Unknown]:  FlossmoorWhat is the name of your State or Province?  [Unknown]:  ILWhat is the two-letter country code for this unit?  [Unknown]:  USIs <CN=Matthews, OU=Software Development, O=MySQL AB, L=Flossmoor, ST=IL, C=US> correct?  [no]:  yEnter key password for <mysqlClientCertificate>        (RETURN if same as keystore password):

Наконец, чтобы заставить JSSE использовать keystore и базу доверенных сертификатов, которую Вы генерировали, Вы должны установить следующие системные свойства, когда Вы запускаете свою JVM, заменяя path_to_keystore_file с полным путем к keystore файлу Вы создали, path_to_truststore_file с путем к файлу базы доверенных сертификатов Вы создали, и использование соответствующих значений пароля для каждого свойства. Можно сделать это любой на командной строке:

-Djavax.net.ssl.keyStore=path_to_keystore_file-Djavax.net.ssl.keyStorePassword=password-Djavax.net.ssl.trustStore=path_to_truststore_file-Djavax.net.ssl.trustStorePassword=password

Или можно установить значения непосредственно в пределах приложения:

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");System.setProperty("javax.net.ssl.keyStorePassword","password");System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");System.setProperty("javax.net.ssl.trustStorePassword","password");

Вы должны будете также установить useSSL к true в Ваших параметрах соединения для MySQL, Connector/J, любой, добавляя useSSL=true к Вашему URL, или устанавливая свойство useSSL к true в java.util.Properties экземпляр Вы передаете к DriverManager.getConnection().

Можно протестировать тот SSL, работает, включая JSSE, отлаживающий (как детализировано ниже), и ищите следующие ключевые события:

...*** ClientHello, v3.1RandomCookie:  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 = 590000: 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 = 59main, READ:  SSL v3.1 Handshake, length = 74*** ServerHello, v3.1RandomCookie:  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 = 740000: 02 00 00 46 03 01 3D B6 43 98 74 32 04 67 19 64  ...F..=.C.t2.g.d0010: 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 Это скажет Вам, какой keystores и базы доверенных сертификатов используются, так же как что продолжается во время квитирования SSL и обмена сертификата. Это будет полезно, пытаясь определить то, что не работает, пытаясь заставить соединение SSL происходить.