Добрый день всем. В этом суть моей проблемы: вы должны заменить сертификат при его отправке с сервера клиенту. А затем, когда клиент примет сертификат сервера, замените его снова. Сертификаты клиента и сервера самозаверяющие. Замените эти сертификаты подписанным. Это необходимо для того, чтобы при прослушивании трафика c в середине было видно, что соединение установлено с использованием сертифицированного сертификата. Структуру сертификата X509 в источниках я не нашел, поэтому делаю иначе: использую функцию, которая конвертирует сертификат формата .pem в сертификат формата X509. После этого я сделал переменную типа X509 и прочитал там свой фальшивый сертификат, после чего записал свой сертификат в пакет. Я создаю пару из самозаверяющего сертификата и ключа openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 –nodes
, запускаю сервер openssl s_server -key key.pem -cert cert.pem -accept 443 –tls1
и подключаюсь к нему с помощью клиента openssl s_client localhost:443
. Это то, что я вижу в wirehark. Как я могу заставить клиента видеть подписанный сертификат.
X509* PEM_to_509(char *f) {
X509* cert = NULL;
BIO* bio = NULL;
if (NULL == f) {
return NULL;
}
bio = BIO_new_mem_buf(f, strlen(f));
if (NULL == bio) {
return NULL;
}
cert = PEM_read_bio_X509(bio, NULL, NULL, NULL);
BIO_free(bio);
return cert;
X509 *fake_cert;
long fake_cert_pem_size;
char *fake_cert_pem;
FILE* fake_cert_pem_file;
fake_cert_pem_file = fopen("/cert.pem", "r");
fseek(fake_cert_pem_file, 0, SEEK_END);
fake_cert_pem_size = ftell(fake_cert_pem_file);
fseek(fake_cert_pem_file, 0, SEEK_SET);
fake_cert_pem = malloc(fake_cert_pem_size + 1);
fread(fake_cert_pem, 1, fake_cert_pem_size, fake_cert_pem_file);
fake_cert_pem[fake_cert_pem_size] = 0;
fclose(fake_cert_pem_file);
fake_cert = PEM_to_509(fake_cert_pem);
free(fake_cert_pem);
if(!ssl_add_cert_to_wpacket(s, pkt, fake_cert, 0))
{
X509_STORE_CTX_free(xs_ctx);
return 0;
}
X509_STORE_CTX_free(xs_ctx);
[1]: https://i.stack.imgur.com/TjnLc.png