我们有一个也提供HTTPS连接的网络服务:
FWebBrokerBridge := TIdHTTPWebBrokerBridge.Create(Self); // TIdHTTPWebBrokerBridge = class(TIdCustomHTTPServer), see IdHTTPWebBrokerBridge.pas
LIOHandleSSL := TIdServerIOHandlerSSLOpenSSL.Create(FWebBrokerBridge);
LIOHandleSSL.SSLOptions.CertFile := FHTTPSCertificate;
LIOHandleSSL.SSLOptions.RootCertFile := FHTTPSRootCertificate;
LIOHandleSSL.SSLOptions.KeyFile := FHTTPSPrivateKey;
LIOHandleSSL.OnGetPassword := HTTPSIOHandlerSSLOpenSSLGetPassword;
FWebBrokerBridge.IOHandler := LIOHandleSSL;
如代码所示,我们的开发机器上安装了OpenSSL(版本1.02d)。
我们的一个客户运行我们的Web服务并使用OpenSSL(假设版本相同)。 他们现在要更改防火墙并使用以下密码开始使用证书:
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
他们的问题(因此我的问题)是:网络服务是否/可能存在此问题?
我已经使用openssl ciphers -v
(详细)声明检查了OpenSSL支持的密码
这给了我一个带有密码名称的长列表
他们的OpenSSL ciphers page列出了OpenSSL使用的名称与相关规范中的套件名称之间的对应关系
(讽刺注意:不要和FireFox一起去那里,它抱怨他们使用旧的TLS版本)
他们翻译:
TLS_RSA_WITH_AES_128_CBC_SHA -> AES128-SHA (from the 'AES ciphersuites from RFC3268, extending TLS v1.0')
TLS_RSA_WITH_AES_256_CBC_SHA -> AES256-SHA (idem)
TLS_RSA_WITH_AES_128_CBC_SHA256 -> AES128-SHA256 (from the 'TLS v1.2 cipher suites')
TLS_RSA_WITH_AES_256_CBC_SHA256 -> AES256-SHA256 (idem)
这里似乎适用的是他们的评论应该注意的是,几个密码套件名称不包括所使用的认证,例如DES-CBC3-SHA。在这些情况下,使用RSA身份验证。
这些翻译的名称在我生成的列表中:
...
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
...
AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
...
AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256
...
AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA256
...
以下结论是否正确?:
OpenSSL版本支持他们将使用的密码,这与我的Delphi程序无关。无需重新编译。网络服务将正常运作。
注意:我怀疑这个问题是否在这里适当的地方(也是因为Why we are not customer support),但由于这可能与更多的程序员有关,所以我决定把它放在SO上。