c++ - 用于 DHE 交换的 OpenSSL 证书生成

标签 c++ openssl x509

我是安全和 OpenSSL 方面的初学者。我的目标是以编程方式生成一个证书,该证书通过 Chrome 所做的“过时​​的”羞辱。我用来生成的证书使用了 AES_128_GCMRSA,即使我尝试将密码列表设置为 kEECDH:kEDH:!ADH:AES256-SHA256并且服务器上下文使用 SSL_CTX_new(TLSv1_2_server_method());

基于 the documentation 中的示例我尝试了以下操作:

X509 *x = NULL;
EVP_PKEY *pk = NULL;
EVP_PKEY_CTX *ctx = NULL;
EVP_PKEY *params = NULL;

if(NULL == (params = EVP_PKEY_new()))
    goto err;

if(1 != EVP_PKEY_set1_DH(params, DH_get_2048_256()))
    goto err;

if(!(ctx = EVP_PKEY_CTX_new(params, NULL)))
    goto err;

if(!EVP_PKEY_keygen_init(ctx))
    goto err;

if(!EVP_PKEY_keygen(ctx, &pk))
    goto err;

if ((x=X509_new()) == NULL)
    goto err;

X509_set_version(x,2);
X509_set_pubkey(x,pk);

//... (setting the issuer, subject, etc)

//Here is where it fails
if (!X509_sign(x,pk,EVP_sha256()))
    goto err;

RSA 而不是 DH 的相同代码有效。 X509_sign 给出的错误是 EVP_PKEY_sign_init operation not supported for this keytype

我能做什么?我希望连接使用 ECDHE 但我不知道如何设置它。我需要这在合理范围内是安全的,但我的安全知识真的很有限。不过我正在努力。任何帮助将不胜感激,但请提供代码和您的答案(不是命令行生成)。

最佳答案

My objective is to programatically generate a certificate that passes the "obsolete" shaming that Chrome does...
What could I do? I would prefer the connection to use ECDHE but I have no idea how to set that up....
I tried setting the cipher list to kEECDH:kEDH:!ADH:AES256-SHA256...

通常,HIGH:!aNULL:!RC4:!MD5 就足够了。由于您想使用临时 key 交换(这是一件好事),您也应该删除 RSA key 传输:HIGH:!aNULL:!kRSA:!RC4:!MD5


Based on the example from the documentation...

另见 SSL/TLS Client在 OpenSSL 维基上。它是一个客户端,但它向您展示了如何设置上下文。

因为它是一个服务器,您可能还需要像 SSL_OP_SAFARI_ECDHE_ECDSA_BUG 这样的上下文选项.


OpenSSL certificate generation for DHE exchange

几乎任何证书都可以。它可以是 RSA key 、DSS key 或 ECDSA key 。证书中的 key 将用于签署服务器消息(一些人手放弃),因此它用于服务器身份验证。

临时 key 交换是不同的。您确保使用 SSL_CTX_set_cipher_list和密码套件字符串。


由于您没有使用 SRP 和 PSK 等密码套件,因此您也可以删除它们。 RSA 仍然出现,但它用于服务器身份验证,而不是 key 传输:

$ openssl ciphers -v 'HIGH:!aNULL:!kRSA:!RC4:!MD5:!3DES:!DSS:!DSA:!SRP:!PSK'
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-RSA-AES256-SHA384  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(256)  Mac=SHA384
ECDH-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256)  Mac=SHA384
ECDH-RSA-AES256-SHA     SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(256)  Mac=SHA1
ECDH-ECDSA-AES256-SHA   SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256)  Mac=SHA1
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA1
ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-RSA-AES128-SHA256  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(128)  Mac=SHA256
ECDH-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128)  Mac=SHA256
ECDH-RSA-AES128-SHA     SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(128)  Mac=SHA1
ECDH-ECDSA-AES128-SHA   SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128)  Mac=SHA1

关于c++ - 用于 DHE 交换的 OpenSSL 证书生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319394/

相关文章:

用于抽象针对 MSSQLS2008 和 SQLite 的调用的 C++ 库?

C++多重继承和鸭子类型(duck typing)

c++ - 在RAII结构中修改RVO值是否安全?

linux - 如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ/WANT_WRITE

java - 验证智能卡中的签名

c++ - 遍历不同的对象

ssl - 私有(private) SSL 证书和 CA 的各种问题

c++ - PEM_read_X509 未读取整个证书

command-line - 如何使用 OpenSSL 为客户端证书创建指定 CA 私钥密码

certificate - x509 证书中主题属性的顺序