macos - 如何验证系统中安装的客户端证书

标签 macos winapi ssl openssl cryptoapi

我正在尝试在我的应用程序中实现多平台设备/客户端证书检查。 我想为 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/

相关文章:

python - 在 Mac 上安装 pyqt (v4.8) 时出错

c++ - 使用 FILE_ATTRIBUTE_TEMPORARY 和 FILE_FLAG_DELETE_ON_CLOSE

c++ - 如何构建捕获所有异常的 C++ Dll 包装器?

java - 如何从 Android 执行 HTTPS POST?

ssl - 将 SSL 证书从 .pfx 转换为 .key

在 Mac OS X 上移动到另一个屏幕/桌面/显示器时,Java Swing 应用程序窗口消失

macos - 删除XCode 4中的默认代码段

python - 错误: "Traceback (most recent call last):"

python - 确定(Windows)上是否存在 PID 的快速方法?

php - 在 Codeigniter 中将 http 重定向到 https