【问题标题】:Python IBM_DB using SSL connection使用 SSL 连接的 Python IBM_DB
【发布时间】:2020-02-03 20:23:51
【问题描述】:

我在 Centos 7 上使用 Python,并且安装了带有 DB2 11.3 客户端的 GSK8Kit。

所以我设置:

IBM_DB_HOME=/path/to/my/db2client/sqllib - ODBC 和 clidriver

我也设置了:

LD_LIBRARY_PATH = $IBM_DB_HOME/lib:$LD_LIBRARY_PATH

然后我安装了ibm_db:

pip 安装 ibm_db

我将我的 db2servercert.arm 添加到位于 /opt/IBM/db2/GSK8KitStore 的 mykeydb.kdb 文件中,并且我在客户端和服务器上使用相同版本的 GSK8Kit。

gsk8capicmd_64 -cert -add -db mykeydb.kdb -stashed -label "DB2 服务器 自签名证书” -file db2servercert.arm -format ascii -trust enable

根据这个 IBM 文档:https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.admin.sec.doc/doc/t0053518.html

从 Db2 V10.5 FP5 开始,连接字符串、db2cli.ini 文件、FileDSN 或 db2dsdriver.cfg 文件中不需要 SSLClientKeystoredb 和 SSLClientKeystash 关键字。如果您尚未设置或传递 SSLClientKeystoreddb 和 SSLClientKeystash 关键字的值,CLI/ODBC 客户端驱动程序将在第一次 SSL 连接期间在内部创建默认密钥数据库。 客户端驱动程序将调用 GSKit API 来创建一个填充有默认根证书的密钥数据库。

现在我正在尝试使用各种场景为 db2 SSL 连接创建 ibm_db 连接字符串

  1. Security=ssl 和 SSLServerCertificate=/path/to/my/db2servercert.arm "Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;SSLServerCertificate=/path/to/my/db2servercert.arm;"
  2. SECURITY=SSL 和 SSLClientKeystoredb=/opt/IBM/db2/GSK8KitStore/mykeydb.kdb 和 SSLClientKeystash=/opt/IBM/db2/GSK8KitStore/mystashfile.sth "Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;SSLClientKeystoredb=/opt/IBM/db2/GSK8KitStore/mykeydb.kdb;SSLClientKeystash=/opt/IBM/db2/GSK8KitStore/mystashfile.sth;"
  3. 安全=ssl

    "Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;"

1) 和 2) 中,我能够在没有任何 SSL 错误连接的情况下进行连接,但是 在 3) 中 我收到了 Socket 414 错误:

[IBM][CLI Driver] SQL30081N A communication error has been detected. Communication protocol being used: "SSL". 
Communication API being used: "SOCKETS". Location where the error was detected: "". 
Communication function detecting the error: "sqlccSSLSocketSetup". Protocol specific error code(s): "414", "", "". SQLSTATE=08001

这意味着: https://www.ibm.com/support/knowledgecenter/en/SSAL2T_7.1.0/com.ibm.cics.tx.doc/reference/r_gskit_error_codes.html,

414 error: GSK_ERROR_BAD_CERT - Incorrectly formatted certificate received from partner.

注意: 在另一台安装了相同配置和 ibm_db 的机器上,此连接字符串有效(我确定我错过了 smth) "Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;"

我的问题是:

  1. 我必须配置哪些环境变量或 db2 客户端参数才能仅使用 Security=ssl 属性进行连接?
  2. 在尝试连接到 db2 远程服务器时,ibm_db 如何在后台工作?我可以在哪里找到这个根证书,它会根据它自动生成自己的 keydb.kdb 文件,如 IBM 文档中所述?

感谢任何想法;)

【问题讨论】:

  • 与这个问题并不真正相关......但在我的情况下,如果我保留 Security=ssl 但根本没有指定证书,它会起作用。我猜这个证书是默认的。

标签: python ssl db2 db2-luw


【解决方案1】:

如果您使用的是自签名 SSL 证书,则在不使用选项 1 或 2 的情况下将无法连接。

在选项 1 中,您直接提供证书的公钥,以允许 Db2 客户端验证 Db2 服务器。这已经在使用您在问题 #2 中询问的“内存中的密钥库”。

在选项 2 中,您应该将相同的公钥导入到您的密钥库中,以允许 Db2 客户端验证服务器。

如果您只想使用Security=SSL 进行连接,那么您的 Db2 服务器的 SSL 证书需要来自系统密钥库中已有的 CA 之一。

【讨论】:

  • 感谢回复,但问题是 - 我比较了两种环境中 .kdb 文件的内容,它们执行相同的代码并具有相同版本的 python 和 ibm_db 并且 kdb 文件的内容是相同。在里面我们有相同的自签名证书/ gsk8capicmd_64 -cert -list -db mykeydb.kdb -stashed。 gsk8capicmd_64 -cert -details -db server.kdb -stashed -label “我的证书”。但是在一个代码上失败并出现上述错误,仅使用 Security=SSL,在另一个代码上它可以正常工作并连接正常
【解决方案2】:

我相信当 Db2 文档中写到“客户端驱动程序将调用 GSKit API 来创建一个填充有默认根证书的密钥数据库”时,这意味着动态创建的 kdb 将包含一些常见商业 CA 的证书,并且(如果指定)还将包含 SSLServerCertificate 指定的证书。

由于您使用的是自签名证书,在这种情况下 CA 证书将被忽略。

如果您使用 IBM 的驱动程序连接到在 Linux/Unix/Windows 上运行的 Db2 服务器,并且想要使用目标 Db2 实例公钥作为加密一部分的加密连接,那么您必须告诉Db2 客户端以一种或另一种方式获取该证书(其中包含 Db2 实例公钥)的位置。

对于 linux 客户端,证书将在静态创建的 kdb 中(通过 GSKit 命令),或者在使用 SSLServerCertificate 属性指定的动态创建的 kdb 中。对于在 Microsoft Windows 上运行的 Db2 客户端,如果 Db2 客户端配置为使用该证书,则还可以从 MS 密钥库中获取证书。

ibm_db 模块的源代码可在 github 上找到。但是,客户端 SSL 工作并不发生在 ibm_db 模块中,而是发生在(封闭源代码)Db2 驱动程序以及 GSKit 的(封闭源代码)库中。要查看幕后发生的一些事情,您可以跟踪 CLI 驱动程序。有关 CLI 跟踪的详细信息,请参阅在线 Db2 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多