Java代码SSL https 加密连接 sqlserver

摘要:
trustServerCertificate=false;trustStorePassword=12345678;autoReconnectForPools=true;数据库名称=网关V7QA;mssql jdbc<版本>8.2.1.jre8<港口城市autoReconnectForPools=true;

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:

中文:https://docs.microsoft.com/zh-cn/sql/connect/jdbc/connecting-with-ssl-encryption?view=sql-server-ver15

英文:https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-with-ssl-encryption?view=sql-server-ver15

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

中文:https://docs.microsoft.com/zh-cn/sql/connect/jdbc/configuring-the-client-for-ssl-encryption?view=sql-server-ver15

英文:https://docs.microsoft.com/en-us/sql/connect/jdbc/configuring-the-client-for-ssl-encryption?view=sql-server-ver15

为了避开我踏过的坑,还是按照我的连接方案往下看吧。首先加上sqlserver的驱动:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>8.2.1.jre8</version>
    <scope>test</scope>
</dependency>

然后url 连接:

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   

Trust this certificate? [no]:  yes

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

SubjectAlternativeName [
  DNSName: domain1.com
  DNSName: domain2.com
  DNSName: domain3.com
]

Java代码验证SSL连接:

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SSL_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) throws SQLException, 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个参数都没配置所以才会报错

免责声明:文章转载自《Java代码SSL https 加密连接 sqlserver》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HPE 交换机基础配置安装Xshell并连接虚拟机下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于 Nginx 的 HTTPS 性能优化

前言 分享一个卓见云的较多客户遇到HTTPS优化案例。 随着相关浏览器对HTTP协议的“不安全”、红色页面警告等严格措施的出台,以及向 iOS 应用的 ATS 要求和微信、支付宝小程序强制 HTTPS 需求,以及在合规方面如等级保护对传输安全性的要求都在推动 HTTPS 的发展。 虽然 HTTPS 优化了网站访问体验(防劫持)以及让传输更加安全,但是很多网...

Navicat使用常见的两个问题及解决方法,提高开发效率

Navicat使用常见问题 在我们日常开发过程中,一般不会直接使用命令行来操作 MYSQL 数据库,而会选择一些图形化界面去帮助我们来进行此类操作,常用的有:SQLyog(Logo也是小海豚),Navicat,或者直接使用编辑器自带的图形化界面工具。我这边开发使用的是 Navicat,在日常使用的时候出现过一下的问题: Too Many Connectio...

Httpd服务入门知识-https(http over ssl)安全配置

         Httpd服务入门知识-https(http over ssl)安全配置                                                 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 一.SSL会话的简化过程   (1)客户端发送可供选择的加密方式,并向服务器请求证书   (2)服务器端...

报错解决

"libcudart.so.8.0 cannot open shared object file: No such file or directory" 解决办法是将一些文件复制到/usr/local/lib文件夹下: #注意自己CUDA的版本号! sudo cp /usr/local/cuda-8.0/lib64/libcudart.so.8.0 /us...

adb命令——简单常用命令介绍:, 获取设备列表及设备状态:adb devices———— 获取设备的状态:adb get-state

这里介绍一些里面常用的命令: 1.adb devices , 获取设备列表及设备状态 2.adb get-state , 获取设备的状态 设备的状态有 3 钟,device , offline , unknown device:设备正常连接 offline:连接出现异常,设备无响应 unknown:没有连接设备 --------------------...

Chrome浏览器查看SSL证书信息

1.https使用f12打开,选中security 如果F12打不开,可以通过最右端的自定义及控制chrome菜单,打开"更多工具"-->"开发者工具" 2. 上面的页面,查看view cerificate 接下来 导出xx.cer文件 http://www.cnblogs.com/davidwang456/p/7053518.html...