Можно ли хранить ssl сертификаты в файлах ресурсов *.qrc?
обычная функция, которая подключается по ssl к базе данных:
bool DataBaseProvider::setStorageCurrentParams(ConnectionParam& params)
{
qDebug() << __FUNCTION__;
QElapsedTimer timer;
timer.start();
// выбрать самое минимальное по времени подключпение
QSqlDatabase storage_db = QSqlDatabase::addDatabase("QMYSQL", params.cp_host);
storage_db.setDatabaseName(params.cp_name);
storage_db.setHostName (params.cp_host);
storage_db.setPort (params.cp_port);
storage_db.setUserName (params.cp_user_name);
storage_db.setPassword (params.cp_password);
QString ssl_key;
QString ssl_cert;
QString ssl_ca;
// QTemporaryDir tempDir;
// if (tempDir.isValid()) {
// ssl_key = tempDir.path() + "/tmpfile_1";
// ssl_cert = tempDir.path() + "/tmpfile_2";
// ssl_ca = tempDir.path() + "/tmpfile_3";
// if (QFile::copy("://certs/client-key.pem", ssl_key)) {
// qDebug() << "файл1 создался";
// }
// if (QFile::copy("://certs/client-cert.pem", ssl_cert)) {
// qDebug() << "файл2 создался";
// }
// if (QFile::copy("://certs/ca-cert.pem", ssl_ca)) {
// qDebug() << "файл3 создался";
// }
// }
ssl_ca = "://certs/ca-cert.pem";
ssl_cert = "://certs/client-cert.pem";
ssl_key = "://certs/client-key.pem";
storage_db.setConnectOptions( "SSL_KEY=" + ssl_key + ";"\
"SSL_CERT=" + ssl_cert + ";"\
"SSL_CA=" + ssl_ca );
bool is_open = storage_db.open();
qDebug() << QString("Connect to MySQL DB '%1' %2:%3... [%4]")
.arg(params.cp_name).arg(params.cp_host).arg(params.cp_port).arg(is_open ? "OK" : "FAIL");
if(is_open)
{
params.cp_timeToConnected = timer.elapsed();
storage_db.close();
storage_db.setConnectOptions();
}
return is_open;
}
если создавать временные файлы. и передавать путь до них, то код работает. Но можно ли сделать так, как я хочу, а именно передавать путь до ресурсов? (комментированный код рабочий)
Ответы (1 шт):
Так как вы хотите - сделать нельзя.
Qt-ресурсы доступны только из кода на Qt (при открытии файлов через QFIle), но MySQL ничего не знает о Qt и использует для доступа к файловой системе стандартный интерфейс POSIX.
Используйте QTemporaryFile, чтобы не мусорить во временной папке. Или единожды кладите сертификаты в отдельную папку рядом с exe, поставляя файлы сертификатов в составе дистрибутива.
Вообще, странно зашивать сертификаты в exe (или дистрибутив). Обычно, они выдаются каждому пользователю - отдельно, чтобы можно было отозвать отдельный сертификат.
Если хотите экономить время на установление соединения (судя по строке QElapsedTimer timer;), то не закрывайте соединение (храните его в static переменной). Не предётся пере-открывать.