2009-02-04 8 views
7

Pracuję z klasą certyfikatów X509 biblioteki OpenSSL i muszę zapytać o rozszerzenie "użycia kluczy".Wyszukanie rozszerzeń na certyfikatach X509 przy użyciu OpenSSL

Po porzuceniu OpenSSL vaporware "Dokumentacja", niektóre strzał-in-the-dark przeszukiwania stron internetowych w końcu ujawniła, że ​​muszę zadzwonić

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

i przeszukując objects.h nagłówku ujawnił prawidłowego NID.

Problem polega na tym, że to wywołanie zwraca wskaźnik do unieważnienia, co najwyraźniej może wskazywać na różne struktury w zależności od tego, do jakiego rozszerzenia się zwrócono.

Ponieważ żaden z nich nie wydaje się być udokumentowany, pozostawia się bez możliwości ustalenia, jak przeanalizować, co funkcja zwraca.

Czy ktoś może wskazać mi dokument, który rzeczywiście mówi o tym, zamiast tylko wymieniać rzeczy, które sam mogę znaleźć (profil funkcji, który plik pochodzi, itp.)?

+1

Nie mam odpowiedzi, ale będę 2-gi sentyment na temat jakości dokumentacji dla OpenSSL ... Pracuję z nim teraz (dopiero zaczynam), a to jest okropne, próbując znaleźć przykłady lub dokumenty dla czegoś poza prostymi operacjami ... Czuję twój ból. – Nick

+1

Jedyny sposób, w jaki zorientowałem się, jak korzystać z API, to skorzystanie z narzędzia linii poleceń (źródło), zhackowanie kodu (skomentuj parametry linii poleceń, których nie potrzebowałem) i prześledzenie. Stamtąd udało mi się wykorzystać "dokumenty" API, aby wypełnić luki. – Joe

Odpowiedz

5

Najprostsze rozwiązania do przeczytania użycia klucza wydaje się być

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; 

Uzyskane wartości są zdefiniowane w 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 

doszedłem do tego soultion poprzez znalezienie następujący kod pliku źródłowego 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); 
} 
+0

Moje 'x509.h' zawiera ostrzeżenie:'/* Zawiera kopie różnych wartości rozszerzeń */'dla wielu elementów w strukturze X509, w tym' ex_kumowanie'. Prawdopodobnie dlatego jest zero, dopóki nie wywołasz tej funkcji. – chacham15

+0

musisz sprawdzić wartość 'ex_flags' jeśli ma' EXFLAG_SET' co oznacza, że ​​'ex_kasaż' i' ex_xkasaż' są ustawione i nie musisz wywoływać 'X509_check_ca', możesz sprawdzić' v3_purp.c' po więcej szczegółów – bikram990

Powiązane problemy