我在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 install 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
从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;"
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
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;"
我的问题是:
对于任何想法表示感谢;)
如果使用的是自签名SSL证书,则必须使用选项1或2才能进行连接。
在选项1中,您直接提供了证书的公钥,以允许Db2客户端验证Db2服务器。这已经使用了您在问题2中询问的“内存中的密钥库”。
在选项2中,您应该将相同的公钥导入密钥库,以允许Db2客户端验证服务器。
如果仅使用Security=SSL
进行连接,则Db2服务器的SSL证书必须来自系统密钥库中已经存在的一个CA。
[我相信,当Db2文档写入“客户端驱动程序将调用GSKit API来创建填充有默认根证书的密钥数据库”时,这意味着动态创建的kdb将包含一些通用商业CA的证书,并且(如果指定),还将包含SSLServerCertificate指定的证书。