使用SSL连接的Python IBM_DB

时间:2020-02-03 20:23:51

标签: python ssl db2 db2-luw

我在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连接字符串

  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. Security = 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. 我必须配置哪些env变量或db2客户机参数才能仅与Security = ssl属性连接?
  2. 当尝试连接到db2远程服务器时,ibm_db是如何工作的?在哪里可以找到该根证书,如IBM文档所述,根证书将基于该根证书自动生成自己的keydb.kdb文件?

感谢任何想法;)

2 个答案:

答案 0 :(得分:0)

如果使用的是自签名SSL证书,则不使用选项1或2就无法连接。

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

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

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

答案 1 :(得分:0)

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

在使用自签名证书时,在这种情况下,将忽略CA证书。

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

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

ibm_db模块的源代码在github上可用。但是,客户端SSL工作不在ibm_db模块中发生,而是在GSKit库(关闭源)Db2-driver和(关闭源)库中发生。要了解幕后情况,可以跟踪CLI驱动程序。有关CLI跟踪的详细信息,请在线参考Db2文档。