Come generare CSR (Certificate Signing Request) utilizzando C ++ e openssl [closed]

0

Sono nuovo di openssl. Sto cercando di implementare il programma per generare CSR usando openssl e c ++. Devo implementare i seguenti comandi usando C ++.

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

Ho provato un codice di esempio dal tutorial link

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); 
 }

È in grado di creare il file x509Req.pem, ma quando lo apro in linux con file aperto, mostra l'errore "Impossibile visualizzare 'x509Req.pem' Motivo: dati non riconosciuti o non supportati." Qualcuno potrebbe dirmi come risolvere questo errore o altri tutorial per generare CSR usando c ++ e openssl.

Grazie in anticipo.

    
posta Kumar 29.04.2018 - 14:53
fonte

1 risposta

0

Se confronti l'output di openssl req -in yourcsr.pem -text con CSR creato dai soliti comandi openssl che troverai, la versione viene mostrata come 1 nel tuo CSR mentre 0 nel solito CSR:

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

Questo è dovuto al seguente codice:

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

Guardando la pagina di Wikipedia per CSR troverai che:

The first part, ASN.1 type CertificationRequestInfo, consists of a version number (which is 0 for all known versions, 1.0, 1.5, and 1.7 of the specifications)

La modifica del codice per impostare nVersion=0 comporterà una corretta CSR che può anche essere aperta con successo dal visualizzatore che utilizzi. Sembra che il visualizzatore sia un'applicazione che cerca di aderire alle specifiche mentre altri programmi di lettura CSR semplicemente ignorano il numero di versione poiché non fornisce alcuna informazione necessaria (dovrebbe essere 0 in tutti i casi).

    
risposta data 29.04.2018 - 17:19
fonte

Leggi altre domande sui tag