Подключение к удаленному серверу MySQL из программы Delphi через SSL - PullRequest
3 голосов
/ 28 ноября 2010

Я не очень хорошо разбираюсь в принципах SSL, но просто хочу, чтобы шифрование работало на меня.У меня есть БД и пользователь с указанием «REQUIRE X509».Необходимые сертификаты были созданы, как описано в MySQL docs, и работают хорошо - я могу подключиться к серверу из командной строки Windows.

Проблема возникает, когда я пытаюсь сделать то же самое из моей программы, используя MySQL ClientAPI (без SSL, программа тоже отлично работает).Используемая единица измерения: http://www.audio -data.de / mysql.html .

Это мои пути действий: 1) если я просто добавлю вызов mysql_ssl_set () (с соответствующими параметрами)перед mysql_real_connect () последний выдает общую ошибку соединения SSL.2) Документы MySQL в en / mysql-ssl-set.html говорят, что функция всегда возвращает 0. Но когда я проверил это, оказалось, что результатом является число 11150848. Затем я написал это так:

showmessage(inttostr(mysql_ssl_set(mys, '.\certs\client-key.pem', '.\certs\client-cert.pem', '.\certs\ca-cert.pem', nil)));

... и повторил строку 8 раз.Каждый раз он возвращал немного большее число - 11158528, 11158784, 11159040, ... и два нуля для последних двух вызовов.

После чего mysql_real_connect () был наконец успешным!Программе даже удалось выполнить некоторые запросы, вернуть правильные результаты для них (я знаю данные), но затем она потерпела крах с нарушением прав доступа: запись адреса ... в каком-то месте.Точка сбоя варьировалась между запусками и небольшими изменениями в коде.

Это похоже на проблему несовместимости версий.Я пробовал библиотеки с обеих версий MySQL 5.0 и 5.1 для Windows (сервер 5.1 и работает под Linux удаленно; однако программы mysql-client 5.0 не испытывают проблем при SSL-подключении к нему), но безуспешно.

Кто-нибудь знаком с проблемой?Большое спасибо за помощь и извините за ошибки в вопросе.

1 Ответ

3 голосов
/ 28 ноября 2010

Как я вижу, объявление mysql_ssl_set неверно.Объявлено:

function mysql_ssl_set(_mysql: PMYSQL; key, cert, ca, capath: PAnsiChar): longint; stdcall;

Но mysql.h содержит:

my_bool     STDCALL mysql_ssl_set(MYSQL *mysql, const char *key,
                      const char *cert, const char *ca,
                      const char *capath, const char *cipher);

Это объясняет мусор в возвращаемом значении, AV и т. Д.

...