SQLDriverConnect 函数使用 SSL 连接到编目 Db2 数据库的正确连接字符串是什么?

时间:2021-03-01 15:54:59

标签: ssl db2 odbc

SQLDriverConnect 函数使用 SSL 连接到编目 Db2 数据库的正确连接字符串是什么?编程语言 - C++。

我如何准备数据库

db2 "CREATE DATABASE TESTDB"
....
db2 "CATALOG TCPIP NODE SSLNODE REMOTE <HOST> SERVER <PORT> SECURITY SSL
db2 "CATALOG DATABASE TESTDB AS SSLDS AT NODE SSLNODE"
db2 "TERMINATE"
db2stop
db2start

如果使用数据库名称“TESTDB”我可以连接,但是当使用数据库别名“SSLDS”时,连接失败:

第一次尝试通过别名“SSLDS”连接编目数据库显示错误

[IBM][CLI Driver] SQL1224N  The database manager is not able to accept new requests, has terminated all requests in progress, or has terminated the specified request because of an error or a forced interrupt.  SQLSTATE=55032

下一次连接尝试显示错误:

[IBM][CLI Driver] SQL30040N  Execution failed because of unavailable resources that will not affect the successful execution of subsequent commands and SQL statements:  Reason "0x0", Type of Resource "MEMORY", Resource Name "", Product ID "SQL11013 ".  SQLSTATE=57012

我使用的连接字符串:

Database=SSLDS;UID=<USER>;PWD=<PWD>;Protocol=TCPIP;Servicename=<PORT>;Security=SSL;SSLClientKeystoredb=c:\ssl\storage.kdb;SSLClientKeystash=c:\ssl\storage.sth;

Db2 实例 SSL 配置:

SSL server keydb file                   (SSL_SVR_KEYDB) = C:\ssl\server.kdb
SSL server stash file                   (SSL_SVR_STASH) = C:\ssl\server.sth
SSL server certificate label            (SSL_SVR_LABEL) = selfsignedcert
SSL service name                         (SSL_SVCENAME) = db2c_DB2
SSL cipher specs                      (SSL_CIPHERSPECS) =
SSL versions                             (SSL_VERSIONS) =
SSL client keydb file                  (SSL_CLNT_KEYDB) =
SSL client stash file                  (SSL_CLNT_STASH) =

db2set

DB2INSTOWNER=*****
DB2PORTRANGE=***:***
DB2_GRP_LOOKUP=LOCAL,TOKENLOCAL
DB2INSTPROF=C:\PROGRAMDATA\IBM\DB2\DB2COPY1
DB2COMM=SSL

创建 GSK 存储

gsk8capicmd_64.exe -keydb -create -db "C:\ssl\server.kdb" -stash -genpw
gsk8capicmd_64.exe -keydb -create -db "C:\ssl\storage.kdb" -stash -genpw
gsk8capicmd_64.exe -cert -create -db "C:\ssl\server.kdb" -stashed -label "selfsignedcert" -dn "CN=TestCompany"
gsk8capicmd_64.exe -cert -extract -db "C:\ssl\server.kdb" -stashed -label "selfsignedcert" -target "C:\ssl\server_cert.arm" -format ascii
gsk8capicmd_64.exe -cert -add -db "C:\ssl\storage.kdb" -stashed -label "selfsignedcert" -file "C:\ssl\server_cert.arm" -format ascii

1 个答案:

答案 0 :(得分:1)

如果在连接字符串中指定 DATABASE=...,则必须使用真实的数据库名称,而不是别名。

如果您想使用别名,请改用 DSN=...(并省略 DATABASE=...)。

此外,您的连接字符串应包含 HOSTNAME=... 以获得最佳效果。

另请注意,如果您只有一个证书文件,那么您可以避免在客户端创建专用密钥库的麻烦,只需使用 SSLServerCertificate=... 关键字,其值为证书的完全限定路径名文件。

此外,要将 C++ 源代码中的所有连接属性具体化,您可以简单地使用 DSN=...;UID=...;PWD=...; 并在 db2dsdriver.cfg xml 文件中定义 DSN 属性(包括 SSL 属性)。您的选择。

您的其他错误(例如 SQL1224N 和 SQL30040N)是特定于配置的,您的问题忽略了客户端和服务器配置的事实。但是先修复连接字符串,这些错误可能会消失。

相关问题