Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / SSL connection to mysql / 21 сообщений из 21, страница 1 из 1
17.05.2014, 10:47
    #38644087
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
У меня есть 3 файла: SSL CA File, SSL CERT File, SSL Key File.
Нужно подключиться к mysql серверу по ssl, как это делается в MySQL workbench, указывая эти файлы.

Т.е. надо как-то методу DriverManager.getConnection() передать эти файлы.

Отмечу, что коннектов может быть много к разным серверам, и у каждого будут свои сертификаты, поэтому установка глобальных свойств

Код: java
1.
System.setProperty("javax.net.ssl.keyStore","/CERTIFICATES/mysql4/cacert.pem");  



свойств не подходит.
...
Рейтинг: 0 / 0
17.05.2014, 18:47
    #38644232
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
keyStore свойство оно для Java Key Store - хранилище ключей - там может быть много разных ключей
pem файл это просто ключ сохраненный в виде файла в определенном формате

У вас даже не работает ваш вариант. Именно поэтому он не подходит, а не потому что у вас много соединений.
...
Рейтинг: 0 / 0
19.05.2014, 13:06
    #38645063
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Тогда я, наверно, не туда копаю, может есть пример у кого?
...
Рейтинг: 0 / 0
19.05.2014, 13:19
    #38645081
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
В RTFM подробно расписано
http://dev.mysql.com/doc/connector-j/en/connector-j-reference-using-ssl.html
Гугл даёт массу примеров
https://www.google.com/search?q=MySQL JDBC SSL

Чего именно не хватает?
...
Рейтинг: 0 / 0
19.05.2014, 21:20
    #38645729
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Here's my article for SSL TomCat connection

http://vyatkins.wordpress.com/2013/11/19/java-base-ssl-connection-to-tomcat-with-server-and-client-certifications/

Please do not hesitate to ask if any questions.
...
Рейтинг: 0 / 0
20.05.2014, 11:53
    #38646131
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
SergunkaPlease do not hesitate to ask if any questions.
I got one: "Why would you give irrelevant links in this thread?"
...
Рейтинг: 0 / 0
20.05.2014, 13:47
    #38646369
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Попробовал сделать как описано в
http://dev.mysql.com/doc/connector-j/en/connector-j-reference-using-ssl.html

Падает ошибка
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

Затем сделал по шагам, которые указаны в комментариях ниже, эти шаги больше похоже на правду и задействуются все 3 описанных файла:

a- add Certificate Authority to a new TrustStore
keytool -import -alias mysqlCACert -file ca-cert.pem -keystore truststore -storepass pass_word -deststoretype JKS

b- Converting openssl created client certificate to accepted java keystore PKCS12
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile client-cert.pem -name "Name" -out client.p12

a- Add new PKCS12 certificate to key store JKS type
keytool -importkeystore -srckeystore client.p12 -srcstoretype pkcs12 -destkeystore keystore -storepass pass_word -deststoretype JKS


После выполнения этих команд в java home создались два файла keystore, truststore.

Затем пытаемся подключиться к нужному серверу mysql.

Код: java
1.
2.
3.
4.
5.
6.
7.
System.setProperty("javax.net.ssl.keyStore", "c:\\Program Files\\Java\\jdk1.7.0_51\\bin\\keystore");
System.setProperty("javax.net.ssl.keyStorePassword","pass_word );
System.setProperty("javax.net.ssl.trustStore", "c:\\Program Files\\Java\\jdk1.7.0_51\\bin\\truststore");
System.setProperty("javax.net.ssl.trustStorePassword","pass_word");

...
Driver.getConnection(<url>)



=>javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server
...
Рейтинг: 0 / 0
20.05.2014, 13:50
    #38646379
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
xProПадает ошибка
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception :

Ну, написано, же падает из-за другого исключения.

xPro=>javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server
Это находится в cause первого исключения?
...
Рейтинг: 0 / 0
20.05.2014, 13:52
    #38646384
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
BlazkowiczНу, написано, же падает из-за другого исключения.


Сори, исходная ошибка была
MESSAGE: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)

BlazkowiczЭто находится в cause первого исключения?


Да, это текст исходной ошибки.
...
Рейтинг: 0 / 0
20.05.2014, 13:58
    #38646402
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
авторjavax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server
Вот это немного не понятно, потому что ругается на "server". Это значит что клиентский сертификат был ошибочно использован на сервере. А сервер тут MySQL. Если была аналогичная ошибка с "SSL client" в конце, было бы понятнее.

авторMESSAGE: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)

Перестаньте вырезать куски, которые, как вам кажется, самые важные. Вываливаете сюда исключения целиком, включая stacktrace и вложеные исключения.
...
Рейтинг: 0 / 0
20.05.2014, 14:07
    #38646423
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Blazkowicz,

ok, вот полный стек последней ошибки (SSLHandshakeException)

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

javax.net.ssl.SSLHandshakeException
MESSAGE: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server

STACKTRACE:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:72)
at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:3982)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1293)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:187)
at capsidea.Schema.getUserDataConnection(Schema.java:310)
at capsidea.SourceService.createSchema(SourceService.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at capsidea.WebService.processRequest(WebService.java:155)
at capsidea.WebService.doPost(WebService.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server
at sun.security.validator.EndEntityChecker.checkTLSServer(EndEntityChecker.java:297)
at sun.security.validator.EndEntityChecker.check(EndEntityChecker.java:141)
at sun.security.validator.Validator.validate(Validator.java:264)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
... 44 more


** END NESTED EXCEPTION **



Last packet sent to the server was 239 ms ago.

STACKTRACE:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

javax.net.ssl.SSLHandshakeException
MESSAGE: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server

STACKTRACE:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:72)
at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:3982)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1293)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:187)
at capsidea.Schema.getUserDataConnection(Schema.java:310)
at capsidea.SourceService.createSchema(SourceService.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at capsidea.WebService.processRequest(WebService.java:155)
at capsidea.WebService.doPost(WebService.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server
at sun.security.validator.EndEntityChecker.checkTLSServer(EndEntityChecker.java:297)
at sun.security.validator.EndEntityChecker.check(EndEntityChecker.java:141)
at sun.security.validator.Validator.validate(Validator.java:264)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
... 44 more


** END NESTED EXCEPTION **



Last packet sent to the server was 239 ms ago.
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:87)
at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:3982)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1293)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:187)
at capsidea.Schema.getUserDataConnection(Schema.java:310)
at capsidea.SourceService.createSchema(SourceService.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at capsidea.WebService.processRequest(WebService.java:155)
at capsidea.WebService.doPost(WebService.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)


** END NESTED EXCEPTION **



Last packet sent to the server was 239 ms ago.
...
Рейтинг: 0 / 0
20.05.2014, 14:13
    #38646435
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Больше интересует "NoSuchAlgorithmException", в котором окажется что вашему процессу нельзя читать из Program Files.
...
Рейтинг: 0 / 0
20.05.2014, 14:28
    #38646469
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
А вы пробовли подсоединиться к mysql через SSL не из Java? Возможно вы в MySQL не тот сертификат установили?
...
Рейтинг: 0 / 0
20.05.2014, 14:35
    #38646482
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Blazkowicz,

Да, через MySQL Workbench с указанием указанных файлов всё ok.
...
Рейтинг: 0 / 0
20.05.2014, 19:06
    #38646906
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
xProBlazkowicz,

Да, через MySQL Workbench с указанием указанных файлов всё ok.

Попробуйте еще добавить дебаг для SSL

Код: java
1.
System.setProperty("javax.net.debug", "ssl,handshake");



Там дается подробный лог всех задействованных сертификатов я этот момент подробно разжевываю в статье.

типо так будет

Example log
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
keyStore is : src/main/resources/local/localhost_client.p12
keyStore type is : PKCS12
keyStore provider is : 
init keystore
init keymanager of type SunX509
***
found key for : localhost_client
chain [0] = [
[
  Version: V3
  Subject: CN=localhost_client, OU=Unit, O=Organization, L=City, ST=State, C=US
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
 
  Key:  Sun RSA public key, 1024 bits
  modulus: 140194258804626507561849035834394797195591361321452252320716681921944324863474390231976638686061895510815124754173859058430280836341502425688116998441920651250132599467068392390284759888097731074155553868818816634643761691919001306346353465937316948852687407668424277201495832822886494315261776807551621850359
  public exponent: 65537
  Validity: [From: Fri Nov 15 09:27:27 PST 2013,
               To: Thu Feb 13 09:27:27 PST 2014]
  Issuer: CN=localhost_client, OU=Unit, O=Organization, L=City, ST=State, C=US
  SerialNumber: [    5286597f]
 
]
  Algorithm: [SHA1withRSA]
  Signature:
0000: C1 94 B2 3B 30 65 B7 98   4B 1C 33 29 A3 78 AB E9  ...;0e..K.3).x..
0010: ED FF 99 35 32 F3 18 5D   57 B5 53 1D 16 29 07 08  ...52..]W.S..)..
0020: 00 55 5B B4 A1 9C 55 5A   B2 95 78 02 33 70 61 C3  .U[...UZ..x.3pa.
0030: 06 2E E0 FC 2D D9 5E 2B   D8 70 93 2C B5 A1 DE 8D  ....-.^+.p.,....
0040: D4 AB 6F 50 01 24 A4 C2   AC FD 28 10 3B B3 E9 B5  ..oP.$....(.;...
0050: AC FF 8D 28 36 17 52 CD   70 79 44 9B 8A DB EA 42  ...(6.R.pyD....B
0060: 96 05 46 03 71 78 95 DF   26 B0 74 CE 51 3D BA 12  ..F.qx..&.t.Q=..
0070: 31 27 06 74 CE D2 15 C6   E8 F9 E3 F7 C2 E7 4A 54  1'.t..........JT
 
]
***
trustStore is: src/main/resources/local/localhost_client_trust_store.jks
trustStore type is : jks
trustStore provider is : 
init truststore
adding as trusted cert:
  Subject: CN=localhost, OU=Unit, O=Organization, L=City, ST=State, C=US
  Issuer:  CN=localhost, OU=Unit, O=Organization, L=City, ST=State, C=US
  Algorithm: RSA; Serial number: 0x5286597f
  Valid from Fri Nov 15 09:27:27 PST 2013 until Thu Feb 13 09:27:
...
Рейтинг: 0 / 0
21.05.2014, 05:31
    #38647136
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Нашёл ещё что нужно включить тип store
System.setProperty("javax.net.ssl.keyStoreType","pkcs12");
System.setProperty("javax.net.ssl.trustStoreType","pkcs12");

Теперь выдаётся другая ошибка:


com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)

STACKTRACE:

java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:198)
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:218)
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:65)
at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:3982)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1293)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:187)
at Schema.getUserDataConnection(Schema.java:307)
at SourceService.createSchema(SourceService.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at capsidea.WebService.processRequest(WebService.java:155)
at capsidea.WebService.doPost(WebService.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
at java.security.Provider$Service.newInstance(Provider.java:1262)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)
at javax.net.ssl.SSLContext.getDefault(SSLContext.java:97)
at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:121)
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:61)
... 36 more
Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
at sun.security.util.DerInputStream.getLength(DerInputStream.java:561)
at sun.security.util.DerValue.init(DerValue.java:365)
at sun.security.util.DerValue.<init>(DerValue.java:320)
at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1220)
at java.security.KeyStore.load(KeyStore.java:1214)
at sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultKeyManager(SSLContextImpl.java:610)
at sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:495)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at java.security.Provider$Service.newInstance(Provider.java:1238)
... 42 more


** END NESTED EXCEPTION **



Лог:

trustStore is: c:\Work\truststore
trustStore type is : pkcs12
trustStore provider is :
init truststore
SunX509: skip default keystore: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
trigger seeding of SecureRandom
done seeding SecureRandom

keyStore is : c:\Work\keystore
keyStore type is : pkcs12
keyStore provider is :
init keystore
default context init failed: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
...
Рейтинг: 0 / 0
21.05.2014, 06:27
    #38647145
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
xProНашёл ещё что нужно включить тип store
System.setProperty("javax.net.ssl.keyStoreType","pkcs12");
System.setProperty("javax.net.ssl.trustStoreType","pkcs12");

Совсем не то. У вас JKS, а вы его пытаетесь прочитать как pkcs12.
В предыдущей версии сертификаты нормально загружались и JKS, а ошибка была в самих сертификатах.
...
Рейтинг: 0 / 0
21.05.2014, 07:29
    #38647161
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
Blazkowicz,

Да, сконвертировал сертификаты из p12 в jks и заимпортировал в keystore
Стала снова падать ошибка: sun.security.validator.ValidatorException: Netscape cert type does not permit use for SSL server, иногда ещё вылезала "javax.net.ssl.SSLException: Unsupported record version Unknown-0.0" и наткнулся на http://bugs.mysql.com/bug.php?id=66173

После этого я обновил MySQL driver с 5.0.8 на 5.1.30 и оно наконец-то заработало!

Резюмируя, делать надо примерно так (поправьте если что):
Имеем 3 файла SSL CA File, SSL CERT File, SSL Key File:

1.Добавляем публичный CA файл в trustStore
keytool -import -alias mysqlCACert -file ca-cert.pem -keystore truststore -storepass pass_word -deststoretype JKS

2. Через openssl создаём p12 контейнер из клиентского ключа и сертификата CERT FILE
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "Name" -out client.p12

3. Конвертируем p12 в jsk
keytool -importkeystore -destkeystore client.jks -srckeystore client.p12 -srcstoretype pkcs12

4. Импортируем полученный jsk в keystore
keytool -importkeystore -srckeystore client.jsk -srcstoretype jks -destkeystore keystore -storepass pass_word -deststoretype JKS


java code

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
//тут нужны права на папку процессу tomcat.
System.setProperty("javax.net.ssl.keyStore", "c:\\Program Files\\Java\\jdk1.7.0_51\\bin\\keystore");
System.setProperty("javax.net.ssl.keyStorePassword","pass_word");
System.setProperty("javax.net.ssl.trustStore", "c:\\Program Files\\Java\\jdk1.7.0_51\\bin\\truststore");
System.setProperty("javax.net.ssl.trustStorePassword","pass_word");

Properties info = new Properties();
info.setProperty("user", User);
info.setProperty("password", Password);
info.setProperty("useSSL", "true");
info.setProperty("requireSSL", "true");
info.setProperty("verifyServerCertificate", "false");

DriverManager.getConnection("url", info.getProperies());



Если число шагов можно уменьшить подскажите плз.
Теперь буду избавляться от необходимости использовать System.setProperty, и как-то указывать keyStore в url подключения к бд.
...
Рейтинг: 0 / 0
21.05.2014, 09:13
    #38647200
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
xProТеперь буду избавляться от необходимости использовать System.setProperty, и как-то указывать keyStore в url подключения к бд.
Вы снова путаете. Вам не нужно указывать keystore для каждого соединения. Вам нужно в один keystore заимпортировать ключи для всех ваших соединений. А SSL уже сам разберется какой сертификат при каком соединении ему использовтаь.
...
Рейтинг: 0 / 0
21.05.2014, 09:18
    #38647204
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
xPro
Если число шагов можно уменьшить подскажите плз.

Точного рецепта не дам, но, возможно, если взять KeyTool IUI
https://code.google.com/p/keytool-iui/
то можно будет проще импортировать ключи и сертификаты не конвертируя их в разные форматы.
...
Рейтинг: 0 / 0
23.05.2014, 05:22
    #38649718
xPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSL connection to mysql
BlazkowiczВы снова путаете. Вам не нужно указывать keystore для каждого соединения. Вам нужно в один keystore заимпортировать ключи для всех ваших соединений. А SSL уже сам разберется какой сертификат при каком соединении ему использовтаь.

У меня будет много разных серверов MySQL, postgresql, у каждого будут свои сертификаты. Пользователь создаёт через ui подключение к своей базе и серверу. И для каждого такого сервера я буду создавать отдельный jks файл, а для каждого соединения для этого сервера его переиспользовать. Так явно удобнее (для меня уж точно) управлять всеми метаданными подключений.


Вот более простой вариант через keytool

1. Через openssl создаём p12 контейнер из клиентского ключа и сертификата CERT FILE
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "Name" -out client.p12


2. Импортируем полученный p12 фйал в виде jsk файла в keystore
keytool -importkeystore -destkeystore c:/Work/client.jks -deststoretype jks -srckeystore client.p12 -srcstoretype pkcs12


А вот собственно окончательный вариант создания java key store (jsk) из Java.
(Используется http://www.bouncycastle.org/latest_releases.html, нужны bcprov-jdk15on-150.jar и bcpkix-jdk15on-150.jar)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
public class SSLHelper
{

	public static void createJSK(String certStr, String keyStr, String destFullFileName, String keypass) throws Exception
	{
		//1. создаём key store в виде .jks файла
		KeyStore keystore = KeyStore.getInstance("JKS", "SUN");
		keystore.load(null, null);

		CertificateFactory cf = CertificateFactory.getInstance("X.509");

		
		String tempFile = destFullFileName.replace(".jks", ".pem");

		try
		{
                        //2. импортируем клиентский сертификат
			FileOutputStream certTemp = new FileOutputStream(tempFile);
			certTemp.write(certStr.getBytes());
			certTemp.flush();
			certTemp.close();

			FileInputStream fis = new FileInputStream(tempFile);

			BufferedInputStream bis = new BufferedInputStream(fis);

			Certificate cert = cf.generateCertificate(bis);
			keystore.setCertificateEntry("client_cert", cert);
			java.security.cert.Certificate[] chain = {cert};

			//3. импортируем клиентский ключ
			Security.addProvider(new BouncyCastleProvider());
			PemObject pem = new PEMParser(new StringReader(keyStr)).readPemObject();


			PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(pem.getContent());
			KeyFactory rSAKeyFactory = KeyFactory.getInstance("RSA");
			PrivateKey privateKey = rSAKeyFactory.generatePrivate(spec);

			keystore.setEntry("client_key", new KeyStore.PrivateKeyEntry(privateKey, chain), new KeyStore.PasswordProtection(keypass.toCharArray()));

			//4. сохраняем на диск
			FileOutputStream keyStoreOutputStream = new FileOutputStream(destFullFileName);
			keystore.store(keyStoreOutputStream, keypass.toCharArray());
			keyStoreOutputStream.close();

			fis.close();

		}
		finally
		{
			(new File(tempFile)).delete();
		}
	}
}



Само подключение:



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
String filejks = "c:/Work/client.jks";
SSLHelper.createJSK(<строка клиентского сертификата>, <строка клиентского ключа>, filejks , "bla");

Properties info = new Properties();
info.setProperty("useSSL", "true");
info.setProperty("requireSSL", "true");
info.setProperty("verifyServerCertificate", "false");
info.setProperty("clientCertificateKeyStoreUrl", "file:///" + filejks);
info.setProperty("clientCertificateKeyStorePassword", "bla");
DriverManager.getConnection("url", info.getProperies());



Всем спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / SSL connection to mysql / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]