c++ - 如何正确执行 OpenSSL 证书?

标签 c++ sockets openssl certificate libressl

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

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

  1. 如何将服务器的公钥提供给客户端?客户端需要它来验证是否正在与正确的服务器通信。或者我应该做其他事情,也许涉及根 CA 的证书?有API可以提供吗?我可以将公钥与可执行文件打包为 .pem,但我找不到 API 来告诉 OpenSSL 用于客户端请求的公共(public)服务器 key 或根 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_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文件试试,如果还是不行,就写在注释里。

希望这对您有帮助。

关于c++ - 如何正确执行 OpenSSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27036750/

相关文章:

c++ - 在 C++ 中扩展运算符重载

c++ - 使用 AES-256-CBC 模式 openssl 的数据加密,不会返回不需要填充的相同大小的数据吗?

php - 在 WAMP/Apache 的 openssl.exe 中找不到序号 372

c++ - 基于套接字的事件循环

c# - 使用 C# 在 Linux 防火墙后接收大型 UDP 数据包失败

java - 通过 TCP 的 DNS 查询

c++ - 有没有办法获取我发送给 C++ 中的对等方的 OpenSSL X509 证书名称?

c++ - 将 C 字符串分配给指向字符的指针 - C++ 程序崩溃

c++ - 从 C `goto` 错误处理范例转换到 C++ 异常处理范例

c++ - 两个其他方面相同的功能(一个使用模板模式,另一个不使用)