使用 Boost Beast 在 SSL 连接中构建特定于平台的客户端身份验证

Using Boost Beast to build Platform specific client-side authentication in SSL connection

我正在 macOS 平台上开发基于 boost::beast 的应用程序,我想知道如何提供客户端证书以针对服务器进行身份验证?

基本上,在 macOS 中,证书存储在钥匙串中,无法导出(由称为 secured-enclave 的专用硬件支持,以提高安全性)…

所以我想知道是否有任何回调适合使用本机 macOS 本机代码手动签署服务器的挑战,将挑战发送到 keychain/secure-enclave 进行签名。

基本上,我正在寻找具有大致以下签名的回调:

bool validate_client_side_certificate(const std::string& challenge) 

所以基本上我做对的不是从文件中提供证书+私钥的能力


boost::asio::ssl::context ctx_;
std::string client_cert_ = read_pem_file(client_cert_path);
std::string client_cert_private_key_ = read_pem_file(private_key_path);

ctx_.use_certificate(
   boost::asio::buffer(client_cert_.c_str(), client_cert_.length()),
   boost::asio::ssl::context::pem);
ctx_.use_private_key(
   boost::asio::buffer(client_cert_key_.c_str(),                                            client_cert_key_.length()),
   boost::asio::ssl::context::pem);

此流程完美运行,但如果我想使用钥匙串(用于加密数据的 macOS 存储)内的证书,我无法获得私钥,只能获得一个参考(因为它受到保护)。

所以在 macOS 中,我们不能只向 ctx_do 提供私钥,挑战将自动签名。相反,我们需要获取在需要客户端身份验证时发生的回调以及质询...并使用 macOS 本机代码使用密钥引用在钥匙串硬件内部对质询进行签名。

set_verify_callback

这里有例子:

  • asio/example/cpp11/ssl/client.cpp
  • asio/example/cpp03/ssl/client.cpp

您可以看到它集成在 Beast 的 ssl_stream 中:https://www.boost.org/doc/libs/1_78_0/libs/beast/doc/html/beast/ref/boost__beast__ssl_stream/set_verify_callback/overload2.html