/* ** 電子証明書から情報を取り出す */ #include "stdafx.h" #include #include #include "Cert514M.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一のアプリケーション オブジェクトです。 CWinApp theApp; using namespace std; int test() { HCRYPTPROV hProv; HCERTSTORE hStore; // CSPハンドルの取得 if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, NULL)) { if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { fprintf(stderr, "CryptAcquireContext error\n"); return 1; } } // 証明書ストアーのオープン hStore = CertOpenSystemStore( hProv, "MY"); if(!hStore) { fprintf(stderr, "CertOpenSystemStore error\n"); return 2; } // 電子証明書の取り出し PCCERT_CONTEXT pcCert; pcCert = CryptUIDlgSelectCertificateFromStore( hStore, NULL, NULL, NULL, 0, 0, NULL); if(!pcCert) { CertCloseStore(hStore, 0); CryptReleaseContext(hProv, 0); return 1; } // 表示 // バージョン printf("バージョン = %d\n", pcCert->pCertInfo->dwVersion); char pstr[1000]; DWORD cstr = 1000; // アルゴリズム cstr = 1000; CryptBinaryToString(pcCert->pCertInfo->SerialNumber.pbData, pcCert->pCertInfo->SerialNumber.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Data =\n%s\n", pstr); printf("アルゴリズム OID = %s\n", pcCert->pCertInfo->SignatureAlgorithm.pszObjId); cstr = 1000; CryptBinaryToString(pcCert->pCertInfo->SignatureAlgorithm.Parameters.pbData, pcCert->pCertInfo->SignatureAlgorithm.Parameters.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Data =\n%s\n", pstr); // 発行者 cstr = 1000; CryptBinaryToString(pcCert->pCertInfo->Issuer.pbData, pcCert->pCertInfo->Issuer.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Data =\n%s\n", pstr); cstr = 1000; CertNameToStr(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &pcCert->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, pstr, cstr); printf("Name =\n%s\n", pstr); // 有効期間 COleDateTime notBefore(pcCert->pCertInfo->NotBefore); COleDateTime notAfter(pcCert->pCertInfo->NotAfter); notBefore += COleDateTimeSpan(0, 9, 0, 0); // 日本時間への変換 notAfter += COleDateTimeSpan(0, 9, 0, 0); // 日本時間への変換 printf("有効期限の開始: %s\n", (LPCTSTR)notBefore.Format("%Y/%m/%d %H:%M:%S")); printf("有効期限の終了: %s\n", (LPCTSTR)notAfter.Format("%Y/%m/%d %H:%M:%S")); // サブジェクト cstr = 1000; CryptBinaryToString(pcCert->pCertInfo->Subject.pbData, pcCert->pCertInfo->Subject.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Data =\n%s\n", pstr); cstr = 1000; CertNameToStr(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &pcCert->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, pstr, cstr); printf("Name =\n%s\n", pstr); // 公開鍵情報 cstr = 1000; CryptBinaryToString(pcCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, pcCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, CRYPT_STRING_HEXASCIIADDR, pstr, &cstr); printf("Data =\n%s\n", pstr); printf("アルゴリズム:%s\n", pcCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId); printf("サイズ = %d, 未使用ビット = %d\n", pcCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, pcCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cUnusedBits); // 拡張情報の数 printf("Num = %d\n", pcCert->pCertInfo->cExtension); // 後始末 CertFreeCertificateContext(pcCert); CertCloseStore(hStore, 0); CryptReleaseContext(hProv, 0); return 0; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // MFC を初期化して、エラーの場合は結果を印刷します。 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 必要に応じてエラー コードを変更してください。 _tprintf(_T("致命的なエラー : MFC の初期化ができませんでした。\n")); nRetCode = 1; } else { // TODO: アプリケーションの動作を記述するコードをここに挿入してください。 nRetCode = test(); } return nRetCode; }