将PFX证书导入USB-KEY
来源:互联网 发布:网络暴力 电影 2011 编辑:程序博客网 时间:2024/06/03 23:42
**************************************************************************************************
(1)利用PFXImportCertStore函数将P12结构证书导入一个临时的内存型证书库,注意要用
CRYPT_EXPORTABLE 标志,获得该库的句柄hImportStore。
(3)利用CertFindCertificateInSto
(4)利用上面得到的证书上文pCertContext,通过CryptAcquireCertificateP
(5)利用临时CSP句柄hCryptProv,私钥的类型dwKeySpec,通过CryptGetUserKey获得证书对应的私钥句柄hUserKey。
(6)利用私钥句柄hUserKey,通过CryptExportKey将私钥以PRIVATEKEYBLOB的形式导出来,获得私钥的blob和长度。
(7) 通过CryptAcquireContext函数,创建密钥容器并获得USBKey CSP的句柄hProv。
(8) 利用获得hProv和上面获得的私钥blob和长度,通过CryptImportKey函数将私钥导进USBKey CSP中,并返回私钥句柄hKey。
(9) 利用私钥句柄hKey,和前面获得的证书上下文pCertContext的内容,通过CryptSetKeyParam函数,KP_CERTIFICATE标志将证书写进对应的密钥容器。
**************************************************************************************************
网上找到的代码貌似都不太靠谱,于是自己写了一个,下面只公布主要的函数
- void
CImportPFXDlg::ImportPFX( LPCTSTRPFX_FILE, LPCTSTRPFX_PASS) - {
//打开文件 HANDLEhFile = NULL; hFile = ::CreateFile(PFX_FILE, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(hFile == INVALID_HANDLE_VALUE) { "CreateFile::AfxMessageBox(_T( Fail!" )); return;} //分配内存 DWORDdwSize = ::GetFileSize(hFile, NULL); BYTE*pP12 = NULL; if(!(pP12 new= BYTE[dwSize])) { ::CloseHandle(hFile); "new::AfxMessageBox(_T( pP12 ));Fail!" return;} //读取证书内容 DWORDdwRead = 0; if(!::ReadFile(hFile, pP12, dwSize, &dwRead, NULL)) { ::CloseHandle(hFile); "ReadFile::AfxMessageBox(_T( Fail!" )); return;} //关闭文件::CloseHandle(hFile); //生成结构体CRYPT_DATA_BLOB CDB; CDB.cbData = dwSize; CDB.pbData = pP12; //将证书导入临时证书库HCERTSTORE hStore = NULL; if(!(hStore = PFXImportCertStore(&CDB, PFX_PASS, CRYPT_EXPORTABLE))) { deletepP12; pP12 = NULL; "PFXImportCertStore::AfxMessageBox(_T( Fail!" )); return;} deletepP12; pP12 = NULL; //枚举临时证书库中导入的证书PCCERT_CONTEXT pCertContext = NULL; HCRYPTPROV hCertProv = NULL; HCRYPTKEY hKey = NULL; BYTE*pPK = NULL; HCRYPTKEY hPrvKey = NULL; HCRYPTPROV hProv = NULL; while(pCertContext = CertEnumCertificatesInSt ore(hStore, pCertContext)) { //对比“颁发给”和“颁发者”是否一致(对于根证书是一致的,不要导入根证书) //if(!CertCompareCertificateNa me(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, //&pCertContext->pCertInfo->Issuer, //&pCertContext->pCertInfo->Subject)) { //获取私钥临时CSP 句柄 DWORDdwKeySpec = 0; if(!CryptAcquireCertificateP rivateKey(pCertContext, CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL, &hCertProv, &dwKeySpec, NULL)) { DWORDdwRet = GetLastError(); "CryptAcquireCertificateP::AfxMessageBox(_T( rivateKey ));Fail!" gotocleanup; } //获取密钥对 if(!CryptGetUserKey(hCertProv, ((m_cmbCertType.GetCurSel() == 0) ? AT_KEYEXCHANGE : AT_SIGNATURE), &hKey)) { DWORDdwRet = GetLastError(); "CryptGetUserKey::AfxMessageBox(_T( Fail!" )); gotocleanup; } //获取私钥长度 DWORDdwPKSize = 0; if(!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, NULL, &dwPKSize)) { DWORDdwRet = GetLastError(); "CryptExportKey::AfxMessageBox(_T( dwPKSize ));Fail!" gotocleanup; } //分配内存 if(!(pPK new= BYTE[dwPKSize])) { DWORDdwRet = GetLastError(); "new::AfxMessageBox(_T( pPK ));Fail!" gotocleanup; } //导出私钥 if(!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, pPK, &dwPKSize)) { DWORDdwRet = GetLastError(); "CryptExportKey::AfxMessageBox(_T( pPK ));Fail!" gotocleanup; } //获取UKEY 的 CSP 句柄 //获取密钥容器名称CString csContainer; if(m_cmbContainer.GetCurSel() //新建密钥容器== 0) { m_edtContainer.GetWindowText(csContainer); if(!CryptAcquireContext(&hProv, LPCTSTR)csContainer,( CSP_NAME, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { DWORDdwRst = ::GetLastError(); "CryptAcquireContext::AfxMessageBox(_T( m_edtContainer ));Fail!" gotocleanup; } } else//证书导入现有容器 { m_cmbContainer.GetWindowText(csContainer); if(!CryptAcquireContext(&hProv, LPCTSTR)csContainer,( CSP_NAME, PROV_RSA_FULL, 0)) { DWORDdwRst = ::GetLastError(); "CryptAcquireContext::AfxMessageBox(_T( m_cmbContainer ));Fail!" gotocleanup; } } //将私钥导入到CSP,并获取其句柄 if(!CryptImportKey(hProv, pPK, dwPKSize, NULL, 0, &hPrvKey)) { DWORDdwRst = ::GetLastError(); "CryptImportKey::AfxMessageBox(_T( Fail!" )); gotocleanup; } //将证书导入到密钥容器 if(!CryptSetKeyParam(hPrvKey, KP_CERTIFICATE, pCertContext->pbCertEncoded, 0)) { DWORDdwRst = ::GetLastError(); "CryptSetKeyParam::AfxMessageBox(_T( Fail!" )); gotocleanup; } break;} } - cleanup:
//销毁私钥句柄CryptDestroyKey(hPrvKey); //关闭UKEY 的 CSP 句柄 CryptReleaseContext(hProv, 0); //释放私钥内存 deletepPK; pPK = NULL; //销毁密钥对句柄CryptDestroyKey(hKey); //释放证书句柄CertFreeCertificateConte xt(pCertContext); //关闭临时证书库CertCloseStore(hStore, 0); - }
- [C++]将PFX证书导入USB-KEY
- 将PFX证书导入USB-KEY
- [C++]将PFX证书导入USB-KEY
- 将PFX证书导入USB-KEY
- Linux下pfx证书导出key和crt
- OpenSSL生成.key、.crt、.pfx证书(Windows下)
- Microsoft Windows 2008 IIS 7.0 -PFX证书导入
- pfx证书转jks
- java生成PFX证书
- java生成pfx证书
- PFX证书文件制作
- java生成PFX证书
- PFX 证书 转 jks 证书
- 使用OpenSSL将pfx证书转换成cer格式的证书
- 将证书导入到jre
- 公钥证书cer,pfx
- 证书pfx的生成步骤
- Java处理PFX格式证书
- 深入理解PHP原理之变量分离/引用(Variables Separation)
- 家德瑞入门教程(第7章 Homedear命名体系)
- [Cocoa]XCode的一些调试技巧
- 知识总结 ExtJs"入门"
- 第三,四,五,十一章 设计模式和面向对象的各种规则(读书笔记)
- 将PFX证书导入USB-KEY
- DataTable中三种获取参数值的方法
- How to write to TO CHAR and TO DATE SQL SERVER
- C++ socket实现获取本机IP&MAC
- Java的Properties文件操作类
- android-drawable大小
- js switch case default 的用法
- Android学习笔记: 第三天
- Oracle中的Translate与Replace