c++ - 创建自己签名的 OpenSSL 证书

标签 c++ ssl boost openssl ssl-certificate

我正在为服务器和客户端使用 boost ssl,我脑海中有一个服务器/客户端程序模型,但我不确定它是否会起作用。

我心目中的模型是我的程序证书的唯一授权机构。我的主要问题是:我该怎么做?

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

    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");

我使用以下方式创建/签署这些 key /证书:

$ 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”对其进行签名,因为我认为(我可能错了,如果我错了请纠正我)这就是这样做的方法.客户端程序需要使用以下命令的 key :

ctx.load_verify_file("../sslkeys/client.csr");

因此我创建了一个 key ,并使用服务器 key 对其进行了签名,命令如下:

$ 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 标志。签名仍然有效,但验证将失败。由于 Internet 上已经有很多指南会详细说明如何正确操作,因此您可能只看一下 herehere了解更多详情。

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

关于c++ - 创建自己签名的 OpenSSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30877901/

相关文章:

用于语义的 C++ 包装类型

c++ - try catch 无法处理 pthread 内的段错误

c++ - libboost ASIO。简单的异步客户端服务器

c++ - 使用 boost 标记化给出相同的输出

ssl - 错误 "ERR_INVALID_REDIRECT"到表单登录

c++ - 通过 Boost TCP 发送大量数据?

c++ - 在此示例中使用空基类是否合理?

c++ - 用户定义的消息

c# - 理论 : Implementing MSMQ using SSL to send message

ssl - 使用 Coldfusion 在本地测试 HTTPS