2016-05-05 19 views
2

Ich habe ein Problem und keine Ahnung, wie ich es lösen kann. Ich habe ein X.509v3-Zertifikat mit einer benutzerdefinierten OID (Objekt-ID) in der ExtendedKeyUsage-Erweiterung. Wie kann ich alle OIDs aus dem ExtendedKeyUsage mit OpenSSL 1.1.0 extrahieren?So extrahieren Sie alle OIDs aus dem Zertifikat mit OpenSSL

Zum Beispiel habe ich ein Zertifikat mit 3-Flags in der Erweiterung extendedKeyUsage:

"clientAuth, 1.3.6.1.5.5.7.3.103, timeStamping" 

clientAuth und timeStamping für OpenSSL bekannt. Die Flagge in der Mitte ist meine benutzerdefinierte OID. Ich habe alle Flags mit der OpenSSL-Funktion X509V3_EXT_conf_nid() hinzugefügt. ok ... so weit wie alles funktioniert.

Jetzt habe ich versucht, die OIDs mit X509_get_extended_key_usage(cert) zu extrahieren, aber ich bekomme nur clientAuth und timeStamping.

Nun extrahiert ich die Rohdaten aus ExtendedKeyUsage als ASN1_OCTET_STRING wie folgt aus:

int size; 
unsigned char *data; 
ASN1_OCTET_STRING *os; 
X509_EXTENSION *ext; 

// extracting data from certificate extension 
ext = X509_get_ext(cert, 2); 
os = X509_EXTENSION_get_data(ext); 

size = ASN1_STRING_length(os); 
data = ASN1_STRING_data(os); 

Dies ist der Inhalt von data in hex: 30:1E:06:08:2B:06:01:05:05:07:03:02:06:08:2B:06:01:05:05:07:03:67:06:08:2B:06:01:05:05:07:03:08.

Wenn ich diese Hex-String mit einem externen Tool dekodieren, ich dies dann bekommen:

Offset|Length|LenByte| 
======+======+=================================================== 
    0| 30|  1| SEQUENCE : 
    2|  8|  1|  OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.2' (id-kp-clientAuth) 
    12|  8|  1|  OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.103' 
    22|  8|  1|  OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.8' (id-kp-timeStamping) 

Meine OID zur Verfügung steht, aber wie ich extrahieren diese OID in OpenSSL? Kann ich es analysieren ... und wie? . :(

Vielen Dank im Voraus

+0

Haben Sie versucht, 'openssl asn1parse -i -in cert.der -inform der' zu verwenden? – oliv

Antwort

4

finde ich eine Lösung

hier ist mein schneller und diry Code:

// optional: we can set an OID name 
OBJ_create("1.3.6.1.5.5.7.3.103", "myObjectShortName", "myObjectLongName"); 

// find the extendedKeyUsage 
int extIndex = X509_get_ext_by_NID(cert, NID_ext_key_usage, -1); 
if (extIndex < 0) 
    std::cerr << "extendedKeyUsage is not present"; 

// get the correct X.509 extension 
X509_EXTENSION *ext = X509_get_ext(cert, extIndex); 
if (!ext) 
    std::cerr << "'ext' is a nullptr"; 

// get the extendedKeyUsage 
EXTENDED_KEY_USAGE *eku = static_cast<EXTENDED_KEY_USAGE*>(X509V3_EXT_d2i(ext)); 
if (!eku) 
    std::cerr << "'eku' is a nullptr"; 

// print all OIDs 
for (int i = 0; i < sk_ASN1_OBJECT_num(eku); i++) 
{ 
    char buffer[100]; 
    OBJ_obj2txt(buffer, sizeof(buffer), sk_ASN1_OBJECT_value(eku, i), 1); // get OID 

    std::cout << "eku flag " << i << ": " << buffer << "\t - "; 
    std::cout << OBJ_nid2ln(OBJ_obj2nid(sk_ASN1_OBJECT_value(eku, i))) << std::endl; // get OID name 
} 

// free used resource 
if (eku) 
    EXTENDED_KEY_USAGE_free(eku); 

Ausgang:

eku flag 0: 1.3.6.1.5.5.7.3.2 - TLS Web Client Authentication 
eku flag 1: 1.3.6.1.5.5.7.3.103 - myObjectLongName 
eku flag 2: 1.3.6.1.5.5.7.3.8 - Time Stamping 

vielleicht hilft dieser Code jemand anderem