如何创建通过带TLS的IBM Secure Gateway通过本地MySQL连接的数据源

时间:2019-07-31 17:40:39

标签: java datasource sslsocketfactory

我想创建一个将我的应用程序(SpringBoot应用程序)连接到本地MySQL数据库的数据源,这些数据库是通过具有TLS认证的IBM Secure Gateway访问的。

Secure Gateway提供了云主机和端口以与配置的目标连接,例如,为MySQL in 10.0.0.1:3306创建云url cap-sg-prd-1.integration.ibmcloud.com:12345和我的URL像jdbc:mysql://cap-sg-prd-1.integration.ibmcloud.com:12345/database而不是jdbc:mysql://10.0.0.1:3306/database

在网关中启用TLS并拒绝连接时,就会出现问题。对于TLS,我用SSLSocket创建了SSLSockeSocketFactory,并用InputStreamOutputStream读写服务器,但是我不知道如何使用它们来发送查询和读取信息。 Datasource的搜索结果。

我尝试将Datasource的URL配置为SSLSoccket的本地地址和端口,并得到连接被拒绝的错误。

SSLSocket create() {
    def factory = null
    def host = "cap-sg-prd-1.integration.ibmcloud.com:12345"
    def port = 12345

    try {
                SSLContext ctx
                KeyManagerFactory kmf
                KeyStore ks
                char[] passphrase = "password".toCharArray()

                ctx = SSLContext.getInstance("TLS")
                kmf = KeyManagerFactory.getInstance("SunX509")
                ks = KeyStore.getInstance("JKS")

                ks.load(new FileInputStream("mysqlKeystore.ks"), passphrase)

                kmf.init(ks, passphrase)
                ctx.init(kmf.getKeyManagers(), null, null)

                factory = ctx.getSocketFactory()
            } catch (Exception e) {
                throw new IOException(e.getMessage())
            }

            SSLSocket socket = (SSLSocket)factory.createSocket(host, port);


            socket.startHandshake()

            socket
}

写入套接字并从中读取成功

        SSLSocket socket = create()
        def output = new PrintWriter(socket.getOutputStream(), true)
        def input = new BufferedReader(new InputStreamReader(socket.getInputStream()))

        output.println("mysql")
        input.readLine() //returns MySQL version, etc...

然后我尝试了此操作,但连接被拒绝

def socket = create()
def url = "jdbc:mysql://$socket.localSocketAddress.hostName:$socket.localSocketAddress.port/database"
DriverManagerDataSource dataSource = new DriverManagerDataSource()
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver")
        dataSource.setUrl(url)
        dataSource.setUsername(mysqlUsername)
        dataSource.setPassword(mysqlPassword)
Caused by: java.net.ConnectException: Conexión rehusada (Connection refused)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
    ... 13 more

我想用SSLSocket创建一个数据源,如果不可能的话,我想编写查询并使用mysql -u user -p ...之类的套接字OutputStream发送吗?

0 个答案:

没有答案