2016-09-09 14 views
-1

私のアプリでマルチプラットフォームデバイス/クライアント証明書のchckを実装しようとしています。 私はWindowsとMac用に実装したいので、プラットフォーム固有のコードがほとんどないC++の共通実装です。 私はOpenSSLも統合されています。システムにインストールされているクライアント証明書を確認する方法

Windowsのパーソナルストアにはクライアント証明書が、ログインキーチェーンにはMacがインストールされています。

私は、.pemファイルの形式としてCAチェーンを持っています。

opensslを使用してPemファイルからリーフCAを取得し、発行者名を使用してプラットフォーム固有のコードを使用して、デバイスから一致するクライアント証明書を取得したいとしました。私はここに私のため

にCAチェーンagaint確認するために、問題をclinetの証明書と使用のopensslのコンテキストを取得したいたより は、公共のretriveする方法PEM 2から葉を取得する方法、 1です。両方のWindos/macにインストールされたクライアント証明書の一部?ここ

よろしく、 Birajendu

+0

の一部である私は、発行者名の助けを借りて、クライアント証明書のフォーム個人ストアを検索することができ、そして場合に証明書コンテキストを取得することができていますWindowsの。 – Birajendu

答えて

0

コード

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); 
} 
関連する問題