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

Macos 如何验证系统中安装的客户端证书,macos,winapi,ssl,openssl,cryptoapi,Macos,Winapi,Ssl,Openssl,Cryptoapi,我正在尝试在我的应用程序中实现多平台设备/客户端证书chck。 我想实现Windows和MAC,所以在C++中共同实现了很少的平台特定代码。 我也集成了OpenSSL 我在Windows个人商店中安装了客户端证书,在登录密钥链中为Mac安装了客户端证书 我有一个CA链作为.pem文件的形式 我想使用openssl从Pem文件中获取leaf CA,而不是使用颁发者名称和特定于平台的代码从设备中获取匹配的客户端证书。 然后我想获取clinet证书的上下文,并使用openssl对CA链进行验证 我的问

我正在尝试在我的应用程序中实现多平台设备/客户端证书chck。 我想实现Windows和MAC,所以在C++中共同实现了很少的平台特定代码。 我也集成了OpenSSL

我在Windows个人商店中安装了客户端证书,在登录密钥链中为Mac安装了客户端证书

我有一个CA链作为.pem文件的形式

我想使用openssl从Pem文件中获取leaf CA,而不是使用颁发者名称和特定于平台的代码从设备中获取匹配的客户端证书。 然后我想获取clinet证书的上下文,并使用openssl对CA链进行验证

我的问题是, 1.如何从PEM中获取树叶 2.如何在Windos/mac中检索已安装客户端证书的公共部分

问候,,
Birajendu

这是一段代码

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);
}

我能够搜索客户端证书表单个人存储与发卡机构名称的帮助,并能够获得证书上下文的情况下,Windows。