【问题标题】:IBM i DB2 JDBC Encryption using SSL使用 SSL 的 IBM i DB2 JDBC 加密
【发布时间】:2018-07-31 00:14:09
【问题描述】:

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

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

我点击此链接在我的 IBM i 机器上设置 SSL: https://isupport.krengeltech.com/rxs/setting_up_ssl/

这是我在 Windows 10 机器上执行的 JDBC 程序:

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 替换如下(添加系统库):

Connection 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:无法找到请求目标的有效证书路径)

我有两个问题:

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

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

我指的是这个链接:

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

问 2:我应该使用安全连接还是 sslConnection 作为 url 参数? 那就是:

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

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

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

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

【问题讨论】:

    标签: ssl encryption jdbc db2-400


    【解决方案1】:

    第一季度。不,使用 SSL 时不需要添加命名和库属性。

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

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

    -Djavax.net.debug=ssl:handshake:verbose

    注意,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' USERID PASSWORD

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

    【讨论】:

      【解决方案2】:

      @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 
      

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

      1: 端口 9471 用于wireshark 中的 SSL 连接(如果不是 安全,您将看到正在使用端口 8471)。 请参阅此链接了解 IBM i 的端口使用情况:

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

      2:正在您的 IBM i 机器上创建 QZDASSINIT 作业(使用绿屏 使用 WRKACTJOB 命令检查你的工作并检查这个工作,这个工作 是为与您的 DB2 数据库建立 SSL 连接而创建的,否则您会看到 只有用于非安全连接的 QZDASONIT 作业。

      【讨论】:

        猜你喜欢
        • 2018-07-19
        • 2015-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多