2017-11-26 23 views
0

SSL을 사용하여 응용 프로그램에서 MySQL 연결을 보호하려고 시도하고 있습니다. 지금 현재로 가지고있는 관련 코드 :BasicDataSource를 사용하여 SSL을 사용하여 mysql에 보안 연결

BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setUsername(connectorConfig.getUser()); 
    dataSource.setPassword(connectorConfig.getPassword()); 
    String uri = connectorConfig.getConnectURI(); 
    dataSource.setUrl(uri); 
    dataSource.setValidationQuery(getValidationQuery()); 
    dataSource.setTestOnBorrow(true); 
    datasource.setDriverClassLoader(getClass().getClassLoader()); 
    datasource.setDriverClassName("com.mysql.jdbc.Driver"); 

    System.setProperty("javax.net.ssl.keyStore", "/Users/xx/xx/client.jks"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "xx"); 
    System.setProperty("javax.net.ssl.trustStore", "/Users/xx/xx/server.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "xx"); 

    final DBI dbi = new DBI(datasource); 

내가 데이터 소스 관리를위한 DBCP2 BasicDataSourceJDBI 쿼리를 실행하기 위해 사용하고 있습니다. 나는에서 MySQL 서버에 SSL 컨텍스트 매개 변수를 제공하는 가야합니까 방법에 대한

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

어떤 생각 : 나는 다음과 같은 오류로 MySQL 서버에 연결을 설정하는 동안 그러나, 위의 코드가 작동하지 않습니다 이 경우?

추신 : 저는 명령 줄에서 클라이언트 키 저장소를 사용하여 MySQL 서버에 연결할 수 있었기 때문에 SSL 설정이 정확하다고 생각합니다.

답변

0

truststore에 서버의 인증서를 추가 할 수 있지만 먼저 keytool 명령을 사용하여 서버의 인증서를 확인하십시오. 여전히 작동하지 않는 경우 debug 속성 (-Djavax.net.debug = all)을 사용하면 실제 사용중인 truststore와 교환되는 인증서를 출력에서 ​​확인할 것입니다.

+0

server.jks에 이미 서버 인증서가 있습니다. 디버그 모드를 사용하면 코드에 지정된 트러스트 스토어를 무시하고 대신이 경로를 찾습니다. /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security/cacerts – seriousgeek

0

System.setProperty이 내 유스 케이스의 매개 변수를 제공하는 올바른 방법이 아니라는 것을 알았습니다. 및 setTrustCertificateXX() 메서드를 사용하여 키 저장소 매개 변수를 지정하는 방법을 제공하는 BasicDataSourceMysqlDataSource으로 변경하면 현재 작동하고있는 것 같습니다.