Sockets 关于SSL_connect和HTTPS的查询

Sockets 关于SSL_connect和HTTPS的查询,sockets,https,openssl,network-programming,http-proxy,Sockets,Https,Openssl,Network Programming,Http Proxy,我想通过代理服务器发送HTTPS请求,并获取站点登录页的HTML。套接字创建进行得很顺利,但当我想与服务器建立SSL连接时,它给了我一个“中止(内核转储)”错误。我已将原因缩小到SSL\u connect函数。当我尝试在没有代理服务器的情况下做同样的事情时(使用struct addrinfo而不是struct sockaddr,因为我需要进行DNS查询来获取IP),它工作得非常好,我能够获得有效的HTTP响应以及HTML。有人能帮我吗 SSL_library_init();

我想通过代理服务器发送HTTPS请求,并获取站点登录页的HTML。套接字创建进行得很顺利,但当我想与服务器建立SSL连接时,它给了我一个“中止(内核转储)”错误。我已将原因缩小到SSL\u connect函数。当我尝试在没有代理服务器的情况下做同样的事情时(使用struct addrinfo而不是struct sockaddr,因为我需要进行DNS查询来获取IP),它工作得非常好,我能够获得有效的HTTP响应以及HTML。有人能帮我吗

        SSL_library_init();
        SSL_load_error_strings();
        ssl_ctx = SSL_CTX_new(SSLv23_client_method ());

        int sockfd2 = socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in httpsProxy; 
    
        httpsProxy.sin_family = AF_INET;
        httpsProxy.sin_addr.s_addr = inet_addr("<insert IP>");
        httpsProxy.sin_port = htons(13128);
        connect(sockfd2,(struct sockaddr *)&httpsProxy,sizeof(httpsProxy));
    
        SSL *conn = SSL_new(ssl_ctx);
        SSL_set_fd(conn, sockfd2);
        int err = SSL_connect(conn);
SSL_库_init();
SSL_加载_错误_字符串();
ssl_ctx=ssl_ctx_new(SSLv23_client_method());
int sockfd2=套接字(AF_INET,SOCK_STREAM,0);
httpsProxy中的结构sockaddr_;
httpsProxy.sin_family=AF_INET;
httpsProxy.sin_addr.s_addr=inet_addr(“”);
httpsProxy.sin_端口=htons(13128);
连接(sockfd2,(struct sockaddr*)和httpsProxy,sizeof(httpsProxy));
SSL*conn=SSL\u new(SSL\u ctx);
SSL_set_fd(连接,sockfd2);
int err=SSL_连接(连接);

您需要连接到代理并请求它连接到目标HTTPS服务器,在与代理通信时不使用SSL/TLS,并且只有在成功的情况下,在与HTTPS服务器通信后,才通过
SSL\u connect()
执行SSL/TLS握手,不再与代理通信

SSL_library_init();
SSL_load_error_strings();

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in httpsProxy = {};
httpsProxy.sin_family = AF_INET;
httpsProxy.sin_addr.s_addr = inet_addr("<proxy IP>");
httpsProxy.sin_port = htons(13128);

// connect to proxy...
if (connect(sockfd, (struct sockaddr *)&httpsProxy, sizeof(httpsProxy)) < 0)
{
    ...
    close(sockfd);
    return;
}

// ask proxy to connect to target HTTPS server...
if (!<connect proxy to HTTPS server>)
{
    ...
    close(sockfd);
    return;
}

// NOW start SSL/TLS with HTTPS server...
ssl_ctx = SSL_CTX_new(SSLv23_client_method ());
SSL *conn = SSL_new(ssl_ctx);
SSL_set_fd(conn, sockfd);
int err = SSL_connect(conn);
...
SSL_库_init();
SSL_加载_错误_字符串();
int sockfd=套接字(AF_INET,SOCK_STREAM,0);
httpsProxy={}中的结构sockaddr_;
httpsProxy.sin_family=AF_INET;
httpsProxy.sin_addr.s_addr=inet_addr(“”);
httpsProxy.sin_端口=htons(13128);
//连接到代理服务器。。。
if(connect(sockfd,(struct sockaddr*)&httpsProxy,sizeof(httpsProxy))<0)
{
...
关闭(sockfd);
返回;
}
//请代理连接到目标HTTPS服务器。。。
如果(!)
{
...
关闭(sockfd);
返回;
}
//现在使用HTTPS服务器启动SSL/TLS。。。
ssl_ctx=ssl_ctx_new(SSLv23_client_method());
SSL*conn=SSL\u new(SSL\u ctx);
SSL设置fd(连接,插座fd);
int err=SSL_连接(连接);
...

我的任务包括专门处理来自代理服务器的HTTPS请求的HTTP重定向(分配的一部分)。我能够通过代理服务器获得仍然在HTTP上的站点的HTML,没有问题。根据HTTP响应的状态代码(本例中为30x),我创建了一个新套接字,并使用SSL层进行封装,并向代理服务器发送HTTPS请求。我不允许直接请求目标站点的web服务器。那么,有没有其他方法可以做到这一点,或者我没有抓住要点?非常感谢much@SilentGuardian你到底在用什么样的代理?HTTP代理?袜子代理?请说得更具体些。这对你如何处理这个问题有很大的影响。但通过代理向HTTPS服务器发送请求的安全方式是我在回答中所描述的。HTTP重定向将告诉您需要在何处指示代理在新连接上连接。我正在使用HTTP代理,并且理解您刚才解释的内容。问题解决了。多谢各位