Облазил уже "весь Интернет"™ - хоть убей не могу найти пример https клиента на "чистом" lib OpenSSL на c(++) через http(s?) прокси.
Как я понимаю сначала идет connect на сам прокси (без SSL?), затем ему отсылается "CONNECT realhost.com:443" и уже на него с SSL. Так? Есть ли http прокси, которые умеют шифровать трафик до них? Или это не нужно?
Потому как:
> curl https://ipinfo.io/ -v -x http://54.37.130.2:3128
<показывает ip>
> curl https://ipinfo.io/ -v -x https://54.37.130.2:3128
* OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection
Схематически у меня так:
SSL_library_init();
OPENSSL_init_ssl(0, NULL);
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
ERR_load_crypto_strings();
ERR_load_BIO_strings();
SSL_CTX* ctx = SSL_CTX_new(SSLv23_method());
SSL_CTX_set_options(ctx, SSL_OP_ALL);
SSL* ssl;
BIO* bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(bio, proxy_ip);
BIO_set_conn_port(bio, proxy_port);
SSL_set_tlsext_host_name(ssl, (void*)proxy_ip)); // надо ли?
BIO_do_connect(bio); // <--------------- error 0 ибо прокси, как я понимаю, ждёт plain, а не ssl
char buffer = "CONNECT realhost.com:443 HTTP/1.1\r\nProxy-Connection: Keep-Alive\r\n\r\n");
BIO_write(bio, buffer, strlen(buffer));
// <--------- что дальше?
Если вместо proxy_ip поставить "realhost.com", а вместо proxy_port "443", то всё работает (т.е. напрямую без прокси).