OpenSSL 无法连接到 free.currencyconverterapi.com

问题描述

由于旧版本的 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,&notblocking) != 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 (将#修改为@)