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

openssl 1.0.2,如何强制服务器只选择一组密码,ssl,encryption,openssl,ecdh,ecdhe,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-SHA

我有一个使用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\u CTX\u set\u cipher\u list()使用“TLSv1.2:!ADH:!NULL”,则效果很好

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

你能帮我找出它失败的原因,以及我如何解决它吗

如果你需要更多信息,请告诉我

谢谢,
Naga

基于此代码,您不设置任何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
由于您没有获得共享密码,您的未知客户端可能不支持这两种密码中的任何一种

如果我对SSL\u CTX\u set\u cipher\u list()使用“TLSv1.2:!ADH:!NULL”,则效果很好

在公共配置中使用OpenSSL 1.0.2时,我发现该集还包括以下密码(跳过所有DH、ECDH-…如前所述):


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

基于此代码,您不设置任何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
由于您没有获得共享密码,您的未知客户端可能不支持这两种密码中的任何一种

如果我对SSL\u CTX\u set\u cipher\u list()使用“TLSv1.2:!ADH:!NULL”,则效果很好

在公共配置中使用OpenSSL 1.0.2时,我发现该集还包括以下密码(跳过所有DH、ECDH-…如前所述):


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

事情还取决于客户端发送的内容……事情还取决于客户端发送的内容……感谢您的回答。这是RSA证书,我使用了defailt_md作为sha256,所以这意味着ECDHE-RSA-AES256-GCM-SHA384和ECDHE-RSA-AES256-SHA384也没有使用?基本上客户端也使用相同类型的证书和配置。@Naga:证书的签名算法与密码的HMAC无关。如果客户端实现这些密码并将其提供给服务器,则可以使用这些密码。没有关于您的客户端及其配置的详细信息,因此无法提供有关如何使此未知客户端使用密码的帮助。感谢Steffen Ullrich,在客户端将ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384设置为密码列表后,它开始工作。谢谢你的帮助,谢谢你的回答。这是RSA证书,我使用了defailt_md作为sha256,所以这意味着ECDHE-RSA-AES256-GCM-SHA384和ECDHE-RSA-AES256-SHA384也没有使用?基本上客户端也使用相同类型的证书和配置。@Naga:证书的签名算法与密码的HMAC无关。如果客户端实现这些密码并将其提供给服务器,则可以使用这些密码。没有关于您的客户端及其配置的详细信息,因此无法提供有关如何使此未知客户端使用密码的帮助。感谢Steffen Ullrich,在客户端将ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384设置为密码列表后,它开始工作。我感谢你的帮助。