Python IBM_DB с использованием SSL-соединения - PullRequest
0 голосов
/ 03 февраля 2020

Я использую Python на Centos 7, и я установил GSK8Kit с клиентом DB2 11.3.

Итак, я установил:

IBM_DB_HOME = / path / to / my / db2client / sqllib - ODB C и clidriver

Также я установил :

LD_LIBRARY_PATH = $ IBM_DB_HOME / lib: $ LD_LIBRARY_PATH

Затем я установил ibm_db:

pip install ibm_db

1019 *

Я добавил свой db2servercert.arm в файл mykeydb.kdb, расположенный /opt/IBM/db2/GSK8KitStore, и я использую ту же версию 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 и далее, ключевые слова SSLClientKeystoredb и SSLClientKeysta sh не нужны в строке подключения, файле db2cli.ini, FileDSN или файле db2dsdriver.cfg. Если вы не установили или не передали значения для ключевых слов SSLClientKeystoreddb и SSLClientKeysta sh, клиентский драйвер CLI / ODB C создаст внутреннюю базу данных ключей по умолчанию во время первого соединения SSL. Драйвер клиента вызовет API GSKit для создания базы данных ключей, заполненной сертификатами root по умолчанию.

Теперь я пытаюсь создать строку подключения ibm_db для соединения db2 SSL с использованием различных сценариев ios:

  1. Security = ssl и SSLServerCertificate = / путь / к / 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 * 1053 1052 *

In 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 эта строка подключения работает (я уверен, что пропустил что-то) "Database=sampledb;Protocol=tcpip;Hostname=myhost;Servicename=50001;Security=ssl;"

My qu Вот некоторые из них:

  1. Какие переменные env или параметры клиента db2 мне нужно настроить для подключения только со свойством Security = ssl?
  2. Как ibm_db работает под капотом, когда пытаясь подключиться к удаленному серверу db2 и где я могу найти этот root сертификат, на основе которого он автоматически генерирует свой собственный файл keydb.kdb, как упомянуто в IBM docs?

Thx для любой идеи;)

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я полагаю, что когда в документации по Db2 написано «Драйвер клиента будет вызывать API GSKit для создания базы данных ключей, заполненной сертификатами root по умолчанию», это означает, что динамически созданный kdb будет содержать сертификаты для некоторых распространенных коммерческих CA и (если указано) также будут содержать сертификат, указанный в SSLServerCertificate.

Поскольку вы используете самозаверяющий сертификат, сертификаты CA в этом случае будут игнорироваться.

Если вы подключаетесь к Db2-серверу, работающему в Linux / Unix / Windows, используя драйверы IBM, и хотите зашифрованное соединение, которое использует целевой ключ Db2 publi c в качестве части о шифровании, то вы должны так или иначе сообщить клиенту Db2 местоположение этого сертификата (который содержит ключ publi c экземпляра Db2).

Для клиента linux этот сертификат будет либо в статически созданном kdb (с помощью команд GSKit), либо в динамически созданном kdb, как указано с помощью свойства SSLServerCertificate. Для Db2-клиента, работающего в Microsoft Windows, сертификат может быть дополнительно извлечен из хранилища ключей MS, если Db2-клиент настроен для его использования.

Исходный код для модуля ibm_db доступен на github. Однако работа SSL на стороне клиента происходит не в модуле ibm_db, а вместо этого в драйвере Db2 (с закрытым исходным кодом) вместе с библиотеками (с закрытым исходным кодом) для GSKit. Чтобы увидеть, что происходит под прикрытием, вы можете отследить драйвер CLI. Обратитесь к онлайн-документации по Db2 для получения подробной информации о трассировке CLI.

0 голосов
/ 04 февраля 2020

Если вы используете самозаверяющий SSL-сертификат, вы не сможете подключиться без использования опций 1 или 2.

В варианте 1 вы напрямую предоставляете ключ publi c сертификата для разрешить клиенту Db2 проверять сервер Db2. Он уже использует «хранилище ключей в памяти», о котором вы спрашиваете в вопросе № 2.

В варианте 2 вы бы импортировали тот же ключ publi c в хранилище ключей, чтобы позволить клиенту Db2 для проверки сервера.

Если вы хотите подключиться, используя только Security=SSL, SSL-сертификат вашего сервера Db2 должен прийти от одного из ЦС, уже находящихся в системном хранилище ключей.

...