我已经用SSL证书设置了Google Cloud SQL(MySQL 5.7)。
现在,当我尝试连接HeidiSQL时,它可以使用以下设置:
- 客户端证书
- 服务器证书
- 客户端密钥
- Url:localhost
- 端口:23306
- 用户
- 密码
- 数据库
我在23306端口上从生产服务器到本地机器的端口。(数据库访问仅限于生产服务器的IP)
现在我试着用相同的设置运行我的spring-boot应用程序。但我总是收到这样的错误:
java.sql.sql异常:用户'mysqluser'@'x.x.x.x'的访问被拒绝(使用密码:YES)
我创建了一个密钥库和信任库,并将JVM配置为使用以下参数:
-Djavax.net.ssl.keyStore=files/keystore-dev
-Djavax.net.ssl.keyStorePassword=test
-Djavax.net.ssl.trustStore=files/truststore-dev
-Djavax.net.ssl.trustStorePassword=test
我认为这是可行的,因为否则我会在获得AccessDeniedException之前获得和SSL Exception。
我在Spring Boot应用程序的应用程序.properties中使用了以下设置:
spring.datasource.url=jdbc:mysql://localhost:23306/test_db?autoReconnect=true&useSSL=true&requireSSL=true
spring.datasource.username=mysqluser
spring.datasource.password=test
spring.datasource.driverClassName=com.mysql.jdbc.Driver
我把这些设置复制到HeidiSQL,它在那里工作。。。我不知道该怎么解决这个问题。有什么想法吗?
谢谢。
编辑1:
否,我打开了SSL调试,可以看到以下警告:
警告:找不到合适的证书-在没有客户端的情况下继续身份验证
我似乎恢复到了非ssl连接,并且我禁用了与mysql服务器的非ssl连接。
但你知道为什么这不起作用吗?
我使用以下描述从证书和谷歌云sql中的密钥生成密钥库和信任库:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-using-ssl.html
Edit2以下是SSL调试的一些输出。可能是在密钥库中找不到密钥吗?
keyStore is : files/keystore
keyStore type is : jks
keyStore provider is :
init keystore
init keymanager of type SunX509
trustStore is: filestruststore
trustStore type is : jks
trustStore provider is :
init truststore
adding as trusted cert:
Subject: C=US, O="Google, Inc", CN=Google Cloud SQL Server CA
Issuer: C=US, O="Google, Inc", CN=Google Cloud SQL Server CA
Algorithm: RSA; Serial number: 0x0
Valid from Mon Jan 16 22:54:25 CET 2017 until Wed Jan 16 22:55:25 CET 2019
trigger seeding of SecureRandom
done seeding SecureRandom
问题是生成的密钥库不正确。
正确的方式:首先,我把谷歌云SQL证书和我的本地cacerts文件放在一个文件夹中。
然后,我使用以下脚本生成信任和密钥库:
rm generated/*
cp cacerts generated/truststore
# Add Server certificate to truststore:
keytool -import -file server-ca.pem -alias mysqlServerCACert -keystore generated/truststore
# Change password:
keytool -storepasswd -keystore generated/truststore
# Convert key
winpty openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -name my-key -out generated/client.p12
# Import converted client certificate:
keytool -importkeystore -srckeystore generated/client.p12 -srcstoretype pkcs12 -destkeystore generated/keystore
信任库和密钥库将在"generated"文件夹中生成。