Получить подробную информацию от PKCS7 (CMS) через C ++ - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть target.cert файл, и я хочу получить такие данные, как сертификат endDate и startDate

openssl pkcs7 -in target.cert -inform DER -print_certs -out cert_pem

openssl x509 -in cert.pem -enddate -startdate -noout

, а вывод - это дата начала и окончания, и я хочу сделать то же самое, но из кода C ++.

FILE* fp;
if (!(fp = fopen("target.cert", "rb"))) { 
fprintf(stderr, "Error reading input pkcs7 file\n" ); 
exit(1); 
} 
PKCS7 *p7; 
p7 = d2i_PKCS7_fp(fp, NULL);

, но p7 не имеет таких полей, как "startDate" или возможности разбора полей.

Как я могу получить "даты начала / окончания" через C ++?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

PKCS7 не имеет startDate / endDate.Сертификаты внутри это делают.Вы должны извлечь их сначала и спросить их о датах.Нечто подобное должно сработать:

STACK_OF(X509) *certs = NULL;

// find out where the certs stack is located
int nid = OBJ_obj2nid(p7->type);
if(nid == NID_pkcs7_signed) {
    certs = p7->d.sign->cert;
} else if(nid == NID_pkcs7_signedAndEnveloped) {
    certs = p7->d.signed_and_enveloped->cert;
}

// go over all the certs in the chain (you can skip this and look only at the first 
// certificate if you don't care for the root CA's certificate expiration date)
for (int i = 0; certs && i < sk_X509_num(certs); i++)  {
    X509 *cert = sk_X509_value(certs, i);
    const ASN1_TIME *start = X509_get0_notBefore(cert);
    const ASN1_TIME *end = X509_get0_notAfter(cert);
    // do whatever you will with the dates
}
0 голосов
/ 23 сентября 2019

Дата начала и окончания указаны для сертификата X.509, который вы уже извлекли ранее из структуры PKCS # 7.Таким образом, вы должны сделать то же самое, что и для вашей командной строки:

  1. извлечь сертификат;
  2. получить период действия путем получения даты начала / срока действия .

PKCS # 7 - это формат контейнера, который может просто включать сертификаты.Однако PKCS # 7 не является сертификатом, так же как и файл cookie не является файлом cookie, даже если он содержит только один файл cookie.Так что название вашего контейнера, target.cert, выбрано очень неудачно и, кажется, неправильно подходит даже вам.Обычно мы используем расширение .p7 или .pkcs7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...