openssl 1.0.2,如何强制服务器仅选择一组密码

时间:2018-10-23 14:03:06

标签: ssl encryption openssl ecdh ecdhe

我有使用opensl 1.0.2j的客户端服务器,并且想强制服务器仅使用以下密码。

ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA384
ECDH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-SHA256
ECDH-ECDSA-AES128-GCM-SHA256
ECDH-ECDSA-AES128-SHA256
DHE-DSS-AES256-GCM-SHA384
DHE-DSS-AES256-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA256
DHE-DSS-AES128-GCM-SHA256
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-SHA256
DHE-DSS-AES128-SHA256

我的服务器端代码如下所示。

method = SSLv23_server_method();
ctx = SSL_CTX_new(method);
SSL_CTX_set_cipher_list(ctx, "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDH-RSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256");
SSL_CTX_set_ecdh_auto(ctx, 1);
SSL_CTX_use_certificate_file(ctx, certFilePath, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, privKeyPath, SSL_FILETYPE_PEM)
SSL_accept()

最后一步ssl_accept失败

here'error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher'

我在上面的代码中对每个ssl调用进行了错误检查,为清楚起见,没有放置所有代码。如果我对SSL_CTX_set_cipher_list()使用“ TLSv1.2:!ADH:!NULL”,则效果很好。

编辑:生成的密钥是RSA:4096。我需要为ECDH / ECDHE / DHE生成不同的密钥吗?

能否请您帮我找出失败的原因以及如何解决?

让我知道是否需要更多信息。

谢谢, 娜迦

1 个答案:

答案 0 :(得分:2)

根据此代码,您没有设置任何DH参数,因此这些DHE-*证书中的任何一个都不起作用。同样,没有设置ECDH的静态参数(不是ECDHE),因此也不会使用ECDH-*密码。仅留下:

ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA384

但是从这4个密码中只能使用两个,因为您拥有RSA证书(前两个密码)或ECC证书(后两个密码)。很可能是RSA证书,它留下了:

ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384

自从您获得no shared cipher以来,您的未知客户端很可能不支持这两种密码。

  

如果我对SSL_CTX_set_cipher_list()使用“ TLSv1.2:!ADH:!NULL”,则效果很好。

在通用配置中使用OpenSSL 1.0.2时,我看到该集合还包含以下密码(像以前一样跳过所有DH,ECDH -...):

AES256-GCM-SHA384
AES256-SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
AES128-GCM-SHA256
AES128-SHA256

因此,您的未知客户端很可能使用这些密码中的任何一个来成功连接。有关更多信息,您需要查看特定的客户端及其配置。