在印地10启用完美的前向保密



在Indy 10中如何启用完美前向保密?,这个问题对德尔斐来说是有答案的。当我试图在C++中实现同样的目标时,我陷入了SSL_CTX_set_ecdh_auto()方法的困境。它存在于Indy的源代码中,因此(我认为(存在于已安装的版本中(我正在运行C++Builder 11(,但在C++头文件IdSSLOpenSSLHeaders.hpp中没有引用。

然而,我可能会在标题中手动添加它,假设DCU包含源代码,但在web上搜索OpenSSL时,我发现SSL_CTX_set_ecdh_auto()SSL_set_ecdh_auto()不推荐使用,而且没有任何效果。

如何使用C++和Indy 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;

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

这是因为IdSSLOpenSSLHeaders.pas单元中使用的所有OpenSSL函数都被专门标记为{$EXTERNALSYM},这样它们就不会出现在IdSSLOpenSSLHeaders.hpp文件中。当Delphi单元使用外部SDK时,这是一种惯例,否则C/C++就可以使用这些外部SDK。

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

在网上搜索OpenSSL时,我发现SSL_CTX_set_ecdh_auto()SSL_set_ecdh_auto()已被弃用,并且没有任何效果。

在OpenSSL 1.1.0及更高版本中,是。但在TIdSSLIOHandlerSocketOpenSSL使用的OpenSSL 1.0.2中没有。如果要使用OpenSSL 1.1.x+,则需要使用此(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(sslContext->Context, 1);

最新更新