我想创建一个将我的应用程序(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
,并用InputStream
和OutputStream
读写服务器,但是我不知道如何使用它们来发送查询和读取信息。 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发送吗?