Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为DHE exchange生成OpenSSL证书_C++_Openssl_X509 - Fatal编程技术网

C++ 为DHE exchange生成OpenSSL证书

C++ 为DHE exchange生成OpenSSL证书,c++,openssl,x509,C++,Openssl,X509,我是安全和OpenSSL方面的初学者。我的目标是通过编程生成一个证书,通过Chrome的“过时”羞辱。我用来生成的证书使用了AES\u 128\u GCM和RSA,即使我尝试将密码列表设置为kEECDH:kEDH:!ADH:AES256-SHA256并且服务器上下文使用SSL_CTX_new(TLSv1_2_server_method()) 根据中的示例,我尝试了以下方法: X509 *x = NULL; EVP_PKEY *pk = NULL; EVP_PKEY_CTX *ctx = NULL

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

根据中的示例,我尝试了以下方法:

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\u sign
给出的错误是此密钥类型不支持EVP\u PKEY\u sign\u init操作

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

我的目标是通过编程生成一个通过Chrome所做的“过时”羞辱的证书…
我能做什么?我希望连接使用ECDHE,但我不知道如何设置…
我尝试将密码列表设置为
kEECDH:kEDH:!ADH:AES256-SHA256

通常,
高:!阿努尔:!RC4:!MD5已经足够了。由于您希望使用临时密钥交换(这是一件好事),因此也应该删除RSA密钥传输:
HIGH:!阿努尔:!克尔萨:!RC4:!MD5


根据文档中的示例

另请参见OpenSSL wiki上的。它是一个客户端,但它向您展示了如何设置上下文

因为它是一个服务器,所以您可能还需要上下文选项,如


为DHE exchange生成OpenSSL证书

几乎任何证书都可以。它可以是RSA密钥、DSS密钥或ECDSA密钥。证书中的密钥将用于对服务器消息进行签名(有些是免提的),因此它用于服务器身份验证

短暂的密钥交换是不同的。确保使用和密码套件字符串


因为您没有使用像SRP和PSK这样的密码套件,所以也可以删除它们。RSA仍会出现,但它用于服务器身份验证,而不是密钥传输:

$ 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

相关的其中一个答案解释了您可能收到的警告。Ok。我已经生成了证书,并像以前一样使用RSA 2048位密钥对其进行了签名。所有OpenSSL函数都可以工作并且不会返回错误,但是我没有得到任何内容。尽管这可能是由其他原因造成的。一旦我把这件事做好,我可能会接受你的回答。