Cod*_*345 6 openssl indy indy10
我使用以下代码为POP3/SMTP发送/接收应用程序设置SSLHandler:
IdSSLHandler->SSLOptions->Mode = sslmClient;
IdSSLHandler->SSLOptions->Method = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;
Run Code Online (Sandbox Code Playgroud)
因此,上述代码应该自动支持SSL 3,TLS 1,TLS 1.1和TLS 1.2.这不能很好地报告"错误的版本"错误.当该SSLVersions
行被删除然后它工作但默认情况下它包括sslvSSLv2
我不想支持.它是一样的:
IdSSLHandler->SSLOptions->Mode = sslmClient;
IdSSLHandler->SSLOptions->Method = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv2 << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这可行,而上述不在同一台服务器上.我知道这slvSSLv23
是一种"使用任何可用版本"的价值.那么为什么它不适用于版本2不存在的上述代码?
另外,我可以使用似乎广泛部署的TSL1,但如果服务器支持1.1或1.2,那么我的代码将不会使用更新版本,但会强制使用1.0版本,除非使用上述内容.
我想用以下目标进行初始化:
我认为代码的第一个版本会提供,但它会报告版本错误.上述目标是否可行,或者必须提供用户设置才能选择要使用的SSL版本?
将SSLVersions
值设置为单个值会自动将其Method
设置为相应的单个版本.设置SSLVersions
为多个值会自动设置Method
为slvSSLv23
.
将设置Method
为单个版本会自动将其SSLVersions
设置为相应的单个值.设置Method
为slvSSLv23
自动设置SSLVersions
为所有支持的值.
印地开启/关闭相应的SSL_OP_NO_SSL_v#
和SSL_OP_NO_TLS_v#
取决于的值OpenSSL中标志Method
和SSLVersions
.
我建议采用以下方法,随着新TLS版本的添加,这是一个稍微更具未来的证据:
IdSSLHandler->SSLOptions->Method = sslvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = IdSSLHandler->SSLOptions->SSLVersions >> sslvSSLv2;
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,Indy将使用SSLv23,只SSL_OP_NO_SSL_v2
激活标志.
在该配置中,"错误版本"错误通常意味着服务器使用的是不支持版本协商的特定版本(使用与SSLv2兼容的客户端问候语).换句话说,连接到TLSv1服务器的SSLv23客户端将失败.服务器必须使用SSLv23才能支持版本协商.在服务器上使用SSLv23允许它接受任何版本客户端,因为客户端启动握手,因此服务器可以查看正在使用的版本标头.但是在客户端上使用SSLv23并不允许它连接到除SSLv23服务器之外的任何服务器.SSLv2服务器只能接受SSLv2客户端,SSLv3服务器只能接受SSLv3客户端,TLSv1服务器只能接受TLSv1客户端,依此类推.
要真正连接到"任何"服务器,您必须检测"错误版本"错误并使用不同的特定Method
/ SSLVersions
配置重试.不幸的是,"错误版本"回复不包括服务器的实际版本,因此您必须使用反复试验.如果SSLv23失败,请尝试TLSv1_2.如果失败,请尝试TLSv1_1.如果失败,请尝试TLSv1.如果失败,请尝试SSLv3.