SSL_set_tlsext_host_name(ssl, hostname); BIO_set_conn_hostname(bio, hostname); if (BIO_do_connect(bio) <= 0) { printf("Cannot connect with SSL"); free(hostname); BIO_free_all(bio); SSL_shutdown(ssl); close(sockfd); return -1; } 提示连接不上ssl
时间: 2024-04-28 14:25:56 浏览: 126
这段代码中,您需要检查以下几点:
1. 检查 hostname 是否正确,确保它能够被解析到正确的 IP 地址。
2. 检查 sockfd 是否正确,确保它是一个有效的套接字。
3. 检查 SSL 的初始化是否正确,确保已经正确地加载了证书和私钥。
4. 检查网络连接是否正常,确保您的网络环境稳定,能够正常连接服务器。
如果以上几点都没有问题,您可以通过打印出错误信息来查看具体的错误原因,以便进一步排查问题。
相关问题
下面的代码 参数证书路径 对应的证书需要是什么格式的 #include <openssl/ssl.h> #include <openssl/bio.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int https_request(const char* cert_file, const char* payload) { SSL_CTX* ctx = NULL; SSL* ssl = NULL; BIO* bio = NULL; int ret = -1; SSL_library_init(); ctx = SSL_CTX_new(SSLv23_client_method()); if(!ctx) { fprintf(stderr, "SSL_CTX_new failed!\n"); goto END; } if(SSL_CTX_load_verify_locations(ctx, cert_file, NULL) <= 0) { fprintf(stderr, "SSL_CTX_load_verify_locations failed!\n"); goto END; } if(SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr, "SSL_CTX_use_certificate_file failed!\n"); goto END; } if(SSL_CTX_use_PrivateKey_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr, "SSL_CTX_use_PrivateKey_file failed!\n"); goto END; } bio = BIO_new_ssl_connect(ctx); if(!bio) { fprintf(stderr, "BIO_new_ssl_connect failed!\n"); goto END; } if(BIO_set_conn_hostname(bio, "www.example.com:https") <= 0) { fprintf(stderr, "BIO_set_conn_hostname failed!\n"); goto END; } BIO_get_ssl(bio, &ssl); if(!ssl) { fprintf(stderr, "BIO_get_ssl failed!\n"); goto END; } SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); if(BIO_do_connect(bio) <= 0) { fprintf(stderr, "BIO_do_connect failed!\n"); goto END; } if(SSL_get_verify_result(ssl) != X509_V_OK) { fprintf(stderr, "SSL_get_verify_result error!\n"); goto END; } if(BIO_write(bio, payload, strlen(payload)) <= 0) { fprintf(stderr, "BIO_write failed!\n"); goto END; } char buf[1024] = {0}; int n = 0; while((n = BIO_read(bio, buf, sizeof(buf))) > 0) { fwrite(buf, 1, n, stdout); } ret = 0; END: if(bio) { BIO_free_all(bio); } if(ctx) { SSL_CTX_free(ctx); } return ret; }
该代码中的参数证书路径对应的证书需要是 PEM 格式的。其中 SSL_CTX_use_certificate_file 和 SSL_CTX_use_PrivateKey_file 函数加载的证书也需要是 PEM 格式的。在 SSL_CTX_load_verify_locations 函数中,如果第二个参数为 NULL,则使用系统默认的证书库。如果需要使用自定义的证书库,则可以通过第二个参数指定证书库的路径。
ValueError: check_hostname需要server_hostname
这个错误通常是由于使用了一个过时的Python版本或urllib版本引起的。在Python 2.x中,`HTTPSConnection`类的`check_hostname`参数默认为`True`,而在Python 3.x中默认为`False`。如果使用了一个过时的Python版本或urllib版本,并且没有显式指定`server_hostname`参数,则可能会出现这个错误。
解决这个问题的方法是在创建`HTTPSConnection`对象时显式指定`server_hostname`参数。例如,可以将代码中的:
```python
conn = http.client.HTTPSConnection(host)
```
修改为:
```python
conn = http.client.HTTPSConnection(host, timeout=10, context=ssl.create_default_context(), server_hostname=host)
```
这里将`server_hostname`参数设置为了`host`,即连接的主机名,这样就能够解决`check_hostname`参数缺失的问题。
如果仍然出现这个错误,可能是由于使用的Python或urllib版本过于老旧。建议升级到最新版本的Python和urllib库,以确保不会出现这样的问题。
阅读全文