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 作业。
远程服务器是安装了 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 作业。