создание двух ключей с помощью команды
openssl genrsa -outprivate.key 1024
openssl rsa -inprivate.key -pubout -out public.key
чтение личного и открытого ключа с локального
EVP_PKEY *key = EVP_PKEY_new();
RSA *rsa = RSA_new();
FILE *fp;
if ((fp = fopen("private.key", "r")) == NULL)
error("private.key");
PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL);
if ((fp = fopen("public.key", "r")) == NULL)
error("public.key");
PEM_read_RSAPublicKey(fp, &rsa, NULL, NULL);
EVP_PKEY_assign_RSA(key,rsa);
, затем , я получаю сокет на удаленный сервер, используйте этот сокет для создания SSL-коннента успешно
ctx = SSL_CTX_new(SSLv23_client_method());
if (ctx == NULL)
SSL_Error("Fail to init ssl ctx!");
SSL *ssl = SSL_new(ctx);
if (ssl == NULL)
SSL_Error("Create ssl error");
if (SSL_set_fd(ssl, socket) != 1)
SSL_Error("Set fd error");
if (SSL_connect(ssl_to_server) < 0)
SSL_Error("Fail to connect server with ssl!");
использовать этот ssl создать поддельный сертификат также без ошибок
X509 *server_x509 = SSL_get_peer_certificate(ssl_to_server);
X509 *fake_x509 = X509_dup(server_x509);
if (server_x509 == NULL)
SSL_Error("Fail to get the certificate from server!");
X509_set_version(fake_x509, X509_get_version(server_x509));
ASN1_INTEGER *a = X509_get_serialNumber(fake_x509);
a->data[0] = a->data[0] + 1;
X509_NAME *issuer = X509_NAME_new();
X509_set_issuer_name(fake_x509, issuer);
X509_set_pubkey(fake_x509, key);
X509_sign(fake_x509, key, EVP_sha1());
затем использовать этот поддельный сертификат для локального сервера без ошибок
SSL_CTX *ctx;
ctx = SSL_CTX_new(SSLv23_server_method());
if (ctx == NULL)
SSL_Error("Fail to init ssl ctx!");
if (cert && key) {
if (SSL_CTX_use_certificate(ctx, cert) != 1)
SSL_Error("Certificate error");
if (SSL_CTX_use_PrivateKey(ctx, key) != 1)
SSL_Error("key error");
if (SSL_CTX_check_private_key(ctx) != 1)
SSL_Error("Private key does not match the certificate public key");
}
SSL *ssl = SSL_new(ctx);
if (ssl == NULL)
SSL_Error("Create ssl error");
if (SSL_set_fd(ssl, socket) != 1)
SSL_Error("Set fd error");
finally func SSL_accept всегда не удавалсяи вернуть ошибку
error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol