Задать вопрос
@Kamaed
Студентота

Как добавить CA сертификат в Trusted Publisher с помощью WinAPI?

Пытаюсь добавить сертификат CA в хранилище (текущий пользователь) в доверенные.
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include <windows.h>
#include <Wincrypt.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    if ( argc == 1 ) {
        qDebug() << "Enter path to certificate";
        return 1;
    } else if ( argc > 2 ) {
        qDebug() << "Too much parameters";
        return 1;
    }
    QString fileName = argv[1];
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly)) return 1;
    QByteArray blob = file.readAll();
    HCERTSTORE systemStore = CertOpenStore(
                    CERT_STORE_PROV_SYSTEM,
                    0,
                    0,
                    CERT_SYSTEM_STORE_CURRENT_USER,
                    L"Trusted Publisher");
    qDebug() << "Store pointer";
    qDebug() << systemStore;
    unsigned char* blob2 = reinterpret_cast<unsigned char*>( blob.data( ) );
    PCCERT_CONTEXT context = CertCreateCertificateContext( ( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING ), blob2, blob.size() );
    qDebug() << "New context";
    qDebug() << &context;

    PCCERT_CONTEXT newContext;
    bool ok = CertAddCertificateContextToStore( systemStore, context, CERT_STORE_ADD_REPLACE_EXISTING, NULL );
    if (!ok)
    {
        qDebug() << "Could not add certificate to system store!";
        qDebug() << GetLastError();
    }
    CertFreeCertificateContext(context);
    return a.exec();
}

При выполнение выскакивает исключение SIGSEGV
Program received signal SIGSEGV, Segmentation fault.
0x75154c84 in CertAddCertificateContextToStore ()
   from C:\Windows\SysWOW64\crypt32.dll
(gdb) bt
#0  0x75154c84 in CertAddCertificateContextToStore ()
   from C:\Windows\SysWOW64\crypt32.dll
#1  0x00401859 in main (argc=2, argv=0x6a1278) at main.cpp:56
(gdb)


Подскажите, как исправить? Пытался использовать CertAddEncodedCertificateToStore, однако у меня возвращался false, а GetLastError выдавал 0х0.
  • Вопрос задан
  • 666 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C++
qDebug() << &context;

Бесполезная операция. В смысле, это, вероятно, не то чего вы хотите добиться. context это на 99% и есть указатель (посмотрите на название типа: PCCERT_CONTEXT, да и всегда можно открыть декларацию этого типа и посмотреть, что там). Если это указатель (что логично, т.к. CertCreateCertificateContext создает некий тяжелый объект, и возвращает вам указатель на него), то нужно вывести сам указатель, а не указатель-на-указатель как сделали вы:
qDebug() << context;
И тогда, возможно, вы увидите, что он NULL. А ежели он NULL (что вы должны проверять), то его не стоит передавать параметром в CertAddCertificateContextToStore, т.к. вероятно она ожидает там нормальный объект, и сама не обрабатывает NULL (да и зачем ей это делать). Скорее всего по этой причине в этой функции происходит segfault.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы