IBM i DB2 JDBC 使用 SSL 加密

IBM i DB2 JDBC Encryption using SSL

远程服务器是安装了 DB2 的 IBM i (7.1)。我正在尝试使用我的 windows 机器上的 SSL,通过 JDBC 加密 link 连接到 IBM i 机器上的这个远程 db2 数据库,我正在使用 jt400-6.7.jar。 我可以看到 SSL 在 IBM i 机器上正确配置,因为我在数字证书管理器中看到以下内容:

Current Certificate Store
You have selected to work with the certificate store listed below. The left frame is being refreshed to show the task list for this certificate store. Select a task from the left frame to begin working with this certificate store.

Certificate type:   Server or client
Certificate store:  *SYSTEM
Certificate store path and filename:    
/QIBM/USERDATA/ICSS/CERT/SERVER/DEFAULT.KDB

我按照这个 link 在我的 IBM i 机器上设置了 SSL: https://isupport.krengeltech.com/rxs/setting_up_ssl/

这是我的 JDBC 从我的 windows 10 机器上执行的程序:

import java.sql.*;

public class IBMiSSLConnect 
{
    public static void main(String[] args) throws Exception 
    {
          try 
          {
              Class.forName("com.ibm.as400.access.AS400JDBCDriver");
              Connection con = DriverManager.getConnection("jdbc:as400://IBMiMachineIP:5021/DBNAME&secure=true", "USER", "PASSWORD");

          }  
          catch(Exception e) 
          {
              System.out.println(e.getMessage());
          }

    }
}

我收到以下错误:

[PWS0082] 库未添加到库列表中。

如果我按如下方式替换url(添加系统库):

连接con = DriverManager.getConnection("jdbc:as400://IBMiMachineIP:5021/DBNAME;naming=system;libraries=QSYS;secure=true", "USER", "PASSWORD");

我收到以下错误:

申请者无法建立连接。 (sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径)

我有两个问题:

问题 1:是否总是需要在 url 中添加命名和库以使用 SSL JDBC 加密?
像这样:

dbc:as400://someserver;naming=system;libraries=devfiles,prodfiles,sysibm,etc

我指的是这个 link :

How can I insert additional libraries to my jdbc/DB2 connection?

问题 2:我应该使用 secure 还是 sslConnection 作为 url 参数? 即:

a: jdbc:as400://IBMMiMachineIP:5021/DBNAME&secure=true

b: jdbc:as400://IBMMiMachineIP:5021/DBNAME&sslConnection=true

*注意:我已经更改了信任库文件 default.kdb 和 default.rdb 的 SSL 权限,如此处所述:

https://isupport.krengeltech.com/rxs/configuring_ssl_permissions/

Q1。不,使用 SSL 时不需要添加命名和库属性。

Q2。您不应该将 :5021 用作 URL 的一部分。它目前被忽略,但将来可能会被使用。您应该使用 secure=true 来获取 SSL 连接。

我怀疑您的问题是客户端系统上的 JVM 使用的信任库没有您的证书颁发机构的证书(看起来您在服务器上使用的是自签名证书)。如果仍有问题,请在启动时使用以下命令在客户端上打开 SSL 跟踪 java:

-Djavax.net.debug=ssl:握手:详细

请注意,jt400.jar 附带了一个 jdbcClient,因此您可以使用它来测试您的连接。以下是使用 SSL 连接的示例。在这种情况下,cacerts 是包含签署服务器证书的 CA 的证书的信任库。

java -Djavax.net.debug=ssl:handshake:verbose -Djavax.net.ssl.trustStore=cacerts -jar jt400.jar 'jdbc:as400:SYSTEM;secure=true' 用户名密码

这将显示 JVM 正在进行的 SSL 协商。

@jweberhard 在问题中所说的,不需要使用库 并且 ssl 端口不是 5021 是正确的,谢谢@jweberhard。但是我意识到 就我而言,特别是我根据先前的假设做出了一个错误的假设 知识 。

我已经完成了从 windows 机器到的类似 SSL 加密连接 带有 MySQL DB 和 Postgres DB 的远程机器,在这两种情况下您都可以在 wireshark 是这样的:

1   source IP   Dest IP TLSv1.2 220 Client Hello
2   Dest IP     source IP TLSv1.2   1140    Server Hello, Certificate, Server Key Exchange, Server Hello Done
3   source IP   Dest IP TLSv1.2 129 Client Key Exchange
4   source IP   Dest IP TLSv1.2 60  Change Cipher Spec
5   source IP   Dest IP TLSv1.2 99  Encrypted Handshake Message 

我一直在寻找 wireshark 中的 TLSv1.2 协议用法,但是我 特别是当您在 IBM i 上使用 DB2 数据库时意识到 仍然会看到 TCP 协议被使用, 但试金石是,如果你看到:

1: 端口 9471 用于 wireshark 中的 SSL 连接(如果不是 确保您会看到正在使用端口 8471)。 请参阅此 link 以了解 IBM i 的端口使用情况:

https://www-03.ibm.com/systems/power/software/i/toolbox/faq/ports.html

2:正在您的 IBM i 机器上创建 QZDASSINIT 作业(使用绿屏来 使用 WRKACTJOB 命令检查您的作业并检查此作业,此作业 是为到您的 DB2 数据库的 SSL 连接而创建的,否则您会看到 仅用于 non-secure 连接的 QZDASONIT 作业。