Cómo generar CSR (Solicitud de firma de certificado) utilizando C ++ y openssl [cerrado]

0

Soy nuevo en openssl. Estoy tratando de implementar el programa para generar CSR usando openssl y c ++. Necesito implementar los siguientes comandos usando C ++.

openssl req -new -newkey rsa: 1024 -nodes -keyout key.pem -out x509Req.pem.

He probado un código de ejemplo del tutorial enlace

bool gen_X509Req()
{
int             ret = 0;
RSA             *r = NULL;
BIGNUM          *bne = NULL;

int             nVersion = 1;
int             bits = 2048;
unsigned long   e = RSA_F4;

X509_REQ        *x509_req = NULL;
X509_NAME       *x509_name = NULL;
EVP_PKEY        *pKey = NULL;
RSA             *tem = NULL;
BIO             *out = NULL, *bio_err = NULL;

const char      *szCountry = "CA";
const char      *szProvince = "BC";
const char      *szCity = "Vancouver";
const char      *szOrganization = "Dynamsoft";
const char      *szCommon = "localhost";

const char      *szPath = "x509Req.pem";

// 1. generate rsa key
bne = BN_new();
ret = BN_set_word(bne,e);
if(ret != 1){
    goto free_all;
}

r = RSA_new();
ret = RSA_generate_key_ex(r, bits, bne, NULL);
if(ret != 1){
    goto free_all;
}

// 2. set version of x509 req
x509_req = X509_REQ_new();
ret = X509_REQ_set_version(x509_req, nVersion);
if (ret != 1){
    goto free_all;
}

// 3. set subject of x509 req
x509_name = X509_REQ_get_subject_name(x509_req);

ret = X509_NAME_add_entry_by_txt(x509_name,"C", MBSTRING_ASC, (const unsigned char*)szCountry, -1, -1, 0);
if (ret != 1){
    goto free_all;
}

ret = X509_NAME_add_entry_by_txt(x509_name,"ST", MBSTRING_ASC, (const unsigned char*)szProvince, -1, -1, 0);
if (ret != 1){
    goto free_all;
}

ret = X509_NAME_add_entry_by_txt(x509_name,"L", MBSTRING_ASC, (const unsigned char*)szCity, -1, -1, 0);
if (ret != 1){
    goto free_all;
}   

ret = X509_NAME_add_entry_by_txt(x509_name,"O", MBSTRING_ASC, (const unsigned char*)szOrganization, -1, -1, 0);
if (ret != 1){
    goto free_all;
}

ret = X509_NAME_add_entry_by_txt(x509_name,"CN", MBSTRING_ASC, (const unsigned char*)szCommon, -1, -1, 0);
if (ret != 1){
    goto free_all;
}

// 4. set public key of x509 req
pKey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pKey, r);
r = NULL;   // will be free rsa when EVP_PKEY_free(pKey)

ret = X509_REQ_set_pubkey(x509_req, pKey);
if (ret != 1){
    goto free_all;
}

// 5. set sign key of x509 req
ret = X509_REQ_sign(x509_req, pKey, EVP_sha1());    // return x509_req->signature->length
if (ret <= 0){
    goto free_all;
}

out = BIO_new_file(szPath,"w");
ret = PEM_write_bio_X509_REQ(out, x509_req);

// 6. free
 free_all:
X509_REQ_free(x509_req);
BIO_free_all(out);

EVP_PKEY_free(pKey);
BN_free(bne);

return (ret == 1); 
 }

Puede crear el archivo x509Req.pem, pero cuando lo abro en Linux con el archivo abierto, aparece el error "No se pudo mostrar 'x509Req.pem' Motivo: datos no reconocidos o no compatibles". ¿Podría alguien por favor decirme cómo resolver este error o cualquier otro tutorial? para generar CSR usando c ++ y openssl.

Gracias de antemano.

    
pregunta Kumar 29.04.2018 - 14:53
fuente

1 respuesta

0

Si compara la salida de openssl req -in yourcsr.pem -text con la CSR creada por los comandos habituales de openssl que encontrará, la versión se muestra como 1 en su CSR mientras que 0 en la CSR habitual:

Certificate Request:
    Data:
        Version: 1 (0x1)

Esto se debe al siguiente código:

int             nVersion = 1;
...
ret = X509_REQ_set_version(x509_req, nVersion);

Mirando la página de Wikipedia para CSR encontrará que:

  

La primera parte, ASN.1 tipo CertificationRequestInfo, consiste en un número de versión ( que es 0 para todas las versiones conocidas , 1.0, 1.5 y 1.7 de las especificaciones)

La modificación de su código para establecer nVersion=0 resultará en una CSR adecuada que también puede abrir con éxito el espectador que utilice. Parece que el visor es una aplicación que intenta cumplir con la especificación, mientras que otros programas de lectura de CSR simplemente ignoran el número de versión, ya que no proporciona la información necesaria (debería ser 0 en todos los casos).

    
respondido por el Steffen Ullrich 29.04.2018 - 17:19
fuente

Lea otras preguntas en las etiquetas