使用OpenSSL与PostgreSQL的SSL连接在Cpp中失败

Mad*_*mar 5 c++ postgresql ssl openssl

我一直在尝试使用C++中的OpenSSL库连接到启用SSL的PostgreSQL服务器.我能够连接到PostgreSQL服务器并建立非SSL连接,但是当我尝试初始化SSL连接时,握手过程失败并出现以下错误:

Error
XXXXX:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:ssl\record\ssl3_record.c:252:
Run Code Online (Sandbox Code Playgroud)

在通过Wireshark进行分析时,我了解到客户端关闭了与alert协议版本的连接(这意味着客户端不支持RFC5246中所述的服务器协议版本).由于Client Hello和Server Hello已完成,因此客户端不响应.

我试过以下解决方案,

  1. 禁用TLS 1.2以外的SSL协议版本
  2. 返回的回调始终为true,无需任何验证.
void ConfigureCtx(SSL_CTX* ctx)
{
    SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
    SSL_CTX_set_cert_verify_callback(ctx, TrueCallback, NULL);
    SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1);
}
Run Code Online (Sandbox Code Playgroud)
  1. 试过不同的客户端方法
SSL_CTX* CreateSslCtx()
{
     SSL_CTX *ctx;
     ctx = SSL_CTX_new(TLSv1_2_client_method());
     return ctx;
}
Run Code Online (Sandbox Code Playgroud)
  1. 另外,尝试使用OpenSSL包v 1.1.0和1.0.2.

PostgreSQL服务器详细信息:

  • PGSQL服务器版本:9.6.2
  • PGSQL SSL协议:TLS 1.2
  • 操作系统:Windows 7
  • OpenSSL版本:1.0.2

客户详情:

  • 客户:Cpp Win 32应用程序
  • 操作系统:Windows 8.1
  • 外部库:Openssl v 1.1.0