使用SSL连接的Python IBM_DB

2024-09-30 22:18:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Centos 7上使用Python,并且已经安装了带有DB211.3客户端的GSK8Kit

所以我设定:

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

我还设置:

LD_LIBRARY_PATH = $IBM_DB_HOME/lib:$LD_LIBRARY_PATH

然后我安装了ibm_db:

pip install ibm_db

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

gsk8capicmd_64 -cert -add -db mykeydb.kdb -stashed -label "DB2 Server self-signed certificate" -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

从DB2V10.5FP5开始,连接字符串、db2cli.ini文件、FileDSN或db2dsdriver.cfg文件中不需要sslclientkeystredb和SSLClientKeystash关键字。如果尚未设置或传递sslclientkeystreddb和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和sslclientkeystredb=/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. Security=ssl

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

1)和2)中,我能够在没有任何SSL错误连接的情况下连接,但是在3)中,我收到套接字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文档中所述

任何想法的Thx;)


Tags: 文件客户端ssldberrorprotocolibmsecurity
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密钥库,则还可以从MS密钥库获取证书

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

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

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

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

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

相关问题 更多 >