如何正确实施 OpenSSL 证书

How do I correctly enforce OpenSSL certificates?

本文关键字:OpenSSL 证书 何正确      更新时间:2023-10-16

我目前正在修补什么是有效的聊天服务器。由于我不想过多地暴露我的用户,所以我使用 LibreSSL 的 OpenSSL 库分支为其添加了 TLS 加密。其余代码似乎工作正常,但我认为我没有正确执行证书。

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

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

  2. 如何获取客户端的系统证书?现在我只是在.pem文件中创建了一个,但我真的不想为每个下载客户端的用户构建一个具有唯一证书的新下载。当然,有一种方法可以获取"当前用户的证书"或通过某些OpenSSL API自动生成一个用于此用途的证书?

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

目前,我同时使用 SSL_CTX_use_certificate_file()SSL_CTX_use_PrivateKey_file() 在客户端和服务器程序中设置证书。您可以在上面链接的 Github 聊天服务器存储库中看到代码,eleven_session.cpp

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

阿拉伯数字:当我开始使用加密套接字时,我也在寻找创建工作.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

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

尝试使用该.pem文件,如果仍然不起作用,请将其写入注释中。

希望这对您有所帮助。

感谢 SteffenUllrichschacker22 帮助我解决这个问题。这是我在他们的指导下拼凑的解决方案:

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

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

我决定不使用验证回调,因为它会取代现有的证书验证,所以我也必须做这部分。LibreSSL apps.c文件中的load_cert()函数对弄清楚如何加载证书有很大帮助。

如果您有兴趣查看最终源代码,可以从我的 Git 存储库中公开获得 11 聊天服务器和客户端。

这是我第一次使用 SSL 套接字,所以如果您在这里发现任何问题,请告诉我。这个练习的重点是如何正确地做。