创建自己签名的OpenSSL证书

时间:2015-06-16 20:49:15

标签: 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");

我使用以下方法创建/签署这些密钥/证书:

$ 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

现在,当我运行客户端并尝试连接服务器时,出现错误:Handshake failed: certificate verify failed

我在做什么有什么问题?我怎样才能实现我提到的模型?

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

感谢您的任何努力。

1 个答案:

答案 0 :(得分:2)

您的签名证书无权签名,因为它没有设置CA标志。签名仍然有效,但验证将失败。由于互联网上已有很多指南,会详细说明如何正确操作,因此您可能只需查看herehere了解更多详情。

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