У меня есть конверт CMS с типом контента «signatureData».Как я могу получить доступ к информации сертификата подписавшего, такой как действительность, тема, издатель и т. Д.?
Учитывая тот факт, что
$>openssl cms -verify -signer foo.pem ...
записывает сертификат подписывающего лица) и я могу проанализировать требуемую информацию из foo.pem другими способами, я считаю, что она в принципе доступна. прочитайте в X509 и перейдите к необходимой информации.Однако мне не нужно делать проверку подписи для получения отдельного объекта X509, который я могу затем проанализировать для получения необходимой информации сертификата.
Я могу извлечь другие данные из CMS, такие какатрибут signatureTime:
BIO *in = NULL;
CMS_ContentInfo *cms = NULL;
STACK_OF(CMS_SignerInfo) *ssi = NULL;
CMS_SignerInfo *si = NULL;
int ret = 1;
in = BIO_new_file(argv[1], "r");
if (!in)
goto err;
// cms = PEM_read_bio_CMS(in, NULL, NULL, NULL); //PEM
cms = d2i_CMS_bio(in, NULL); //DER
if (!cms)
goto err;
ssi = CMS_get0_SignerInfos(cms);
if (!ssi)
goto err;
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);
ASN1_TYPE *at = sk_ASN1_TYPE_value(xa->value.set, 0);
printTime("signing time", at); //just a fancy reformat
//...
}
Следуя вышеприведенному CLI, я попытался получить доступ к члену CMS_SignerInfo 'signer', так как он имеет тип X509 (поместите его вместо "//..."):
X509 *c = si->signer;
Однако c всегда будет 0x0.
Я также пытался получить доступ к X509 напрямую из CMS_ContentInfo, например:
STACK_OF(X509) *sc = NULL;
sc = CMS_get0_signers(cms);
if (!sc)
continue;
int iscmax = sk_X509_num(sc);
for (int isc = 0; isc < iscmax; ++isc) {
X509 *c = NULL;
c = sk_X509_value(sc, isc);
}
Но STACK_OF (X509) будеттакже будет 0x0 и его число iscmax 0.
Как я могу получить доступ к X509, оттуда к X509_CINF и оттуда к фактическим данным, которые мне нужны (edit :) без необходимостисначала проверьте подпись, чтобы получить отдельный объект X509 ?
В качестве альтернативы, информация скрыта в другом месте в дереве объектов?