Запрос расширений в сертификатах X509 с использованием OpenSSL - PullRequest
8 голосов
/ 05 февраля 2009

Я работаю с классом сертификатов X509 библиотеки OpenSSL, и мне нужно запросить расширение «использование ключа».

После отказа от "документации" OpenSSL о пароварке, в результате поиска по сети в темноте выяснилось, что мне нужно позвонить

X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx) 

и поиск в заголовке objects.h показал правильный NID.

Проблема в том, что этот вызов возвращает указатель на void, который, очевидно, может указывать на различные структуры в зависимости от того, какое расширение было запрошено.

Поскольку ни один из них, похоже, не задокументирован, остается без способа выяснить, как разобрать, что возвращает функция.

Может ли кто-нибудь указать мне документ, который на самом деле говорит об этом, вместо того, чтобы просто перечислять то, что я могу найти для себя (профиль функции, из какого файла он поступает и т. Д.)?

Ответы [ 2 ]

5 голосов
/ 16 сентября 2010

Кажется, простейшим решением для чтения использования ключа является

X509* x509_cert = ...
// without X509_check_ca x509_cert->ex_kusage always returns 0 (no idea why)
int ca = X509_check_ca(x509_cert);
unsigned long usage = x509_cert->ex_kusage;

Полученные значения определены в opensc / pkcs15-init.h

SC_PKCS15INIT_X509_DIGITAL_SIGNATURE     0x0080UL
SC_PKCS15INIT_X509_NON_REPUDIATION       0x0040UL
SC_PKCS15INIT_X509_KEY_ENCIPHERMENT      0x0020UL
SC_PKCS15INIT_X509_DATA_ENCIPHERMENT     0x0010UL
SC_PKCS15INIT_X509_KEY_AGREEMENT         0x0008UL
SC_PKCS15INIT_X509_KEY_CERT_SIGN         0x0004UL
SC_PKCS15INIT_X509_CRL_SIGN              0x0002UL

Я пришел к этой мысли, найдя следующий код исходного файла openssl

/* Handle key usage */
if((usage=X509_get_ext_d2i(x, NID_key_usage, NULL, NULL))) {
    if(usage->length > 0) {
        x->ex_kusage = usage->data[0];
        if(usage->length > 1) 
        x->ex_kusage |= usage->data[1] << 8;
    } else x->ex_kusage = 0;
    x->ex_flags |= EXFLAG_KUSAGE;
    ASN1_BIT_STRING_free(usage);
}
1 голос
/ 05 февраля 2009

Второй параметр (nid) определяет возвращаемый тип.

Глядя на этот код:

http://opengrok.creo.hu/dragonfly/xref/src/crypto/openssl-0.9/crypto/x509v3/v3_purp.c#X509_check_purpose

Похоже, что для NID использования ключа он возвращает ASN1_BIT_STRING. (строка 361).

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