首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL_connect在c++中失败,但我可以通过python连接

SSL_connect在c++中失败,但我可以通过python连接
EN

Stack Overflow用户
提问于 2022-03-02 18:13:40
回答 1查看 52关注 0票数 0

我想使用套接字向api发送请求。

我知道,在python工作的遗留代码中,服务正在运行。见以下节选:

代码语言:javascript
复制
class SocketConnection:
    def __init__(self, payload, host):
        self.payload = payload
        self.host = host
        self.sock = None
        self.response_text = {}
        self.status_code = None
        self.full_resp = ""

    def connect(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        context = ssl.create_default_context()
        sock = context.wrap_socket(sock, server_hostname=self.host)
        sock.connect((self.host, 443))
        self.sock = sock

    def send(self):
        self.sock.send(self.payload)

    def receive(self):
        self.full_resp = self.sock.recv(4096).decode("utf-8")
        self.response_text = [self.full_resp]
        self.status_code = self.full_resp[9:12]
        self.sock.close()

我有以下C++代码,它将始终成功地找到它可以连接到的地址,但永远找不到传递SSL_connect的地址。SSL_get_error返回1。

代码语言:javascript
复制
array<struct addrinfo*, 2> get_valid_addrinfo(string s) {
  struct addrinfo *res;
  struct addrinfo hints;
  memset(&hints, '\0', sizeof(hints));
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_family = AF_INET;
  hints.ai_flags = AI_ADDRCONFIG;
  int e = getaddrinfo(s.c_str(), "https", &hints, &res);
  if (e != 0) {
    printf("failure %s\n", gai_strerror (e));
    assert(-1);
  }
  int sock = -1;
  struct addrinfo *r ;
  SSL_CTX * ctx = make_ssl_context();
  SSL * ssl;
  for (r = res; r != NULL; r = r->ai_next) {
    sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
    if (sock != -1 && connect(sock, r->ai_addr, r->ai_addrlen) == 0) {
      free(ssl);
      ssl = SSL_new(ctx);
      SSL_set_fd(ssl, sock);
      if (SSL_connect(ssl) != -1)
        break;
    }
    if (sock != -1) {
       close(sock);
       sock = -1;
    }
  }
  assert(sock != -1);
  close(sock);
  free(ssl);
  SSL_CTX_free(ctx);
  return {res, r};
}

我在德比安10号。

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2022-03-02 18:54:07

在尝试修复代码之前,应该向代码添加一些正确的错误报告,这样才不会在黑暗中射击。当OpenSSL调用失败时,您可以这样做:

代码语言:javascript
复制
unsigned long e = ERR_get_error ();
char errbuf [120];             // magic number, documented!
ERR_error_string (e, errbuf);

然后根据您的意愿报告错误。

我发现ERR_error_string返回的字符串特别有用,事实上,OpenSSL维护了一个叫做“error堆栈”的东西,所以您应该在ERR_get_error上循环,直到它返回零(或者,如果您只想报告第一个错误,您可以调用ERR_clear_error,但是在继续之前以某种方式清除错误堆栈很重要)。如果你浏览文档,你可以阅读所有这些东西。

我看到Steffen刚刚回答了您的另一个查询,所以我不需要编写更多的内容:)不过,我知道云服务提供商(如Cloudflare )需要这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71327350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档