c++ - 在 Linux 中通过 casablanca / cpprest 使用 TLS 客户端身份验证
问题描述
我想切换到cpprest
需求REST
,但是,在我的场景中,TLS
需要支持客户端身份验证。
我浏览了库的功能,但我不确定是否内置了对客户端身份验证的支持。
尝试获得此功能有一些技巧,但它似乎只是Windows
暂时的,这对我不起作用,因为我的服务器在Linux
.
此页面https://github.com/Microsoft/cpprestsdk/issues/810描述了 Windows 的一个这样的解决方法,并暗示它如何在Linux
构建中工作,但我不知道如何去做,因为我在该地区的经验很少。
解决TLS
客户端身份验证问题Windows
-
#include <Wincrypt.h>
std::vector<uint8_t> pkcs12_data; // "... your client certificate PKCS#12 with private key goes here ...";
utility::string_t password = "pkcs12_password";
web::http::client::http_client_config cfg;
cfg.set_nativehandle_options([=] (web::http::client::native_handle h) {
CRYPT_DATA_BLOB data;
data.cbData = pkcs12_data.size();
data.pbData = reinterpret_cast<BYTE *>(pkcs12_data.data());
HCERTSTORE hCertStore = PFXImportCertStore(&data, password.c_str(), 0);
PCCERT_CONTEXT hContext = CertFindCertificateInStore(
hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY,
NULL, NULL);
WinHttpSetOption(h, WINHTTP_OPTION_CLIENT_CERT_CONTEXT,
(LPVOID)hContext, sizeof(CERT_CONTEXT));
});
web::http::client::http_client http_client(PS("https://secure.com"), cfg);
解决方案
推荐阅读
- c++ - 如何阻止角色在控制台中移动?
- java - 一旦我运行我的 Appium 脚本,线程“主”java.lang.NoClassDefFoundError 中的异常
- javascript - 无法使用 Ace 作为 RequireJS 依赖项
- select - 触发选择选项(选项包含多个单词)
- spring-boot - 带有 jsp 视图和 Swagger-ui 的 Spring-boot Spring-MVC 应用程序
- java - 跨类共享相同的变量
- r - 如何将具有 4 个级别的有序分类变量转换为定量变量
- arrays - 查找并返回数组中出现频率最高的元素
- security - ElectronJS:在 DOM 中加载用户本地文件的最安全方法是什么(
- r - 通过 rvest 登录 LinkedIn 的问题