代码之家  ›  专栏  ›  技术社区  ›  Ludo Stroetenga

在Indy 10中实现完美的前向保密?

  •  0
  • Ludo Stroetenga  · 技术社区  · 3 年前

    在里面 How to enable Perfect Forward Secrecy In Indy 10? ,这个问题为德尔福解答。当我试图在C++中实现同样的任务时,我就陷入了困境。 SSL_CTX_set_ecdh_auto() 方法它存在于Indy的源代码中,因此(我假设)在安装的版本中(我正在运行C++ Builder 11),但是C++头文件中没有引用。 IdSSLOpenSSLHeaders.hpp .

    然而,我可能会手动将其添加到标题中,假设DCU包含源代码,但在web上搜索我找到的OpenSSL SSL_CTX_set_ecdh_auto() and SSL_set_ecdh_auto() are deprecated and have no effect .

    如何最好地使用C++和印度10实现完美的前向保密?

    TIdServerIOHandlerSSLOpenSSL * LIOHandleSSL;
    LIOHandleSSL = new TIdServerIOHandlerSSLOpenSSL(FServer);
    LIOHandleSSL->SSLOptions->Mode = TIdSSLMode::sslmServer;
    LIOHandleSSL->SSLOptions->Method = TIdSSLVersion::sslvTLSv1_2;
    LIOHandleSSL->SSLOptions->SSLVersions = TIdSSLVersions() << TIdSSLVersion::sslvTLSv1_2;
    LIOHandleSSL->SSLOptions->CertFile = AppRoot + CertFile;
    if (RootCertFile.Trim().Length() > 0)
        LIOHandleSSL->SSLOptions->RootCertFile = AppRoot + RootCertFile;
    LIOHandleSSL->SSLOptions->KeyFile = AppRoot + KeyFile;
    
    LIOHandleSSL->SSLOptions->CipherList = ""
    "ECDHE-RSA-AES256-GCM-SHA384:"
    "ECDHE-ECDSA-AES256-GCM-SHA384:"
    "ECDHE-RSA-WITH-AES-256-GCM-SHA384:"
    "ECDHE-ECDSA-CHACHA20-POLY1305:"
    "ECDHE-ECDSA-AES128-GCM-SHA256:"
    "ECDHE-ECDSA-AES256-SHA384:"
    "ECDHE-ECDSA-AES128-SHA256:"
    "HIGH:"
    "!aNULL:"
    "!eNULL:"
    "!EXPORT:"
    "!DES:"
    "!RC4:"
    "!MD5:"
    "!PSK:"
    "!SRP:"
    "!CAMELLIA:"
    "@STRENGTH";
    
    // this is what is needed according to the post
    //               auto sslContext = TMyIdSSLContext(LIOHandleSSL->SSLContext);
    //             SSL_CTX_set_ecdh_auto(FSSLContext.fContext, 1);
    
    LIOHandleSSL->OnGetPassword = OnGetSSLPassword;
    
    FServer->IOHandler = LIOHandleSSL;
    FServer->OnQuerySSLPort = OnQuerySSLPort;
    
    0 回复  |  直到 3 年前
        1
  •  0
  •   Remy Lebeau    3 年前

    [ SSL_CTX_set_ecdh_auto() 存在于Indy的源代码中,因此(我假设)在已安装的版本中(我正在运行C++ Builder 11),但是C++头文件中没有引用 IdSSLOpenSSLHeaders.hpp .

    这是因为 IdSSLOpenSSLHeaders.pas 单元标记为 {$EXTERNALSYM} 特别是为了 不会 出现在 IdSSLOpenSSLHeaders。水电站 文件当Delphi单元使用C/C++本机可用的外部SDK时,这是一种习惯。

    因此,为了在C++中使用OpenSSL函数,您必须下载OpenSSL 1.0.2SDK和 #include 它的 .h 代码中的头文件(或者,正如您所说,您可以自己声明函数,因为它们存在于Delphi DCU中)。Delphi不能使用 H 文件,这就是(主要)原因 IdSSLOpenSSLHeaders。pas 存在。

    在网上搜索我找到的OpenSSL SSL_CTX_set_ecdh_auto() SSL_set_ecdh_auto() 不推荐使用,没有效果。

    在OpenSSL 1.1.0及更高版本中,是的。但不是在OpenSSL 1.0.2中,这是什么 TIdSSLIOHandlerSocketOpenSSL 使用。如果你想使用OpenSSL 1.1。x+,你需要使用 this (wip) SSLIOHandler 相反

    // this is what is needed according to the post
    //               auto sslContext = TMyIdSSLContext(LIOHandleSSL->SSLContext);
    //             SSL_CTX_set_ecdh_auto(FSSLContext.fContext, 1);
    

    在C++中,看起来会像这样:

    #include <openssl/ssl.h>
    // or simply:
    // long __fastcall SSL_CTX_set_ecdh_auto(PSSL_CTX ctx, long m);
    
    class TMyIdSSLContext : public TIdSSLContext
    {
    public:
        __property PSSL_CTX Context = {read=fContext};
    };
    
    auto sslContext = (TMyIdSSLContext*) LIOHandleSSL->SSLContext;
    SSL_CTX_set_ecdh_auto(FSSLContext->Context, 1);