openssl 1.0.2j,如何强制服务器选择ECDH *密码

时间:2018-10-24 07:22:02

标签: ssl encryption openssl ecdh ecdhe

我有一个使用opensl 1.0.2j并使用RSA:4096密钥和证书的客户端服务器,并且希望强制服务器仅使用以下密码。

ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
ECDH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA256
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-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:ECDH-RSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256");
SSL_CTX_set_ecdh_auto(ctx, 1);
SSL_CTX_set_tmp_dh(ctx, dh);
SSL_CTX_set_tmp_ecdh(ctx, ecdh);
SSL_CTX_use_certificate_file(ctx, certFilePath, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, privKeyPath, SSL_FILETYPE_PEM)
SSL_accept()

我的客户端代码如下所示

method = SSLv23_server_method();
ctx = SSL_CTX_new(method);
SSL_CTX_set_cipher_list(ctx, "ECDH-RSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-SHA256");
SSL_CTX_set_ecdh_auto(ctx, 1);
SSL_CTX_set_tmp_dh(ctx, dh);
SSL_CTX_set_tmp_ecdh(ctx, ecdh);
SSL_CTX_use_certificate_file(ctx, certFilePath, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, privKeyPath, SSL_FILETYPE_PEM)
SSL_connect()

服务器上的最后一个步骤ssl_accept()失败

err: 336027900 'error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol'

如果我在客户端使用ECDHE*RSA*DHE*RSA*密码,则工作正常。

能不能让我知道我在想什么?

编辑:服务器的证书(certFilePath)包含RSA公用密钥,而不是ECDH公用密钥。

1 个答案:

答案 0 :(得分:2)

元:最多只能回答TLS1.2; 1.3不再在密码套件中具有密钥交换和身份验证。

首先,同时调用set_ecdh_autoset_tmp_ecdh是没有意义的-它们是互斥的。另外,您的服务器不要求客户端身份验证,因此在客户端上配置自证书和密钥是没有用的。 OTOH,您的服务器正在使用自签名证书,该证书可能不在客户端的默认信任库中,因此您可能需要配置客户端信任库(有几种方法可以这样做)。

第二个“静态” ECDH密码套件与ECDHE套件完全不同,就像“静态” DH套件与DHE套件不同。两种静态形式都没有得到广泛应用,并且很少使用,因为它们通常没有任何好处。特别是OpenSSL 1.1.0及更高版本不再实现它们,因此,如果我正确记住日程安排,则大约一年后您的代码就会过时。

确切地说,DH-RSA套件要求包含DH密钥的证书(允许keyAgreement),并且对于TLS <= 1.1,该证书必须由 CA 使用RSA密钥颁发;对于1.2,则删除后一个限制。没有任何公共CA会为DH密钥颁发证书,即使亲自完成也不容易;参见https://security.stackexchange.com/questions/44251/openssl-generate-different-type-of-self-signed-certificate和(我的)https://crypto.stackexchange.com/questions/19452/static-dh-static-ecdh-certificate-using-openssl/

ECDH-RSA套件类似地需要包含允许密钥协议的ECC密钥的证书,如果<= 1.1,则由RSA颁发;这有点容易,因为ECDH的密钥(和CSR)与ECDSA相同,并且仅KeyUsage需要不同。对于您自己创建和自签名的情况,很简单,只需生成ECC密钥和证书(使用ECDSA自动签名)即可。

但是最后,这不应该导致“未知协议”;这将导致“无共享密码”和handshake_failure。您显示的代码不应引起“未知协议”,因此您可能需要首先进行调查和修复。您可能会尝试使用命令行s_client来代替,尤其是使用其-debug-msg钩子,或者使用-trace进行编译。