java sqlserver 异常处理_Java代码SSL https 加密连接 sqlserver

3种连接sqlserver方式 URL 的区别:

1)jdbc:sqlserver://IP:port;DatabaseName=dbName;autoReconnectForPools=true;

2)jdbc:sqlserver://IP:port;DatabaseName=dbName;autoReconnectForPools=true;encrypt=true;trustServerCertificate=true;

3)jdbc:sqlserver://IP:port;DatabaseName=dbName;autoReconnectForPools=true;encrypt=true;trustServerCertificate=false;trustStore=/path/to/truststore.ks;trustStorePassword=12345678;hostNameInCertificate=cer证书里的域名

接下来我们说说这3种连接方式的区别:

一、非加密形式的通用连接方式

jdbc:sqlserver://IP:port;DatabaseName=GatewayV7QA;autoReconnectForPools=true;

二、无条件信任任何根证书的连接方式

jdbc:sqlserver://IP:port;DatabaseName=GatewayV7QA;autoReconnectForPools=true;encrypt=true;trustServerCertificate=true;

trustServerCertificate=true; 这个参数 true 表示无条件信任server端返回的任何根证书

三、客户端需验证server端SSL证书的连接方式

sqlserver官方文档地址——如何配置SSL url:

sqlserver官方文档地址——如何生成 ks 证书:

为了避开我踏过的坑,我的连接方案如下:

jdbc:sqlserver://IP:port;DatabaseName=dbName;autoReconnectForPools=true;encrypt=true;trustServerCertificate=false;trustStore=/path/to/truststore.ks;trustStorePassword=12345678;hostNameInCertificate=cer证书里的域名

这里把 trustServerCertificate=false 设置为false,表示不再随意信任任何server端的根证书了,所以我们需要拿server端的 cer 证书生成客户端的 ks 证书。

打开cmd窗口,进入 serverXXX.cer 所在路径,执行Java的 keytool 命令生成我们需要的 truststore.ks 证书 :

keytool -import -v -trustcacerts -alias aliasName -file serverXXX.cer -keystore truststore.ks

keytool 命令之后会生成 ks 证书,然后配置正确的ks 证书路径 trustStore=/path/to/truststore.ks

truststore.ks 证书生成过程中,有两个步骤需要手工输入:

Enter keystore password: 12345678 // 这里输入的密码就是url连接里的密码:trustStorePassword=12345678 Trustthis certificate? [no]: yes

truststore.ks 证书生成过程中,会显示该 cer 证书包含的信任的server端域名,hostNameInCertificate 这个参数必须配置成这些域名中的一个:

SubjectAlternativeName [

DNSName: domain1.com

DNSName: domain2.com

DNSName: domain3.com

]

Java代码验证SSL连接:

importjava.io.File;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;public classSSL_sqlserver_trustServerCertificate_false_Test {static String SSL_URL = "jdbc:sqlserver://IP:port;DatabaseName=dbName;" +

"autoReconnectForPools=true;ApplicationIntent=ReadOnly;encrypt=true;trustServerCertificate=false;" +

"trustStore=/path/to/truststore.ks;" + //用server端的cer证书生成的ks证书

"trustStorePassword=12345678;" + //truststore.ks 证书生成时的密码

"hostNameInCertificate=domain1.com";static String USERNAME = "username";static String PASSWORD = "password";public static void main(String[] args) throwsSQLException, ClassNotFoundException {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Connection conn=DriverManager.getConnection(SSL_URL, USERNAME, PASSWORD);

ResultSet resultSet= conn.createStatement().executeQuery("select 100, ‘trustServerCertificate=false‘ ");while(resultSet.next()){int queryInt = resultSet.getInt(1);

String getString= resultSet.getString(2);

System.out.println("queryInt==="+queryInt);

System.out.println("getString::: "+getString);

}

conn.close();

}

}

如果连接成功,控制台打印:

queryInt===100

getString::: trustServerCertificate=false

四、报错解决思路

4.1、InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

如果是这个错误,表示ks证书路径不对或者ks证书无效,也就是trustStore=/path/to/truststore.ks 这个值设置错了

4.2、no sqljdbc_auth in java.library.path 或者 sqljdbc_auth.dll: unknown file type, first eight bytes: 0x4D 0x5A 0x90 0x00 0x03 0x00 0x00 0x00

这种找 dll 错误的貌似都是发生在windows端的错误,但是我这里证明了是因为连trustStore、trustStorePassword、hostNameInCertificate 这3个参数都没配置所以才会报错

4.3、SQLServerException: This driver is not configured for integrated authentication

trustStore、trustStorePassword、hostNameInCertificate 这3个参数都没配置所以才会报错

原文:https://www.cnblogs.com/zhuwenjoyce/p/12469793.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值