openssl 1.0.2,如何强制服务器只选择一组密码
openssl 1.0.2, how to force server to choose only set of ciphers
我有使用 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 调用进行了错误检查,为了清楚起见,我没有放所有代码。如果我将 "TLSv1.2:!ADH:!NULL" 用于 SSL_CTX_set_cipher_list() 它工作正常。
编辑:生成的密钥是 RSA:4096。我是否需要为 ECDH/ECDHE/DHE 生成不同的密钥?
能否请您帮我找出失败的原因以及如何解决?
如果您需要更多信息,请告诉我。
谢谢,
娜迦
根据此代码,您没有设置任何 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
很可能你的未知客户端不支持这两种密码中的任何一种。
If I use "TLSv1.2:!ADH:!NULL" for SSL_CTX_set_cipher_list() it works fine.
在常用配置中使用 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
因此您的未知客户端很可能使用这些密码中的任何一个来成功连接。有关这方面的更多信息,您需要查看特定的客户端及其配置。
我有使用 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 调用进行了错误检查,为了清楚起见,我没有放所有代码。如果我将 "TLSv1.2:!ADH:!NULL" 用于 SSL_CTX_set_cipher_list() 它工作正常。
编辑:生成的密钥是 RSA:4096。我是否需要为 ECDH/ECDHE/DHE 生成不同的密钥?
能否请您帮我找出失败的原因以及如何解决?
如果您需要更多信息,请告诉我。
谢谢, 娜迦
根据此代码,您没有设置任何 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
很可能你的未知客户端不支持这两种密码中的任何一种。
If I use "TLSv1.2:!ADH:!NULL" for SSL_CTX_set_cipher_list() it works fine.
在常用配置中使用 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
因此您的未知客户端很可能使用这些密码中的任何一个来成功连接。有关这方面的更多信息,您需要查看特定的客户端及其配置。