我目前正在修补什么是有效的 chat server 。由于我不想过多地暴露我的用户,因此我使用 LibreSSL 的 OpenSSL 库分支添加了 TLS 加密。其余代码似乎工作正常,但我认为我没有正确执行证书。
我在服务器上有一个私有(private)/公共(public)证书,该证书不仅用于加密通信,还用于确保服务器确实是客户端想要与之交谈的人。这是我无法弄清楚的部分:
如何将服务器的公钥提供给客户端?客户端需要它来验证是否正在与正确的服务器通信。或者我应该做其他事情,也许涉及根 CA 的证书?有API可以提供吗?我可以将公钥与可执行文件打包为
.pem
,但我找不到 API 来告诉 OpenSSL 用于客户端请求的公共(public)服务器 key 或根 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_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_file
和 SSL_CTX_use_PrivateKey_file
用那个.pem
文件试试,如果还是不行,就写在注释里。
希望这对您有帮助。
关于c++ - 如何正确执行 OpenSSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27036750/