(2019-10-27 19:39:16 отредактировано Binger)

Как получить данные из сформированного при подписи PKCS7 сообщения?

Здравствуйте. Ситуация такая: подписал я какие-то данные, используя функцию C_EX_PKCS7Sign и получил в итоге p7s файл. В SDK есть пример по верификации данного файла, но там нет возможности прочитать данные о подписи, например, меня интересует время подписи. Как это возможно сделать? Ну и вообще есть ли какие инструменты для работы с файлами такого формата для получения информации из них? Спасибо.

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

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

В стандарте PKCS#11 таких функций нет. Для этого надо воспользоваться сторонними библиотеками вроде OpenSSL API или если речь идет о Windows - CryptoAPI.

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Binger, если воспользоваться консольной утилитой openssl-tool, то можно так:

./openssl cms -in  mycms.pem -inform pem -cmsout -print

(2019-12-11 12:34:29 отредактировано Binger)

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Павел Анфимов, здравствуйте. Подскажите, пожалуйста, какими функциями можно получить данные из signed data pkcs7 (время подписи, данные о сертификате, которым были подписаны данные и т.п.), используя функционал OpenSSL (не консоль). Спасибо.

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Binger,

STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms)

int CMS_signed_get_attr_count(const CMS_SignerInfo *si)

X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc)

Пример вызова смотрите в https://github.com/openssl/openssl/blob … apps/cms.c

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Павел Анфимов, в вашем примере не нашёл ничего, что помогло бы решить проблему. Нашёл вот этот пример:https://stackoverflow.com/questions/556 … signed-fil. Как раз то, что мне нужно, однако при попытке запустить тот код возникла проблема:
https://forum.rutoken.ru/uploads/images/2019/12/2e23752e5f5a1dafe5827bcb4a32f047.png
Павел, вы не знаете в чём может быть дело? не хватает какой-то библиотеки?

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Binger, скорее всего не хватает какого-то хедера https://www.openssl.org/docs/man1.1.0/man7/x509.html

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Павел Анфимов, Павел, у меня подключен данный хедер. Пробовал подключать все хедеры, где есть x509. Безрезультатно.

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

 * typedef struct x509_attributes_st
 *      {
 *      ASN1_OBJECT *object;
 *      STACK_OF(ASN1_TYPE) *set;
 *      } X509_ATTRIBUTE;
 *

У x509_attributes_st нет поля value. Попробуйте написать "xa->set"

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Павел Анфимов, Да, так получилось. Огромное спасибо вам

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Павел Анфимов, не знаю, разбираетесь ли вы в дебрях OpenSSL, но может сможете чем помочь. У меня есть отрывок кода, где я извлекаю время подписи из signed data. Всё работает исправно, когда имею дело с подписанным единожды файлом. Если я подаю файл, где несколько подписей (подписывал подписанный файл), то почему-то время подписи считывается только с момента крайнего подписания - т.е. цикл отрабатывает 1 итерацию. issimax = 1. Кол-во CMS_SignerInfo не должно быть равно кол-ву подписей в файле?

    STACK_OF(CMS_SignerInfo) *ssi;
    CMS_SignerInfo *si;

    ssi = CMS_get0_SignerInfos(cms);
    ASN1_TYPE *at;
    int issimax = sk_CMS_SignerInfo_num(ssi);
    for (int issi = 0; issi < issimax; ++issi)
    {
        si = sk_CMS_SignerInfo_value(ssi, issi);

        //signing time
        int ist = CMS_signed_get_attr_by_NID(si, NID_pkcs9_signingTime, -1);
        X509_ATTRIBUTE *xa = CMS_signed_get_attr(si, ist);
        at = sk_ASN1_TYPE_value(xa->set, 0);
    }

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Binger, покажите CMS в которой две подписи.

(2019-12-12 15:56:55 отредактировано Binger)

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Павел Анфимов,

-----BEGIN CMS-----
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
BggqhQMHAQEDAwOBgQBMATpnW4lRfBkQHI5ZsgegIu0dimUHhBkjlZribJLVoJ7oWXWAD7ACD0Z936O+
GruUU34e+u8DJgsP9gqbkvNVw24k5cLsB0qdru+8vecLF9mep1x1BDquJ8Nan/UjiU38IgWorkwOaZJC
4ZktAT38PfV/3dO1aM6LYnPgZumnbTGCAk0wggJJAgEBMIGHMHoxDzANBgNVBAgMBk1vc2NvdzEPMA0G
A1UEBwwGTW9zY293MRYwFAYDVQQKDA1BTyBBa3Rpdi1Tb2Z0MRAwDgYDVQQLDAdSdXRva2VuMSwwKgYD
VQQDDCNSdXRva2VuIFRFU1QgQ0EgKFApIEdPU1QgUiAyMDEyLTUxMgIJAPbr9xfnDAsvMAwGCCqFAwcB
AQIDBQCgggEZMBwGCSqGSIb3DQEJBTEPFw0xOTEyMTIxMjQ5MjFaME8GCSqGSIb3DQEJBDFCBEBywTDN
LNrlCBA8PsHDN93zmo6YzTWfVDr9zsx/M4ywqOLVERhs8A1Kgx4Mbf6uzVmZXAGYVgslPtvEmwwp0OVh
MIGnBgkqhkiG9w0BCQ8xgZkwgZYwCwYJYIZIAWUDBAEqMAoGCCqFAwcBAQICMAoGCCqFAwcBAQIDMAgG
BiqFAwICCTAIBgYqhQMCAhUwCwYJYIZIAWUDBAEWMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzAOBggq
hkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwDAYIKoUDBwEB
AQIFAASBgMDbONE/DqtaXYpjC0q8kPfk9AICJB4CK/5mBYzI9Kr1XjoQKSr2nPQ7Eht3k4Ddapfm55Pq
EDBfX2t8ViHE3/spIND6kNNW68+IyozbNs0UnqtVNYLhTi0GXLD7EUaU1THuKabufvhm0aR4Sfe2PqjC
Q+5Pd+sFzgrUDMMw+MQw
-----END CMS-----

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Binger, это cms, внутри которой другая cms

Это не множественная подпись.

Какой продукт и для каких задач вы разрабатываете?

Re: Как получить данные из сформированного при подписи PKCS7 сообщения?

Павел Анфимов, спасибо. Разобрался.