(2019-11-06 15:57:11 отредактировано Binger)

Как получить серийный номер сертификата на токене, используя pkicore?

Здравствуйте. Есть ли возможность получить серийный номер сертификата, расположенного на токене с использованием функционала библиотеки pkicore? Если возможно, то как? Пытался получить серийник через метод getSerialNumber(), но там на выходе какие-то символы нечитабельные. Спасибо.

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Binger, здравствуйте!

У класса Pkcs11Device для этого есть метод getSerialNumber().

Код корректно печатет в консоль серийный номер

cout << "Device " << device.getSerialNumber() << '\n';

Вы как его обрабатываете или храните?

(2019-11-06 16:20:00 отредактировано Binger)

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Павел Анфимов, вот мой код:

#include "stdafx.h"
#include <common.h>
#include <codecvt>
using namespace std;
using namespace rutoken::pkicore;



int main()
{
    try {
        cout << boolalpha;

        /**********************************************************************
        * Инициализируем pkicore, передав путь до директории с библиотекой    *
        * rtPKCS11ECP.                                                        *
        **********************************************************************/
        rutoken::pkicore::initialize(".");
        SCOPE_EXIT() {
            /**********************************************************************
            * Завершаем работу с pkicore при выходе из текущего блока.            *
            **********************************************************************/
            rutoken::pkicore::deinitialize();
        };

        /**********************************************************************
        * Получаем список подключенных устройств и продолжаем работу с первым *
        * доступным устройством.                                              *
        **********************************************************************/
        auto devices = Pkcs11Device::enumerate();
        if (devices.empty()) {
            throw runtime_error("There must be at least one device connected");
        }

        auto device = move(devices.front());

        /**********************************************************************
        * Получаем список сертификатов на устройстве.                         *
        **********************************************************************/
        auto certs = device.enumerateCerts();
        cout << certs.size() << " certificates have been found\n" << endl;

        /**********************************************************************
        * Выводим серийные номера сертификатов.                               *
        **********************************************************************/
        for (size_t i = 0; i != certs.size(); ++i) {
            auto& cert = certs[i];
            vector<uint8_t> v_ID = cert.getSerialNumber();
            string ID(v_ID.begin(), v_ID.end());
            cout << "Serial Number: " << ID << "\n\n\n";
        }
}
catch (const exception& e) {
    cerr << e.what() << endl;
    system("pause");
    return 1;
}
system("pause");
return 0;
}

На выходе символы в какой-то непонятной для меня кодировке. Например, получил "цлч\x17з\f\v/" вместо "F6 EB F7 17 E7 0C 0B 2F"

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Вот результат вывода серийных номеров 5 сертификатов:
https://forum.rutoken.ru/uploads/images/2019/11/b1b1c8d4307c9206ec949ef53ef2925b.png

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Логично - серийный номер сертификата - байтовый массив, его не стоит пытаться отобразить как строку, поскольку появятся непечатные символы.

Если надо напечатать серийный номер, делайте так:

for (auto i = 0; i < v_ID.size(); ++i)
    cout << hex << setfill('0') << setw(2) << v_ID[i] << " ";

(2019-11-06 16:34:25 отредактировано Binger)

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Павел Анфимов, Павел, мне надо получить серийный номер в wstring строку для дальнейшей работы с сертификатом.

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Конвертировать можете так:
https://ru.stackoverflow.com/questions/ … stdwstring

(2019-11-06 16:44:53 отредактировано Binger)

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Павел Анфимов, Павел, я не об этом. Я знаю, как можно конвертировать. Мне не нужна печать серийного номера - это я вам показал для примера. У меня в строке ID содержатся не символы серийного номера: на выходе символы в какой-то непонятной для меня кодировке. Например, получил "цлч\x17з\f\v/" вместо "F6 EB F7 17 E7 0C 0B 2F". Как мне из этого "цлч\x17з\f\v/" получить читабельный серийный номер "F6 EB F7 17 E7 0C 0B 2F" (ну или f6:eb:f7:17:e7:0c:0b:2f, как он выводится в консоль из SDK с использованием pkcs11)?
https://forum.rutoken.ru/uploads/images/2019/11/8a14d585896baa3dd3e415882ca08854.png

(2019-11-07 11:14:20 отредактировано Павел Анфимов)

Re: Как получить серийный номер сертификата на токене, используя pkicore?

string uint8_vector_to_hex_string(const vector<uint8_t>& v) {
    stringstream ss;
    ss << std::hex << std::setfill('0');
    vector<uint8_t>::const_iterator it;

    for (it = v.begin(); it != v.end(); it++) {
        if(it != v.begin())
            ss << " ";

        ss << std::setw(2) << static_cast<unsigned>(*it);
    }

    return ss.str();
}

...
vector<uint8_t> v_ID = cert.getSerialNumber();

string s = uint8_vector_to_hex_string(v_ID);
wstring wstr(s.begin(), s.end());

Re: Как получить серийный номер сертификата на токене, используя pkicore?

Павел Анфимов, Да, именно то, что мне нужно. Большое спасибо за помощь, Павел.