• 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:

    中文: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个参数都没配置所以才会报错

  • 相关阅读:
    Word中如何让两个图片垂直居中对齐
    Visio对象插入Word后周围空白过大
    Matlab绘图时横坐标重叠怎么办
    Word中设置所有西文字体为新罗马
    最小二乘法为什么使用误差平方和
    python 网络编程——客户端
    padding
    Ubuntu apache
    网上流行的各开源框架与技术
    Ubuntu下使用SVN
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/12469793.html
Copyright © 2020-2023  润新知