Я пишу простой код сервера sSL на C, используя библиотеку OpenSSL.Я использую файл PEM с закрытым ключом RSA вместе с файлом PEM сертификата в качестве входных параметров.Вот как я это делаю:
EVP_PKEY *pkey= NULL;
pkey = EVP_PKEY_new();
if(EVP_PKEY_set1_RSA(pkey, pkey_RSA) == 0){
printf("RSA_set1_key failed, error 0x%lx\n", ERR_get_error());
const char* error_string = ERR_error_string(ERR_get_error(), NULL);
printf("RSA_set1_key returns %s\n", error_string);
}
printf("An RSA key Object created with modulus and exponent params\n");
EVP_PKEY_assign_RSA(pkey, pkey_RSA);
X509 *x509 = X509_new();
X509_set_version(x509, 2);
ASN1_INTEGER_set(X509_get_serialNumber(x509), 0);
X509_gmtime_adj(X509_get_notBefore(x509), 0);
X509_gmtime_adj(X509_get_notAfter(x509), (long)60*60*24*365);
X509_set_pubkey(x509, pkey);
X509_NAME *name = X509_get_subject_name(x509);
X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC,
(unsigned char *)"IN", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC,
(unsigned char *)"Company", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
(unsigned char *)"localhost", -1, -1, 0);
X509_set_issuer_name(x509, name);
if(X509_sign(x509, pkey, EVP_sha256()) == 0){
printf("X509_sign failed, error 0x%lx\n", ERR_get_error());
const char* error_string = ERR_error_string(ERR_get_error(), NULL);
printf("X509_sign returns %s\n", error_string);
}
SSL_CTX_use_certificate(ctx, x509);
SSL_CTX_use_PrivateKey(ctx, pkey);
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);
Этот код, по-видимому, выдает ошибку в X509_sign следующим образом:
X509_sign failed, error 0x6089095
X509_sign returns error:0D0DC006:asn1 encoding routines:ASN1_item_sign_ctx:EVP lib
Я не могу понять ошибку и продолжить.Пожалуйста, сообщите.
Спасибо!