我正在尝试在我的应用程序中实现多平台设备/客户端证书检查。 我想为 Windows 和 Mac 实现,所以在 c++ 中的常见实现只有很少的平台特定代码。 我也集成了 OpenSSL。
我在 Windows 个人商店中安装了客户端证书,在登录 key 链中为 Mac 安装了客户端证书。
我有一个 .pem 文件形式的 CA 链。
我想使用 openssl 从 Pem 文件获取叶 CA,而不是使用颁发者名称并使用平台特定代码从设备获取匹配的客户端证书。 比我想获取 clinet 证书的上下文并使用 openssl 再次验证 CA 链
这里的问题是, 1.如何从PEM中获取叶子 2. 如何在Windows/mac 中恢复已安装的客户端证书的公共(public)部分?
问候, 比拉坚杜
最佳答案
这是一段代码
X509_STORE *openssl_store = NULL;
X509_STORE_CTX *vrfy_ctx = NULL;
OpenSSL_add_all_algorithms();
if (!(openssl_store=X509_STORE_new())) {
printf("Error creating X509_STORE_CTX object");
return false;
}
vrfy_ctx = X509_STORE_CTX_new();
if (NULL == vrfy_ctx) {
printf("X509_STORE_CTX_new failed");
return false;
}
if (1 != X509_STORE_load_locations(openssl_store, tmpCertFile.c_str(), NULL)) {
printf("Error loading CA cert or chain file");
return false;
}
HCERTSTORE hStore = NULL;
BYTE *pCert = NULL;
DWORD dwCert = 0;
PCCERT_CONTEXT pCertContext = NULL;
//Open Personal Certificate Store
hStore = CertOpenSystemStore(0, TEXT("MY"));
if (hStore == NULL) {
printf("CertOpenSystemStore failed, error : %d", GetLastError());
return false;
}
//Enumerate Certificate Store
while (pCertContext = CertEnumCertificatesInStore(hStore, pCertContext)) {
const unsigned char *cert_data = pCertContext->pbCertEncoded;
X509 *cert = d2i_X509(NULL, &cert_data, pCertContext->cbCertEncoded);
X509_STORE_CTX_init(vrfy_ctx, openssl_store, cert, NULL);
int ret = X509_verify_cert(vrfy_ctx);
X509_STORE_CTX_cleanup(vrfy_ctx);
if (1 == ret) {
printf("Matching client certificate found");
return true;
}
if (cert) {
X509_free(cert);
}
}
if (hStore) {
CertCloseStore(hStore, CERT_CLOSE_STORE_CHECK_FLAG);
}
关于macos - 如何验证系统中安装的客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39403652/