如何正确实施OpenSSL证书?

时间:2014-11-20 10:04:25

标签: c++ sockets openssl certificate libressl

我正在修补有效的chat server。由于我不想过多地暴露我的用户,因此我使用LibreSSL的OpenSSL库分支向其添加了TLS加密。其余代码似乎工作正常,但我认为我没有正确地进行证书。

我在服务器上有一个私人/公共证书,不仅应该用来加密通信,还要确保服务器真的是客户想要与之交谈的人。这是我无法弄清楚的部分:

  1. 如何将服务器的公钥提供给客户端?需要它来验证它是否正在与正确的服务器通信。或者我应该做些什么,可能涉及根CA的证书?有API提供吗?我可以使用可执行文件将公钥打包为.pem,但是我找不到API来告诉OpenSSL有关用于客户端请求的公共服务器密钥或根CA.

  2. 如何获取客户端的系统证书?现在我刚刚在.pem文件中创建了一个,但我真的不想构建为每个下载客户端的用户提供带有唯一证书的新下载。当然有办法获得“当前用户的证书”或通过一些OpenSSL API自动生成一个用于此用途的证书吗?

  3. 如果有人能指出我使用正确的API,那就太好了!我还会提供线索,关于SO的类似问题的链接,教程,针对OpenSSL加密初学者的书籍指南,答案或示例代码。

    目前,我正在使用SSL_CTX_use_certificate_file()SSL_CTX_use_PrivateKey_file()在客户端和服务器程序中设置证书。您可以在eleven_session.cpp

    中查看上面链接的Github聊天服务器存储库中的代码

2 个答案:

答案 0 :(得分:1)

1:所以,首先,您不需要将服务器的公钥提供给客户端,因为OpenSSL API会为您完成。使用常规socket函数创建套接字,然后将其传输到OpenSSL,此套接字是连接到服务器的每个客户端的标识。然后在套接字写入函数SSL_write中使用此SSL套接字将加密文本发送到客户端。

<强> 2 当我开始使用加密套接字时,我在找到创建正常工作.pem文件的正确方法时也遇到了很多问题,所以我在这里尝试了我是如何做到的。你必须使用linux终端,你必须使用sudo apt-get install openssl安装OpenSSL:

openssl genrsa -des3 -out self-ssl.key 2048
openssl req -new -key self-ssl.key -out self-ssl.csr
cp -v self-ssl.{key,original}
openssl rsa -in self-ssl.original -out self-ssl.key
rm -v self-ssl.original
openssl x509 -req -days 3650 -in self-ssl.csr -signkey self-ssl.key -out self-ssl.crt
cat self-ssl.crt self-ssl.key > server.pem

然后使用此文件,就像您已经发现这两个函数一样:SSL_CTX_use_certificate_fileSSL_CTX_use_PrivateKey_file

尝试使用该.pem文件,如果它仍然无效,请将其写入评论。

希望这会对你有所帮助。

答案 1 :(得分:1)

感谢 SteffenUllrich schacker22 帮助解决了这个问题。这是我与他们的指导拼凑在一起的解决方案:

连接后,客户端使用BIO_new(BIO_s_file())BIO_read_filename()PEM_read_bio_X509_AUX()从PEM文件加载服务器的公共证书,然后将其与{{1}返回的证书进行比较使用SSL_get_peer_certificate()。如果不给0,则客户端中止连接,因为它没有与正确的服务器通信。

只有服务器获取证书,我使用X509_cmp()(公共)和SSL_CTX_use_certificate_file()设置证书,以指向包含公钥和私钥的同一个PEM文件。

我决定不使用验证回调,因为它会取代现有的证书验证,所以我也必须这样做。 LibreSSL的SSL_CTX_use_PrivateKey_file()文件中的load_cert()函数对于确定如何加载证书非常有帮助。

如果您有兴趣看到final source code,可以从my Git repository for the eleven chat server and client公开发布。

这是我第一次使用SSL套接字,所以如果你发现任何错误,请告诉我。这个练习的重点是学习如何正确地做到这一点。