在非 Java DB2 客户机中配置安全套接字层 (SSL) 支持
可以将诸如 CLI、CLP 和 .Net Data Provider 客户机之类的 DB2® 数据库客户机配置为支持安全套接字层 (SSL) 以便与 DB2 服务器进行通信。
- 开始之前
注: 如果 V9.7 的 DB2 客户机或 DB2 Connect™ 服务器与 z/OS® V1.8、V1.9 或 V1.10 系统上 DB2 z/OS 版服务器建立 SSL 连接,那么必须将 APAR PK72201 的相应 PTF 应用于 Communication Server for z/OS IP Services。
注: 由于 GSKit V8 与 GSKit 7.0.4.20 之前的 GSKit V7d 不兼容,与 IDS 数据服务器(使用 GSKit 7.0.4.20 之前的 GSKit V7d)的 CLI 应用程序连接将失败。要纠正该问题,请将 IDS 数据服务器上的 GSKit 库升级到 GSKit 7.0.4.20 或更高版本
在为客户机配置 SSL 支持之前,请执行下列步骤:
如果客户机和服务器位于同一物理计算机上,那么不需要安装 GSKit,因为 GSKit 已自动随 DB2 服务器一起进行了安装。
自 V9.7 FP1 起,当您安装 DB2 服务器的 64 位版本时,安装中将自动包括 32 位 GSKit 库。要使用这些库,在 Linux 和 UNIX 操作系统上,必须确保已正确设置 LD_LIBRARY_PATH、LIBPATH 或 SHLIB_PATH 环境变量。在 Windows 操作系统上,请确保已正确设置 PATH 环境变量,如下表中所示。
应用程序
操作系统
GSKit 库的位置
环境变量设置
32 位 Linux 和 UNIX 64 位 $INSTHOME/sqllib/lib32/gskit 在 LD_LIBRARY_PATH、LIBPATH 或 SHLIB_PATH 环境变量中包括 $INSTHOME/sqllib/lib32/gskit。
64 位 Linux 和 UNIX 64 位 $INSTHOME/sqllib/lib64/gskit 在 LD_LIBRARY_PATH、LIBPATH 或 SHLIB_PATH 环境变量中包括 $INSTHOME/sqllib/lib64/gskit。
32 位 Windows 64 位 C:\Program Files (x86)\IBM\GSK8\lib 在 PATH 环境变量中包括 C:\Program Files (x86)\IBM\GSK8\lib
64 位 Windows 64 位 C:\Program Files\IBM\GSK8\lib64 在 PATH 环境变量中包括 C:\Program Files\IBM\GSK8\lib64
SSL 通信将始终为 FIPS 方式。
在非 Windows 平台上,DB2 数据库管理器以本地方式安装 GSKit,对于 32 位和 64 位安装,GSKit 库分别位于 sqllib/lib/gskit 或 sqllib/lib64/gskit 中。没有必要在全局位置安装 GSKit 的另一个副本。如果存在 GSKit 的全局副本,请使全局 GSKit 与局部 GSKit 处于同一版本。
当将客户机安装在另一台计算机上时,如果基于“C”的客户机使用 SSL 来与服务器通信,那么对于这些客户机,必须安装 GSKit。可以从“IBM® DB2 Support Files for SSL Functionality DVD”安装 GSKit 库。或者,可以通过已从 Passport Advantage® 下载的映像进行安装。
在 Windows 上,确保 IBM Global Security Kit (GSKit) 库的路径出现在 PATH 环境变量中;在 Linux 和 UNIX 上,确保该路径出现在 LIBPATH、SHLIB_PATH 或 LD_LIBRARY_PATH 环境变量中。例如,在 Windows 上,将 GSKit bin 和 lib 目录添加至 PATH 环境变量:
set PATH="C:\Program Files\ibm\gsk8\bin";%PATH%
set PATH="C:\Program Files\ibm\gsk8\lib";%PATH%
从 DB2 V10.5 FP5 开始,如果客户机将安装在另一台计算机上并使用 SSL 与服务器进行通信,请忽略“过程”部分中的步骤 2 和 3。另外,不需要为 CLI、.NET 和开放式源代码驱动程序安装 GSK。您可以使用 CLI 连接字符串、db2cli.ini 文件或 db2dsdriver.cfg 文件中的 SSLServerCertificate 关键字将 SSL 证书传递到这些客户机驱动程序。客户机驱动程序将创建一个内部密钥数据库并将证书添加到该数据库。您无需修改任何环境变量。
注: 基于证书的认证(例如,DB2 for z/OS 支持的双向认证)仍然需要 GSK。
GSKit 工具 GSKCapiCmd 的文档
有关 GSKit 工具 GSKCapiCmd 的信息,请参阅以下网址提供的 GSKCapiCmd User’s Guide:ftp://ftp.software.ibm.com/software/webserver/appserv/library/v80/GSK_CapiCmd_UserGuide.pdf。
关于此任务
SSL 通信将始终为 FIPS 方式。
过程
要在 DB2 客户机中配置 SSL 支持:
- 1.获取客户机上服务器数字证书的签署者证书。服务器证书可以是自签名证书或由认证中心 (CA) 签署的证书。
如果服务器证书是自签名证书,那么必须将其签署者证书抽取至服务器计算机上的文件,然后将它分发给运行客户机(将与该服务器建立 SSL 连接)的计算机。请参阅配置 DB2 实例中的安全套接字层 (SSL) 支持,以获取有关如何将该证书抽取至文件的信息。
如果服务器证书由熟悉的 CA 签署,那么客户机密钥数据库可能已包含签署了服务器证书的 CA 证书。如果没有包含,那么必须获取该 CA 证书,通常通过访问该 CA 的 Web 站点来完成此任务。
在 DB2 客户机上,使用 GSKCapiCmd 工具来创建类型为 CMS 的密钥数据库。 GSKCapiCmd 工具为非基于 Java 的命令行工具(不需要在系统上安装 Java™ 就能使用此工具)。
您使用 gskcapicmd 命令来调用 GSKCapiCmd,如 GSKCapiCmd User’s Guide 中所述。在 Linux 和 UNIX 操作系统上,该命令的路径为 sqllib/gskit/bin,在 32 位和 64 位 Windows 操作系统上,此路径为 C:\Program Files\IBM\GSK8\bin。(在 64 位操作系统上,还存在 32 位 GSKit 可执行文件和库;在此情况下,该命令的路径为 C:\Program Files (x86)\IBM\GSK8\bin。)
例如,创建目录:D:\DB2\ssl>
以下命令创建称为 mydbclient.kdb 的密钥数据库以及称为 mydbclient.sth 的隐藏文件:
gsk8capicmd_64 -keydb -create -db "mydbclient.kdb" -pw "myClientPassw0rdpw0" -stash
-stash 选项会在密钥数据库所在的路径上创建隐藏文件,其文件扩展名为 .sth。在连接时,GSKit 会使用隐藏文件来获取密钥数据库的密码。
- 2.将签署者证书添加到客户机密钥数据库中
例如,以下 gsk8capicmd 命令会将该证书从文件 mydbserver.arm 导入到称为 mydbclient.kdb 的密钥数据库中:
gsk8capicmd_64 -cert -add -db "mydbclient.kdb" -pw "myClientPassw0rdpw0" -label "dbselfsigned" -file "mydbserver.arm" -format ascii -fips
对于客户机应用程序,设置适当的连接字符串或配置参数,如客户机的适用示例中所示。
示例
CLP 和嵌入式 SQL 客户机
CLP 客户机和嵌入式 SQL 客户机可以连接至远程主机上的数据库,已使用 CATALOG TCPIP NODE 命令将该远程主机添加至节点目录。发出 CATALOG TCPIP NODE 命令,SECURITY 关键字设置为 SSL 以对该连接指定 SSL。
以下示例演示了如何编目节点和数据库,以便 CLP 客户机可以使用 SSL 连接来与它们建立连接。
首先,编目节点和数据库,以便客户机应用程序可与它们建立 SSL 连接:
db2 catalog TCPIP NODE n_131ssl REMOTE 192.168.5.131 SERVER 60000 SECURITY SSL
db2 catalog DATABASE test AS test_ssl AT NODE n_131ssl AUTHENTICATION SERVER
接着,使用 ssl_clnt_keydb 和 ssl_clnt_stash 配置参数来指定客户机密钥数据库和隐藏文件。您将 ssl_clnt_keydb 配置参数设置为密钥数据库文件 (.kdb) 的标准路径并将 ssl_clnt_stash 配置参数设置为隐藏文件的标准路径。
db2 update dbm cfg using SSL_CLNT_KEYDB D:\DB2\ssl\mydbclient.kdb SSL_CLNT_STASH D:\DB2\ssl\mydbclient.sth
如果 ssl_clnt_keydb 或 ssl_clnt_stash 配置参数 为 NULL(未设置),连接将失败并返回错误 SQL10013N,标记为 GSKit Error: GSKit_return_code。
然后,从 CLP 客户机连接至服务器:
db2 connect to myssldb user user1 using password
或者,嵌入式 SQL 应用程序可使用以下语句来进行连接:
Strcpy(dbAlias,“myssldb”);
EXEC SQL CONNECT TO :dbAlias USER :user USING :pswd;
CLI/ODBC 客户机应用程序
您可以使用连接字符串参数(SSLClientKeystoredb 和 SSLClientKeystash)或 DB2 配置参数(ssl_clnt_keydb 和 ssl_clnt_stash)来指定客户机密钥数据库路径和存储文件路径,具体取决于运行 CLI 应用程序的环境。
如果使用 IBM Data Server Driver for ODBC and CLI,那么使用连接字符串参数,如以下示例中所示:
通过包含 SECURITY=SSL 关键字的连接字符串来调用 SQLDriverConnect。例如:
“Database=sampledb; Protocol=tcpip; Hostname= myhost; Servicename=50001;
Security=ssl; SSLClientKeystoredb=/home/test1/keystore/clientstore.kdb;
SSLClientKeystash=/home/test1/keystore/clientstore.sth;”
在这种情况下,因为指定了 Security=ssl,所以必须设置 SSLClientKeystoredb 和 SSLClientKeystash 连接字符串参数,否则,连接将失败。
如果使用 IBM Data Server Client或 IBM Data Server Runtime Client,那么可使用连接字符串参数或 DB2 配置参数来设置客户机密钥数据库路径和存储文件路径。如果设置了 SSLClientKeystoredb 和 SSLClientKeystash 连接字符串参数,那么它们会覆盖 ssl_clnt_keydb 或 ssl_clnt_stash 配置参数设置的任何值。
此示例使用 db2cli.ini 文件来设置连接字符串参数:
[sampledb]
Database=sampledb
Protocol=tcpip
Hostname=myhost
Servicename=50001
Security=ssl
SSLClientKeystoredb=/home/test1/keystore/clientstore.kdb
SSLClientKeystash=/home/test1/keystore/clientstore.sth
此示例使用 FileDSN CLI/ODBC 关键字来标识包含数据库连接信息的 DSN 文件,该文件设置连接字符串参数。例如,该 DSN 文件看起来可能与下面的内容相似:
[ODBC]
DRIVER=IBM DB2 ODBC DRIVER – DB2COPY1
UID=user1
AUTHENTICATION=SERVER
PORT=50001
HOSTNAME=myhost
PROTOCOL=TCPIP
DATABASE=SAMPLEDB
SECURITY=SSL
SSLClientKeystoredb=/home/test1/keystore/clientstore.kdb
SSLClientKeystash=/home/test1/keystore/clientstore.sth
在这些情况下,因为指定了 Security=ssl,所以如果没有设置 SSLClientKeystoredb 和 SSLClientKeystash 连接字符串参数并且也没有设置 ssl_clnt_keydb 和 ssl_clnt_stash 配置参数,那么连接将失败。
从 DB2 V10.5 FP5 开始,连接字符串、db2cli.ini 文件、FileDSN 或 db2dsdriver.cfg 文件中将不需要 SSLClientKeystoredb 和 SSLClientKeystash 关键字。如果您未设置或传递 SSLClientKeystoreddb 和 SSLClientKeystash 关键字的值,那么 CLI/ODBC 客户机驱动程序将在第一次 SSL 连接期间在内部创建缺省密钥数据库。客户机驱动程序将调用 GSKit API 来创建以缺省根证书进行填充的密钥数据库。如果应用程序使用 SSLServerCertificate 关键字传递了服务器的签署者证书(*.arm 文件),那么客户机驱动程序会将此证书添加到此缺省密钥数据库中并开始建立 SSL 连接。在这种情况下,应用程序需要在以下连接字符串中使用 Security=SSL 和 SSLServerCertificate=。
“Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;SSLServerCertificate=server.arm;”
如果同时使用了 SSLClientKeystoredb 和 SSLServerCertificate 关键字,那么客户机驱动程序会将证书文件添加到 SSLClientKeystoredb 指向的密钥数据库中,然后开始建立 SSL 连接。
基于证书的认证
基于证书的认证允许您使用 SSL 客户机认证,而不需要在数据库客户机上提供数据库密码。配置基于证书的认证以提供认证信息时,不能以任何其他方式指定密码(如在 db2dsdriver.cfg 配置文件、db2cli.ini 配置文件或连接字符串中)。由于认证参数需要指定标签,所以还引入了新的数据服务器驱动程序配置参数 SSLClientLabel。如果指定了 CERTIFICATE 认证,那么还必须在 CLI 配置文件 db2cli.ini 中或在数据服务器驱动程序配置文件 db2dsdriver.cfg 中指定新的标签参数 SSLCLientLabel。
SSLClientKeyStoreDBPassword 关键字设置密钥库数据库密码。 配置参数 SSLClientKeystash 和 SSLClientKeyStoreDBPassword 互斥。同时在 CLI 配置文件或数据服务器驱动程序配置文件中指定了 SSLClientKeystash 配置参数和 SSLClientKeyStoreDBPassword 配置参数时,会返回错误 CLI0220E。因此,要成功地完成基于证书的认证,建议仅指定其中一个关键字而不是同时指定这两个关键字。
以下是 IBM 数据服务器驱动程序配置文件 (db2dsdriver.cfg) 条目的示例:
DB2 .Net Data Provider 应用程序
借助以下方法,DB2 .Net Data Provider 应用程序可与数据库建立 SSL 连接:通过定义连接字符串参数 SSLClientKeystoredb 和 SSLClientKeystash 来指定客户机密钥数据库路径和隐藏文件路径。连接字符串还必须包含 Security=SSL。例如:
String connectString = “Server=myhost:50001;Database=sampledb;Security=ssl;
SSLClientKeystoredb=/home/test1/keystore/clientstore.kdb;
SSLClientKeystash=/home/test1/keystore/clientstore.sth”;
这样,如以下 C# 代码片段中所示,要与数据库建立连接,请将此 connectString 传递至 DB2Connection 构造函数并使用 DB2Connection 对象的 Open 方法来与 connectString 中标识的数据库建立连接:
DB2Connection conn = new DB2Connection(connectString);
Conn.Open();
Return conn;
如果 SSLClientKeystoredb 或 SSLClientKeystash 连接字符串参数为 NULL(未设置),那么连接将失败并返回错误 SQL10013N(标记为 GSKit Error: GSKit_return_code)。
从 DB2 V10.5 FP5 开始,您无需在 SSL 连接中使用 SSLClientKeystoredb 和 SSLClientKeystash 关键字。但是,连接字符串必须仍然包含 Security=SSL。可以按照如下所示使用连接字符串:
String connectString = “Server=myhost:50001;Database=sampledb;Security=ssl;SSLServerCertificate=server.arm;”;
注意:
抽取在密钥库数据库中创建的自签名客户机证书时,extract 命令将从密钥库数据库中抽取公用密钥数据,并将其放入指定的文件。但是,不会解压缩与专用密钥相关的信息。如果将此类证书导入其他密钥库数据库,那么仅会导入公共密钥数据,且新密钥库数据库中不存在专用密钥数据。因此,使用新密钥库数据库认证客户机将失败。作为解决方案,整个密钥库数据库需要由不同应用程序共享,或需要为每个客户机生成不同客户机证书。