Подключение к удаленному серверу MySQL из программы Delphi через SSL
-
28-09-2019 - |
Вопрос
У меня нет хороших знаний о принципах SSL, но просто хочу, чтобы шифрование работать для меня. У меня есть DB и пользователь с указанным «требуется X509». Необходимые сертификаты были созданы, как описано в MySQL Docs, и хорошо работать - я могу подключиться к серверу из командной строки Windows.
Проблема возникает, когда я пытаюсь сделать то же самое из моей программы, используя MySQL Client API (без SSL, программа также работает нормально). Используемый блок: http://www.udio-data.de/mysql.html..
Это мои пути действия: 1) Если я просто добавлю mysql_ssl_set () call (с нужными параматами) перед mysql_real_connect (), последний дает общую ошибку соединения SSL. 2) MySQL Docs в 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 () наконец был успешным! Программа даже удалось выполнить некоторые запросы, вернуть их подходящие для них (я знаю данные), но потом разбился с нарушением доступа: запись адреса ... в каком-то месте. Торвальная точка варьировалась между прогонами и небольшими изменениями в коде.
Это выглядит очень похоже на проблему несовместимости версии. Я попробовал библиотеки с помощью Windows Windows Windows MySQL 5,0, так и 5.1 (сервер 5.1 и удаленно работает под Linux; однако 5.0 MySQL-клиентские программы не имеют проблем, когда SSL-подключение к нему), но без успеха.
Кто-нибудь знаком с проблемой? Большое спасибо за помощью и извините за ошибки в вопросе.
Решение
Как я вижу объявление 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 и так далее.