Документация
ОС Аврора 5.0.1

certtest.cpp

Пример демонстрирует, как можно использовать QCA::Certificate и QCA::CertificateCollection. Следует обратить внимание, что аргумент, если он предоставляется, должен быть коллекцией файлов в кодировке PEM.

/*
 Copyright (C) 2003 Justin Karneges <justin@affinix.com>
 Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
 
#include <QtCrypto>
 
#include <QCoreApplication>
#include <QFile>
 
#include <iostream>
 
#ifdef QT_STATICPLUGIN
#include "import_plugins.h"
#endif
 
// Выгрузка информации о части сертификата.
// Используется один и тот же подход для получения информации и о субъекте
// сертификата, и об издателе сертификата.
static void dumpCertificateInfo(const QCA::CertificateInfo &info)
{
    std::cout << " Организация: " << std::endl;
 
    // Следует обратить внимание, что один сертификат может применяться к нескольким
    // организациям. QCA::Certificate — это мульти-карта, поэтому, когда
    // запрашиваются значения, связанные с параметром, он возвращает
    // список.
    QList<QString> orgInfoList = info.values(QCA::Organization);
 
    // foreach() взаимодействует с каждым значением в списке, и выгружается
    // каждое значение. Следует обратить внимание, что сертификат
    // редко может содержать несколько значений для одного параметра.
    QString organization;
    foreach (organization, orgInfoList) {
        std::cout << "    " << qPrintable(organization) << std::endl;
    }
 
    std::cout << " Страна: " << std::endl;
    // Как и выше, но это более компактный способ представления
    // итерации и вывода.
    foreach (QString country, info.values(QCA::Country)) { // clazy:exclude=container-anti-pattern
        std::cout << "    " << qPrintable(country) << std::endl;
    }
}
 
// Вспомогательная функция для вывода информации о субъекте сертификата.
static void dumpSubjectInfo(const QCA::CertificateInfo &subject)
{
    std::cout << "Субъект: " << std::endl;
 
    dumpCertificateInfo(subject);
}
 
// Вспомогательная функция для вывода информации об эмитенте сертификата.
static void dumpIssuerInfo(const QCA::CertificateInfo &issuer)
{
    std::cout << "Эмитент: " << std::endl;
 
    dumpCertificateInfo(issuer);
}
 
int main(int argc, char **argv)
{
    // Объект Initializer настраивает элементы, а также
    // выполняет очистку, когда они больше не требуются.
    QCA::Initializer init;
 
    QCoreApplication app(argc, argv);
 
    // Нужно убедиться, что поддерживается обработка сертификатов.
    if (!QCA::isSupported("cert")) {
        std::cout << "К сожалению, сертификат PKI не поддерживается" << std::endl;
        return 1;
    }
 
    // Работа будет происходить с несколькими сертификатами, а
    // QList — отличный шаблонный класс для решения данной задачи.
    QList<QCA::Certificate> certlist;
 
    // Обрабатываются два разных случая:
    // — если предоставляется аргумент, он используется как имя файла для чтения ключей;
    // — если аргумента нет, сертификаты просто читаются из системного хранилища.
    if (argc >= 2) {
        // Сертификаты будут читаться с помощью одного вызова,
        // для которого требуется CertificateCollection.
        QCA::CertificateCollection filecerts;
        // Преобразование можно протестировать (хотя и не обязательно), чтобы узнать,
        // сработало ли оно.
        QCA::ConvertResult importResult;
        // Эта инструкция импортирует все закодированные сертификаты PEM из файла, указанного в качестве аргумента
        // Следует обратить внимание, что передаётся указатель на аргумент результата.
        filecerts = QCA::CertificateCollection::fromFlatTextFile(QFile::decodeName(argv[1]), &importResult);
        if (QCA::ConvertGood == importResult) {
            std::cout << "Импорт выполнен успешно" << std::endl;
            // Эта инструкция превращает CertificateCollection в QList объектов сертификата.
            certlist = filecerts.certificates();
        }
    } else {
        // Аргументов нет, поэтому просто используются системные сертификаты.
        if (!QCA::haveSystemStore()) {
            std::cout << "Системные сертификаты недоступны" << std::endl;
            return 2;
        }
 
        // Аналогично предыдущему, за исключением того, что нужны только системные сертификаты.
        QCA::CertificateCollection systemcerts = QCA::systemStore();
 
        // Эта инструкция превращает CertificateCollection в QList объектов сертификата.
        certlist = systemcerts.certificates();
    }
 
    std::cout << "Количество сертификатов: " << certlist.count() << std::endl;
 
    QCA::Certificate cert;
    foreach (cert, certlist) {
        std::cout << "Серийный номер:";
        // серийный номер сертификата — QCA::BigInteger, но можно
        // просто преобразовать его в строку, а затем вывести.
        std::cout << qPrintable(cert.serialNumber().toString()) << std::endl;
 
        // Информация о субъекте показывает свойства того, к кому
        // применяется сертификат. См. удобные процедуры выше.
        dumpSubjectInfo(cert.subjectInfo());
 
        // Информация об издателе показывает свойства того, кем был
        // подписан сертификат. См. удобные процедуры выше.
        dumpIssuerInfo(cert.issuerInfo());
 
        // Проверка, можно ли использовать сертификат в качестве центра сертификации.
        if (cert.isCA()) {
            std::cout << "Является центром сертификации" << std::endl;
        } else {
            std::cout << "Не является центром сертификации" << std::endl;
        }
 
        // Проверка, является ли сертификат самоподписанным.
        if (cert.isSelfSigned()) {
            std::cout << "Самоподписанный" << std::endl;
        } else {
            std::cout << "Не самоподписанный!!!" << std::endl;
        }
 
        // Сертификат действителен только в определённые даты. Можно получить даты
        // (как QDateTime) с помощью пары вызовов.
        std::cout << "Действителен с " << qPrintable(cert.notValidBefore().toString());
        std::cout << ", до " << qPrintable(cert.notValidAfter().toString());
        std::cout << std::endl;
 
        // Можно получить сертификат в кодировке PEM простым вызовом метода toPEM().
        std::cout << "PEM:" << std::endl;
        std::cout << qPrintable(cert.toPEM());
        std::cout << std::endl << std::endl;
    }
 
    return 0;
}

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.