一、为什么要采用SSL协议连接数据库
有各种各样的理由,但是其实就一句话:使用证书验证连接数据库更加安全。
二、如何配置数据库端SSL
使用ssl协议连接postgresql分为两步骤:
- 使用ssl协议连接数据库,需要现在数据库服务端配置ssl服务生成ssl证书,具体步骤参考:postgresql ssl设置
- 客户端连接数据库的时候加载ssl证书。
三、Java中怎么使用Jdbc连接
java中jdbc使用ssl协议连接数据库非常简单,只需要在数据库的jdbc连接串中加入参数即可,不需要改动一行代码。
sprigboot配置如下:
datasource:
url: jdbc:postgresql://127.0.0.1:4432/testdb?&sslmode=verify-ca&sslrootcert=src/main/resources/dbcerts/root.crt&sslcert=src/main/resources/dbcerts/postgresql.crt&sslkey=src/main/resources/dbcerts/postgresql.unprotected.pk8
username: poestgres
password: 111111
说明:
1)postgreSql通常是三个证书,一个根证书,一个客户端证书,一个客户端密钥。
使用jdbc连接时客户端密钥必须是pk8形式!
使用jdbc连接时客户端密钥必须是pk8形式!
使用jdbc连接时客户端密钥必须是pk8形式!
2)相对路径是从src目录开始的,不是classpath也不是resouces目录,是src。
3)如果证书是放在相对路径下,需要添加到.ignore文件,防止证书上传到版本控制仓里。
四、报错
4.1 08006 Could not read SSL key
如果一直报这个错,最大的原因可能是你的私钥是.key的格式,在jdbc中,必须是用pk8的格式。
key转pk8命令,服务端执行:
openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt -in postgresql.key -out postgresql.unprotected.pk8
-nocrypt是说密钥不加密,若密钥加密还需要修改jdbc连接串加上密钥的密码。
4.2 Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting 1.2.840.113549.1.5.13
密钥带密码了,重新转化或者生成,把证书的密码去掉。
评论区