2010-05-21 14 views
5

Cómo agrego estas secciones a un certificado (estoy compilando manualmente usando C++).El certificado OpenSSL carece de identificadores de clave

X509v3 Subject Key Identifier: 
     A4:F7:38:55:8D:35:1E:1D:4D:66:55:54:A5:BE:80:25:4A:F0:68:D0 
    X509v3 Authority Key Identifier: 
     keyid:A4:F7:38:55:8D:35:1E:1D:4D:66:55:54:A5:BE:80:25:4A:F0:68:D0 

Curently mi código construye sertificate bien, a excepción de aquellas claves ..:/

static X509 * GenerateSigningCertificate(EVP_PKEY* pKey) 
{ 
    X509 *x; 
    x = X509_new(); //create x509 certificate 

    X509_set_version(x, NID_X509); 
    ASN1_INTEGER_set(X509_get_serialNumber(x), 0x00000000); //set serial number 
    X509_gmtime_adj(X509_get_notBefore(x), 0); 
    X509_gmtime_adj(X509_get_notAfter(x),(long)60*60*24*365); //1 year 
    X509_set_pubkey(x, pKey); //set pub key from just generated rsa 

    X509_NAME *name; 

    name = X509_get_subject_name(x); 

    NAME_StringField(name, "C", "LV"); 
    NAME_StringField(name, "CN", "Point"); //common name 
    NAME_StringField(name, "O", "Point"); //organization 

    X509_set_subject_name(x, name); //save name fields to certificate 
    X509_set_issuer_name(x, name); //save name fields to certificate 

    X509_EXTENSION *ex; 
    ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_cert_type, "server"); 
    X509_add_ext(x,ex,-1); 
    X509_EXTENSION_free(ex); 

    ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_comment, "example comment extension"); 
    X509_add_ext(x, ex, -1); 
    X509_EXTENSION_free(ex); 

    ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_ssl_server_name, "www.lol.lv"); 

    X509_add_ext(x, ex, -1); 
    X509_EXTENSION_free(ex); 

    ex = X509V3_EXT_conf_nid(NULL, NULL, NID_basic_constraints, "critical,CA:TRUE"); 
    X509_add_ext(x, ex, -1); 
    X509_EXTENSION_free(ex); 

    X509_sign(x, pKey, EVP_sha1()); //sign x509 certificate 
    return x; 
} 
+0

FYI: cualquiera que busque en esto como código de ejemplo, esta llamada "X509_set_version (x, NID_X509);" es incorrecto, debería ser "X509_set_version (x, 2);" – Wheezil

Respuesta

9

solución encontrado - añadir estas líneas de código

ex = X509V3_EXT_conf_nid(NULL, NULL, NID_subject_key_identifier, "hash"); 
X509_add_ext(x, ex, -1); 
X509_EXTENSION_free(ex); 

ex = X509V3_EXT_conf_nid(NULL, NULL, NID_authority_key_identifier, "keyid:always"); 
X509_add_ext(x, ex, -1); 
X509_EXTENSION_free(ex); 
+0

Sólo para completar: esta función no es parte de la API de OpenSSL, proviene de una [muestra de OpenSSL] (https://www.codeblog.org/viewsrc/openssl-fips-1.1.1/demos/x509/mkcert .do). – ereOn

+0

@ereOn reescribió el código sin la dependencia :) – chacham15

+0

Eso es extraño. No pude obtener un código similar ('.../demos/mkcert.c') para que funcione correctamente. Obtuve un NULL 'X509_EXTENSION' de' X509V3_EXT_conf_nid', con el error "0x22073072" ("Rutinas X509 V3: S2I_SKEY_ID: sin clave pública") cuando intento agregar el SKI. Y sí, la clave pública se estableció anteriormente a través de 'X509_set_pubkey'). – jww

Cuestiones relacionadas