如何正确实施 OpenSSL 证书
How do I correctly enforce OpenSSL certificates?
我目前正在修补什么是有效的聊天服务器。由于我不想过多地暴露我的用户,所以我使用 LibreSSL 的 OpenSSL 库分支为其添加了 TLS 加密。其余代码似乎工作正常,但我认为我没有正确执行证书。
我在服务器上有一个私有/公共证书,它不仅应该用于加密通信,还应该确保服务器确实是客户端想要与之交谈的人。这就是我无法弄清楚的部分:
-
如何将服务器的公钥提供给客户端?它需要它来验证它是否正在与正确的服务器通信。还是我应该做其他事情,也许涉及根 CA 的证书?有API可以提供吗?我可以将公钥与可执行文件打包为
.pem
,但我找不到 API 来告诉 OpenSSL 有关用于客户端请求的公共服务器密钥或根 CA。 -
如何获取客户端的系统证书?现在我只是在
.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_file
和SSL_CTX_use_PrivateKey_file
尝试使用该.pem
文件,如果仍然不起作用,请将其写入注释中。
希望这对您有所帮助。
感谢 SteffenUllrich 和 schacker22 帮助我解决这个问题。这是我在他们的指导下拼凑的解决方案:
连接后,客户端使用 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 套接字,所以如果您在这里发现任何问题,请告诉我。这个练习的重点是如何正确地做。
- OpenSSL TLS服务器-使用客户端证书白名单
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 通过 OpenSSL C++从证书获取颁发者证书
- 如何使用openssl续订过期的证书密钥或创建自签名证书密钥any.pem Poco c ++
- 将私钥和证书存储在C++/OpenSSL中
- openssl 是否需要熵用于生成证书和密钥以外的其他目的?
- 如何读取证书以使用 openssl 验证签名
- 如何使用openssl解析带有奇怪OID的x509证书
- OpenSsl无法读取DER格式的证书
- OpenSSL X509证书获得弦乐人类可读
- 证书验证在客户端服务器通信中使用boost :: asio和openssl失败
- 如何在OpenSSL中获取SSL证书
- 无法使用OpenSSL验证服务器证书
- 如何使用OpenSSL从证书中提取所有OID
- 获取Openssl证书错误中的错误字符串
- 有没有办法获取 OpenSSL X509 证书名称,该证书名称将在 C++ 中发送到对等方
- 如何在 OpenSSL 中使用 SSL 证书与 gsoap,使用 C++ 客户端/服务器
- 如何正确实施 OpenSSL 证书
- 创建由我自己签名的OpenSSL证书
- DHE交换的OpenSSL证书生成