OpenSSL Connect 失败

本文解析了643:error:140770FC错误,指出这通常与使用非HTTPS默认端口80有关,建议检查并更改为443端口以解决未知协议问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

643:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:585:

如果出现以上错误 可能是 端口使用的 80 而不是 HTTPS默认的443

<think>嗯,用户想了解OpenSSL中ssl_connect和SHA的用法或者相关问题解决。首先,我需要回忆一下ssl_connect函数的作用。它是用来建立SSL/TLS连接的,通常在客户端使用,连接到服务器。然后,SHA部分可能涉及到哈希算法,比如在证书验证或者握手过程中使用。 用户可能遇到了连接错误,比如证书验证失败,或者SHA算法不匹配的问题。需要检查SSL_CTX_set_verify函数是否正确设置,以及是否加载了正确的CA证书。另外,SHA的用法可能涉及到签名算法,比如在TLS握手时选择使用的哈希算法,比如SHA-256。可能需要查看OpenSSL的文档,确认如何指定密码套件,或者如何处理不支持的算法导致的错误。 另外,用户提供的引用中有提到CA证书的PEM文件路径,这可能与ssl_connect中的证书验证有关。如果证书链不完整,或者根证书不受信任,会导致连接失败。还有引用的第二个部分提到连接必须有效,URI和头部信息,可能涉及WebSocket,但用户的问题集中在SSL连接和SHA,可能需要更关注握手过程中的错误处理。 常见的错误比如SSL_ERROR_SYSCALL或SSL_ERROR_SSL,可能是网络问题或协议版本不匹配。需要建议用户检查日志,使用SSL_get_error获取详细错误信息。此外,SHA相关的问题可能出现在证书签名算法不支持,比如服务器使用SHA-1而客户端已禁用,导致握手失败。这时候需要调整SSL_CTX_set_ciphersuite来启用合适的算法。 还要考虑OpenSSL版本差异,比如1.1.1和3.0之间的API变化,是否使用了过时的函数。例如,TLS1.3的密码套件配置可能不同,需要正确设置。最后,提供示例代码会有帮助,展示如何正确初始化上下文,加载证书,建立连接,并处理错误。这样用户可以对照自己的代码进行检查。</think>### OpenSSL中ssl_connect与SHA的用法及常见问题解决 #### 一、`ssl_connect` 的基本用法 `ssl_connect` 是OpenSSL库中用于建立SSL/TLS连接的函数,通常用于客户端与服务器之间的安全通信。以下是基本流程: 1. **初始化SSL上下文** 使用 `SSL_CTX_new()` 创建上下文,并通过 `SSL_CTX_set_verify()` 设置证书验证模式[^1]: ```c SSL_CTX *ctx = SSL_CTX_new(TLS_client_method()); SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); SSL_CTX_load_verify_locations(ctx, "/path/to/ca_cert.pem", NULL); // 加载CA证书[^1] ``` 2. **创建SSL对象并绑定Socket** ```c SSL *ssl = SSL_new(ctx); int sockfd = socket(...); // 创建普通TCP Socket connect(sockfd, ...); // 连接到服务器 SSL_set_fd(ssl, sockfd); // 绑定Socket到SSL对象 ``` 3. **执行SSL握手** ```c int ret = SSL_connect(ssl); if (ret <= 0) { int err = SSL_get_error(ssl, ret); // 处理错误(见下文) } ``` --- #### 二、SHA在OpenSSL中的应用 SHA(安全哈希算法)在SSL/TLS中主要用于: 1. **证书签名验证** 服务器证书的签名通常使用SHA-256等算法,客户端需验证其有效性。 2. **握手消息完整性** TLS协议通过HMAC-SHA256等算法保证握手过程未被篡改。 3. **密钥派生** 密钥生成过程中使用SHA进行伪随机函数(PRF)计算。 --- #### 三、常见错误与解决方案 1. **证书验证失败(`SSL_ERROR_SSL`)** - **原因**:CA证书未正确加载或路径错误。 - **解决**:检查 `SSL_CTX_load_verify_locations` 的路径参数,或改用 `SSL_CTX_set_default_verify_paths()` 加载系统默认路径。 2. **协议/算法不兼容(`SSL_ERROR_SYSCALL`)** - **原因**:服务器与客户端支持的SSL/TLS版本或密码套件不匹配。 - **解决**:显式设置支持的协议和密码: ```c SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION); SSL_CTX_set_ciphersuites(ctx, "TLS_AES_256_GCM_SHA384"); // TLS 1.3 ``` 3. **SHA算法未找到** - **原因**:使用旧版OpenSSL(如1.0.2)时未启用SHA-256支持。 - **解决**:升级到OpenSSL 1.1.1+,或编译时启用 `enable-weak-ssl-ciphers`。 --- #### 四、代码示例 ```c #include <openssl/ssl.h> int main() { SSL_CTX *ctx = SSL_CTX_new(TLS_client_method()); SSL_CTX_load_verify_locations(ctx, "ca_certs.pem", NULL); SSL *ssl = SSL_new(ctx); int sockfd = socket(AF_INET, SOCK_STREAM, 0); // ...连接服务器... SSL_set_fd(ssl, sockfd); if (SSL_connect(ssl) != 1) { ERR_print_errors_fp(stderr); // 输出错误详情 } else { const unsigned char *hash = SSL_get_peer_signature(ssl); // 获取服务器证书签名使用的哈希算法(如SHA256) } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值