首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Indy 10中实现完美的前向保密?

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

Stack Overflow用户
提问于 2022-03-31 15:20:22
回答 1查看 119关注 0票数 0

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实现完美的前向保密?

代码语言:javascript
运行
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++中,这种情况如下所示:

代码语言:javascript
运行
复制
#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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71695153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档