![](/img/trans.png)
[英]license error while making connection ibm db2 using python and ibm_db library
[英]Python IBM_DB using SSL connection
我在 Centos 7 上使用 Python,并且我已经安装了 GSK8Kit 和 DB2 11.3 客户端。
所以我设置:
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 连接字符串:
"Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;SSLServerCertificate=/path/to/my/db2servercert.arm;"
"Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;SSLClientKeystoredb=/opt/IBM/db2/GSK8KitStore/mykeydb.kdb;SSLClientKeystash=/opt/IBM/db2/GSK8KitStore/mystashfile.sth;"
安全=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 的机器上安装了这个连接字符串(我确定我错过了) "Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;"
我的问题是:
谢谢你的任何想法;)
如果您使用的是自签名 SSL 证书,则不使用选项 1 或 2 就无法连接。
在选项 1 中,您直接提供证书的公钥,以允许 Db2 客户机验证 Db2 服务器。 这已经在使用您在问题#2 中询问的“内存中密钥库”。
在选项 2 中,您将相同的公钥导入您的密钥库,以允许 Db2 客户机验证服务器。
如果您只想使用Security=SSL
进行连接,那么您的 Db2 服务器的 SSL 证书需要来自系统密钥库中已有的 CA 之一。
我相信,当 Db2 文档写到“客户端驱动程序将调用 GSKit API 来创建一个填充有默认根证书的密钥数据库”时,这意味着动态创建的 kdb 将包含一些常见商业 CA 的证书,并且(如果指定)还将包含 SSLServerCertificate 指定的证书。
由于您使用的是自签名证书,因此在这种情况下将忽略 CA 证书。
如果您使用 IBM 的驱动程序连接到在 Linux/Unix/Windows 上运行的 Db2 服务器,并且想要使用目标 Db2 实例公钥作为加密的一部分的加密连接,那么您必须告诉 Db2- client 以一种或另一种方式获取该证书(其中包含 Db2 实例公钥)的位置。
对于 linux 客户端,证书要么位于静态创建的 kdb(通过 GSKit 命令)中,要么位于使用 SSLServerCertificate 属性指定的动态创建的 kdb 中。 对于在 Microsoft Windows 上运行的 Db2-client,如果 Db2-client 配置为使用该证书,则还可以从 MS 密钥库中获取该证书。
ibm_db 模块的源代码可在 github 上找到。 但是,客户端 SSL 工作不是发生在 ibm_db 模块中,而是发生在(闭源)Db2 驱动程序以及 GSKit 的(闭源)库中。 要查看幕后发生的一些事情,您可以跟踪 CLI 驱动程序。 有关 CLI 跟踪的详细信息,请参阅联机 Db2 文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.