C++ 创建自己签名的OpenSSL证书

C++ 创建自己签名的OpenSSL证书,c++,ssl,boost,openssl,ssl-certificate,C++,Ssl,Boost,Openssl,Ssl Certificate,我正在为服务器和客户端使用boostssl,我脑海中有一个服务器/客户端程序的模型,我不确定它是否能工作 我心目中的模式是成为我课程证书的唯一权威。我的主要问题是:我如何才能做到这一点? 在我的服务器程序中,我定义键如下: context_.use_certificate_chain_file("../sslkeys/server.crt"); context_.use_private_key_file("../sslkeys/server.key", boost::asio::

我正在为服务器和客户端使用boostssl,我脑海中有一个服务器/客户端程序的模型,我不确定它是否能工作

我心目中的模式是成为我课程证书的唯一权威。我的主要问题是:我如何才能做到这一点?

在我的服务器程序中,我定义键如下:

    context_.use_certificate_chain_file("../sslkeys/server.crt");
    context_.use_private_key_file("../sslkeys/server.key", boost::asio::ssl::context::pem);
    context_.use_tmp_dh_file("../sslkeys/dh512.pem");
我使用以下方法创建/签署这些密钥/证书:

$ openssl genrsa -des3 -out server.key 2048
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
$ cp server.key server.key.secure
$ openssl rsa -in server.key.secure -out server.key
$ openssl dhparam -out dh512.pem 512
对于我的客户端程序,我想创建一个证书,并用我的“server.key”对其进行签名,因为我认为(我可能错了,如果我错了,请纠正我)这是一种方法。客户端程序需要使用以下命令的密钥:

ctx.load_verify_file("../sslkeys/client.csr");
因此,我使用以下命令创建了一个密钥,并使用服务器密钥进行签名:

$ openssl genrsa -des3 -out client.key 2048
$ openssl req -new -key client.key -out client.csr
$ openssl x509 -req -days 3650 -in client.csr -signkey ../sslkeys/server.key -out client.crt
现在,当我运行客户端并尝试连接服务器时,我得到了错误:
握手失败:证书验证失败

我现在做的有什么不对?我如何实现我提到的模型

如果您需要任何其他信息,请询问


感谢您的努力。

您的签名证书没有签名权限,因为它没有设置CA标志。签名仍然有效,但验证将失败。由于互联网上已经有很多指南,详细介绍了如何正确操作,因此您可以查看或了解更多详细信息


此外,仅使用512位Diffie-Hellmann将密钥交换的安全性降低到512位,这在今天是可以利用的(另请参见Logjam攻击)。2048 RSA密钥在这里没有帮助。如果您使用最新版本的OpenSSL,出于安全原因,将最小大小增加到768位,那么使用512位甚至可能不起作用。

非常感谢。我试试这个,然后给你检查一下是否有效。但是,我可以问一下,如果我将dh密钥增加到2048,这会解决问题吗?或者还有其他需要考虑的因素吗?只要客户机支持,将DH密钥增加到2048是可以的。使用Java时,您至少需要JDK8,并且Internet Explorer可能会出现问题。另请参见。我现在有CA密钥(CA.key和CA.crt)以及由我的CA签名的服务器/客户机密钥。但在这种情况下,我必须向我的服务器程序提供的证书链文件是什么?没有一个链接可以解释这个概念。我尝试了可能的钥匙组合,但都不起作用。你能告诉我我的证书链应该是什么吗?谢谢。如果您只有根CA,然后它直接签署了叶证书,那么您应该发送的唯一证书就是叶证书。当然,客户端必须已经信任根CA。很抱歉,这不是我最后一个问题的明确答案。我的程序请求一个链文件+一个密钥。密钥由我的ca密钥直接签名。那链式锉刀呢?在我提供的文件列表中,如何生成链证书文件?谢谢。Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问的地方。另见。