Можно ли хранить 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 шт):

Автор решения: Chorkov

Так как вы хотите - сделать нельзя.

Qt-ресурсы доступны только из кода на Qt (при открытии файлов через QFIle), но MySQL ничего не знает о Qt и использует для доступа к файловой системе стандартный интерфейс POSIX.

Используйте QTemporaryFile, чтобы не мусорить во временной папке. Или единожды кладите сертификаты в отдельную папку рядом с exe, поставляя файлы сертификатов в составе дистрибутива.

Вообще, странно зашивать сертификаты в exe (или дистрибутив). Обычно, они выдаются каждому пользователю - отдельно, чтобы можно было отозвать отдельный сертификат.

Если хотите экономить время на установление соединения (судя по строке QElapsedTimer timer;), то не закрывайте соединение (храните его в static переменной). Не предётся пере-открывать.

→ Ссылка