问题描述
由于旧版本的 Windows 中内置 SSL 支持存在多个问题,最近我将我的程序迁移到 OpenSSL。尽管标题中指定了网站,但一切正常,但我经常收到错误:00000001:lib(0):func(0):reason(1)。
如果我取消注释为套接字设置非阻塞模式的行,我只会收到另一条错误消息。非常感谢任何帮助。我在 Windows 10 64 位下使用 OpenSSL 1.1.1j 测试了该问题(但它似乎不依赖于操作系统版本)
我认为问题可能是因为缺少证书,所以我在上下文中添加了 Microsoft.pem - 没有任何改变(你可以从 https://github.com/drwetter/testssl.sh/blob/3.1dev/etc/Microsoft.pem 获取这个文件
这是模拟我的程序的代码:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#define HOST "free.currencyconverterapi.com"
int main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);
SSL_library_init();
SSL_load_error_strings();
const SSL_METHOD *meth = TLS_client_method();
if (!meth) {
fprintf(stderr,"SSL setup failure: client method");
return 1;
}
SSL_CTX *g_ctx = SSL_CTX_new(meth);
if (!g_ctx) {
fprintf(stderr,"SSL setup failure: context");
return 2;
}
SSL_CTX_load_verify_locations(g_ctx,"microsoft.pem",NULL);
SSL_CTX_ctrl(g_ctx,SSL_CTRL_MODE,SSL_MODE_AUTO_RETRY,nullptr);
RAND_screen();
addrinfo *air = nullptr,hints = { 0 };
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
if (GetAddrInfoA(HOST,"443",&hints,&air)) {
fprintf(stderr,"AddrInfo for host %s Failed (%u)",HOST,WSAGetLastError());
return 3;
}
int rc = 1;
SOCKET s = INVALID_SOCKET;
for (auto *ai = air; ai; ai = ai->ai_next) {
s = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
if (s == INVALID_SOCKET) {
FreeAddrInfoA(air);
return 4;
}
if (connect(s,ai->ai_addr,(int)ai->ai_addrlen) == 0) {
rc = 0;
break;
}
if (WSAGetLastError() != WSAEWOULDBLOCK) {
rc = WSAGetLastError();
closesocket(s);
s = INVALID_SOCKET;
continue;
}
}
if (rc) {
fprintf(stderr,"connection Failed: %d",rc);
return 6;
}
FreeAddrInfoA(air);
// uncomment that lines to obtain another error code
// u_long notblocking = 0;
// if (ioctlsocket(s,FIONBIO,¬blocking) != 0) {
// FreeAddrInfoA(air);
// return 5;
// }
SSL *session = SSL_new(g_ctx);
if (!session) {
fprintf(stderr,"SSL setup failure: session");
return 7;
}
SSL_set_fd(session,s);
int err = SSL_connect(session);
if (err != 1) {
err = SSL_get_error(session,err);
char buf[100];
ERR_error_string_n(err,buf,sizeof(buf));
fprintf(stderr,"SSL negotiation failure: %s (%d)",err);
return 8;
}
fprintf(stderr,"Connection succeeded");
return 0;
}
-- WMBR,乔治·哈赞
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)