【问题标题】:How to make OpenSSL use http instead of https?如何让 OpenSSL 使用 http 而不是 https?
【发布时间】:2011-01-09 16:37:12
【问题描述】:

所以我想要的很简单——我喜欢 openSSL api。我找到了一些simple code to begin with 来学习它。我对服务器创建的东西很陌生。我想知道 - 如何让 OpenSSL 使用简单的 http 而不是 https?我的意思是我想提供同样的服务,能够在我需要的时候跳转到 https 但没有保护它的 http 版本。

我的意思是说出来真是太棒了

 SSLServer server("cert", "pkey", 1420);

  // Set the thread function.
  server.SetPthread_F(conn_thread);

我希望我可以为不受保护的 http 服务创建做同样的事情。

在我明白了一些重要的答案后,我将编辑主要问题:

如何只保留/使用 OpenSSL 库的非阻塞 TCP 服务器部分?主要目标将是一个跨平台的小型且易于使用的 TCP 服务器,在该服务器上可以轻松实现 http 和 http costumized 类似物

所以如果我们看一下例子:

#include <openssl/ssl.h>
#include <openssl/err.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "sslserver.h"

#define REPLY "<html><body>Metalshell.com OpenSSL Server</body></html>"
#define MAX_PACKET_SIZE 1024

// Called when a new connection is made.
void *conn_thread(void *ssl) {
  int fd = SSL_get_fd((SSL *)ssl);

  if(SSL_accept((SSL *)ssl) == -1) {
    ERR_print_errors_fp(stderr);
  } else {
    char cipdesc[128];
    SSL_CIPHER *sslciph = SSL_get_current_cipher((SSL *)ssl);

    cout << "Encryption Description:\n";
    cout << SSL_CIPHER_description(sslciph, cipdesc, sizeof(cipdesc)) << endl;

    char buff[MAX_PACKET_SIZE];
    // Wait for data to be sent.
    int bytes = SSL_read((SSL *)ssl, buff, sizeof(buff));
    buff[bytes] = '\0';

    // Show the browser request.
    cout << "Recieved: \n" << buff << endl;

    // Send the html reply.
    SSL_write((SSL *)ssl, REPLY, strlen(REPLY));
  }

  // Tell the client we are closing the connection.
  SSL_shutdown((SSL *)ssl);

  // We do not wait for a reply, just clear everything.
  SSL_free((SSL *)ssl);
  close(fd);

  cout << "Connection Closed\n";
  cout << "---------------------------------------------\n";

  pthread_exit(NULL);
}

int main() {
  SSLServer server("cert", "pkey", 1420);

  // Set the thread function.
  server.SetPthread_F(conn_thread);

  while(1) {
    /* Wait for 10 seconds, and if no one trys
     * to connect return back.  This allows us to do
     * other things while waiting.
     */
    server.CheckClients(10);
  }

  return 0;
}

我们的服务器应该改变什么来接受所有连接,而不仅仅是 ssl 连接(如果可能,cout 完整请求)并向它们发送回复?

【问题讨论】:

  • 这听起来像是 ServerFault 的问题。

标签: c++ http ssl https openssl


【解决方案1】:

HTTPS 带有 SSL 的简单 HTTP(其实现是 OpenSSL 的重点)。 HTTPS 中的 S 代表安全。

当您不需要 SSL 时,不要使用 OpenSSL API。

【讨论】:

  • 一般来说,我喜欢 openSSL 的是服务创建 api - 是否有任何类似的 lib 用于简单的 http 服务,或者在需要时使用 openssl 设置对 nan 的保护?
【解决方案2】:

如果您查看第 5 章中的 OpenSSL Book(我认为),他们会通过一系列步骤构建一个简单的 SSL 服务器。第一步使用 OpenSSL API 进行纯文本(非 SSL)网络 I/O,这正是您所要求的。

【讨论】:

    【解决方案3】:

    您引用的代码是非阻塞 TCP 服务器 + SSL 的简单实现。因此,您需要做的是从该代码中剥离 OpenSSL,然后您就可以简单地实现非阻塞 TCP 服务器。请注意,这与真正的 HTTP 服务器相去甚远——它根本不执行请求解析(这可能很重要),并以预定义的响应进行响应。所以如果你需要一个HTTP/HTTPS服务器,你需要搜索对应的第三方库或者代码。

    【讨论】:

    • 在跨平台 tcp 套接字包装器之上拥有简单的 TCP 服务器已经绰绰有余,因此问题演变为如何从该示例代码中剥离 TCP 服务器功能。
    • @Kabumbus 在谷歌上搜索“简单的 http 服务器 C++ 代码”会发现几个 [re] 可使用的服务器,它们将为您提供所需的东西,而无需从您使用的示例中剥离 openssl 的麻烦。
    • 这里的重点是使用 openssl 来实现未来快速跳转到 https 世界的能力=)
    • @Kabumbus 我看不到 OpenSSL 支持直通模式(这将使您只需打开和关闭 SSL)。尝试检查其他 HTTP 服务器代码示例之一,也许它们在 SSL 方面提供了更大的灵活性
    【解决方案4】:

    HTTPS 仅在客户端和服务器端应用程序都“意识到”在 SSL 中发生的事务时才起作用。因此,大多数应用程序对于 ssl 和非 ssl 通信都有独立的入口点,例如 HTTP 通常在端口 80 上,而 HTTPS 将在端口 443 上。如果客户端在端口 80 上启动事务,并且如果服务器端应用程序确定其余的交换必须是安全的,它“重定向”客户端应用程序在端口 443 上进行交易。例如,如果您访问http://www.gmail.com,则交易从端口 80 上的通信开始,但是由于此应用程序要求您安全登录,它会重定向您的浏览器在端口 443 上打开到另一个 url 的新连接。

    您也可以这样做,是的,当交易发生在 SSL 中时,您也可以指示客户端开始在端口不安全的端口 80 上进行交易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多