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

java sqlserver 异常处理_Java代码SSL https 加密连接 sqlserver相关推荐

  1. java md5 密钥_java代码实现MD5加密及验证方法

    MD5加密 在我们的程序中,不管是什么,都会有安全问题,今天就说的是MD5加密的方法 MD5是哈希算法,也就是 从明文A到密文B很容易,但是从密文B到明文A几乎不可能 也就是说,给你密文,是几乎无法通 ...

  2. java批处理 异常处理_Java批处理教程

    java批处理 异常处理 在当今世界,互联网已经改变了我们的生活方式,其主要原因之一是大部分日常琐事都使用互联网. 这导致大量数据可用于处理. 其中涉及大量数据的一些示例是处理工资单,银行对帐单,利息 ...

  3. java语音验证码_Java代码示例_Java语音验证接口 | 微米-中国领先的短信彩信接口平台服务商...

    Java语音验证接口代码示例 请求 import java.util.HashMap; import java.util.Map; public class IvrDemo { /** * 语音验证接 ...

  4. python连接sqlserver、怎么跨表查询_python 连接sqlserver,mysql

    python连接sqlserver有很多包可以选择,有pyodbc和pymssql,这里把代码都贴出来,但是希望大家用pyodbc,因为在实践中跑几百万的数据量跑了一天的时候连接会断,google S ...

  5. java代码混淆加密_Java代码混淆和加密--Jocky(转)

    1.1 什么是Jocky? 我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接. 这样,编译后的类文件中将包含有符号 ...

  6. java跳过_java跳过https证书直接请求工具类

    /** * 过滤https协议 * @author edwin */ public class FiltratHttpsUtils { static HostnameVerifier hv = new ...

  7. java 运行异常处理_Java编程异常处理和I/O流

    重点: 1.在编写程序时,要正确地使用捕获例外和声明抛出异常的两种例外处理的方法. 2.遇到实际问题时,要根据需要正确使用各种输入/输出流,特别是对中文使用适当的字符输入流. 3.正确使用对象串行化的 ...

  8. java 开发者异常处理_Java异常处理和设计

    本篇博客内容转自http://www.cnblogs.com/dolphin0520/p/3769804.html,内容供自己学习参考之用 在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序 ...

  9. java future 异常处理_Java异常处理总结

    转自:http://blog.51cto.com/lavasoft/18920 Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if ...

最新文章

  1. 【TX2】TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口
  2. 上海电力大学计算机专业分数线,上海电力大学2020年录取分数线(附2017-2020年分数线)...
  3. CentOS 6.2 下samba 服务的配置
  4. vim 查找并手动替换(笔记)
  5. python turtle循环图案-Python绘图Turtle库详解
  6. 使用Docker部署Node.js中的Vue项目
  7. viterbi算法_HMM模型和Viterbi算法如何应用于分词
  8. 【Linux】29.扫描本机同一局域网内 某端口开启 的主机
  9. 曼彻斯特解密_曼彻斯特编码解码方法与流程
  10. 实战:网店活动付邮试用全攻略
  11. 面向对象设计原则-Principles and Patterns读书笔记三
  12. C++标准库与Java基础类对照表
  13. adb interface找不到驱动程序_Windows 10现支持更多设备的驱动程序更新
  14. 局域网网络相关的问题
  15. 织梦cms安装完成后登录后台出现空白。主要原因是php版本的问题
  16. 计算机网络原理精讲学习笔记
  17. sql server2016数据库学习必备(保姆级教程)
  18. ITIL 4: 培训与认证
  19. 什么是狭义人工智能、通用人工智能和超级人工智能?
  20. .NET Quartz 配置JOB

热门文章

  1. .Net/C# 实现 中国移动 CMPP v3.0 ISMG - SP 收发短信的 SP 客户端 (CMPP SP Client)
  2. UE4,UE5虚幻引擎,Command Console控制台命令,参数集
  3. AI本地绘画软件(无需联网)+7Glatest模型+10G数据整合包
  4. oracle repeatable read,Oracle和Mysql中的数据库事务有关问题:Mysql Read-Repeatable有有关问题...
  5. 《佛密诸事》第五章 罗汉五密说
  6. gel和react哪个厉害_lunarlon和react哪个好?
  7. 醍醐灌顶:领域驱动设计实现之路
  8. 《数据结构》课程设计题目
  9. 全卷积神经网络(FCN)和卷积神经网络(CNN)的主要区别
  10. CCTV5手机客户端新媒体:让赛事集锦堪比电影大片