在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++和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;
发布于 2022-03-31 16:46:20
SSL_CTX_set_ecdh_auto()
存在于Indy的源代码中,因此(我假设)在已安装的版本(我正在运行C++Builder 11)中,但是C++头文件IdSSLOpenSSLHeaders.hpp
中没有引用。
这是因为在OpenSSL单元中使用的所有IdSSLOpenSSLHeaders.pas
函数都被特别标记为{$EXTERNALSYM}
,这样它们就不会出现在IdSSLOpenSSLHeaders.hpp
文件中。当Delphi单元使用C/C++本机可用的外部SDK时,就会出现这种情况。
因此,要在OpenSSL中使用C++函数,您必须在代码中下载OpenSSL 1.0.2SDK和#include
及其.h
头文件(或者,正如您所说,您可以自己声明函数,因为它们存在于Delphi中)。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
。
//这是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);
https://stackoverflow.com/questions/71695153
复制相似问题