CryptoAPI的证书库基本操作代码:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void HandleError(char *s);
void main(void)
{
//--
// 变量申明与初始化
HCERTSTORE hCollectionStore; // 集合证书库句柄
HCERTSTORE hSystemStore; // 系统证书库句柄
HCERTSTORE hMemoryStore; // 内存证书库句柄
PCCERT_CONTEXT pDesiredCert = NULL; // 证书句柄
HANDLE hStoreFileHandle ; // 输出文件句柄
LPCSTR pszFileName = "TestStor.sto"; // 输出文件名
LPWSTR pswzFirstCert = L"TEST_SIGNER_NAME";// 第一个证书客体名称,必须确定在“my”证书库中有此证书
LPWSTR pswzSecondCert = L"China-wuhan-ruanou"; // 第二个证书客体名称 ,必须确定在“my”证书库中有此证书
//--
// 打开一个证书库集合
if(hCollectionStore = CertOpenStore(
CERT_STORE_PROV_COLLECTION, // 集合证书库
0, // 编码类型,这里不需要
NULL, // 使用默认的CSP
0, // 不需要标志位
NULL)) // 不需要此参数
{
printf("打开一个证书库集合. \n");
}
else
{
HandleError( "打开集合证书库出错.");
}
//--
// 打开一个新内存证书库,它是一个临时证书库
if(hMemoryStore = CertOpenStore(
CERT_STORE_PROV_MEMORY, // 内存证书库
0, // 编码类型,这里不需要
NULL, // 使用默认的CSP
0, // 不需要标志位
NULL)) // 不需要此参数
{
printf("打开一个内存证书库. \n");
}
else
{
HandleError( "打开内存证书库出错.");
}
//--
// 打开系统证书库“my”
if(hSystemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM, // 系统证书库
0, // 编码类型,这里不需要
NULL, // 使用默认的CSP
CERT_SYSTEM_STORE_CURRENT_USER,//系统库存储位置
L"MY")) // 系统库名称
{
printf("打开系统证书库 MY. \n");
}
else
{
HandleError( "不能打开 MY 系统证书库.");
}
//--
// 从系统证书库中寻找证书客体名称为DUMMY_SIGNER_NAME的证书
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hSystemStore, // 证书库句柄,系统证书库
MY_ENCODING_TYPE, // 编码类型
0, // 不需要设置标志位
CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert
pswzFirstCert, // 证书客体名称
NULL)) // 第一次查找,从证书库开始位置查找
{
printf("%S 证书被找到. \n",pswzFirstCert);
}
else
{
HandleError("未能找到所期望的证书.");
}
//--
// 把刚寻找到的第一个证书添加到内存证书库中
if(CertAddCertificateContextToStore(
hMemoryStore, // 证书库句柄
pDesiredCert, // 欲添加的证书结构指针
CERT_STORE_ADD_USE_EXISTING, // 当证书库中存在有和此证书匹配的证书或链接时
// 不添加证书,但会把新证书的属性添加到匹配证书中
NULL)) // 添加的证书结构指针的拷贝
{
printf("所找到的证书添加到了内存证书库中. \n");
}
else
{
HandleError("未能将此证书添加到内存证书库中.");
}
//--
// 把内存库添加到证书库集合中。内存库中的全部证书在证书库集合中均有效
if(CertAddStoreToCollection(
hCollectionStore, //证书库集合句柄
hMemoryStore, //欲添加的成员证书库句柄
CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG,// 表示证书、CRL、CTL可以添加到此成员证书库中
1)) // 此成员证书库的优先级
{
printf("内存证书库添加到了证书库集合中.\n");
}
else
{
HandleError("内存证书库未被添加到证书库集合中.");
}
//--
// 在系统证书库my中寻找另一个证书
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hSystemStore, // 证书库句柄,系统证书库
MY_ENCODING_TYPE, // 编码类型
0, // 不需要设置标志位
CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert
pswzSecondCert, // 证书客体名称
NULL)) // 第一次查找,从证书库开始位置查找
{
printf("%S 证书被找到. \n",pswzSecondCert);
}
else
{
HandleError("未能找到另一个证书.");
}
//--
// 添加一个对刚寻找到第二个证书的链接到内存库
if(CertAddCertificateLinkToStore(
hMemoryStore, // 证书库句柄
pDesiredCert, // 欲添加链接的证书结构指针
CERT_STORE_ADD_USE_EXISTING, // 当存在匹配时,不添加证书链接
NULL)) // 添加的证书结构链接指针的拷贝
{
printf("%S 证书的链接添加到了内存证书库. \n",pswzSecondCert);
}
else
{
HandleError("未能将此证书的链接添加到内存证书库中.");
}
//--
// 在内存库中寻找第一个证书,预期查找成功
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hMemoryStore, // 证书库句柄,内存证书库
MY_ENCODING_TYPE, // 编码类型
0, // 不需要设置标志位
CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert
pswzFirstCert, // 证书客体名称
NULL)) // 第一次查找,从证书库开始位置查找
{
printf("%S 证书在内存证书库中找到了. \n",pswzFirstCert);
}
else
{
printf("%S 证书不在内存证书库中.\n", pswzFirstCert);
}
//--
// 在证书库集合中寻找第一个证书,预期查找成功
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hCollectionStore, // 证书库句柄,集合证书库
MY_ENCODING_TYPE, // 编码类型
0, // 不需要设置标志位
CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert
pswzFirstCert, // 证书客体名称
NULL)) // 第一次查找,从证书库开始位置查找
{
printf("%S 证书在集合证书库中被找到. \n", pswzFirstCert);
}
else
{
printf("%S 证书不在集合证书库中.\n", pswzFirstCert);
}
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hCollectionStore, // 证书库句柄,集合证书库
MY_ENCODING_TYPE, // 编码类型
0, // 不需要设置标志位
CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert
pswzSecondCert, // 证书客体名称
NULL)) // 第一次查找,从证书库开始位置查找
{
printf("%S 证书的链接在集合证书库中被找到. \n", pswzSecondCert);
}
else
{
printf("%S 证书的链接不在内存证书库中.\n", pswzSecondCert);
}
if(hStoreFileHandle = CreateFile(
pszFileName, // 文件路径
GENERIC_WRITE, // 访问方式,可写
0, // 共享模式
NULL, // 安全机制
CREATE_ALWAYS, // 直接创建
FILE_ATTRIBUTE_NORMAL, // 文件属性
NULL)) // 文件模版
{
printf("在磁盘上创建了一个新的文件. \n");
}
else
{
HandleError("不能在磁盘上创建文件.");
}
if( CertSaveStore(
hMemoryStore, // 欲保存的证书库句柄
0, // 编码类型不需要
CERT_STORE_SAVE_AS_STORE,// 证书库保存为序列化信息。
CERT_STORE_SAVE_TO_FILE, // 保存到文件中
hStoreFileHandle, // 打开的文件句柄
0))
{
printf("保存了内存证书库到磁盘. \n");
}
else
{
HandleError("未能将内存证书库保存到磁盘上.");
}
printf("\n从集合证书库中删除内存证书库.\n");
CertRemoveStoreFromCollection(
hCollectionStore,
hMemoryStore);
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hMemoryStore, // 证书库句柄,内存证书库
MY_ENCODING_TYPE, // 编码类型
0, // 不需要设置标志位
CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert
pswzSecondCert, // 证书客体名称
NULL)) // 第一次查找,从证书库开始位置查找
{
printf("%S 证书的链接仍在内存证书库中. \n", pswzSecondCert);
}
else
{
printf("此证书的链接不在内存证书库.\n");
}
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hCollectionStore,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
pswzSecondCert,
NULL))
{
printf("The %S link was found in the collection store. \n", pswzSecondCert);
}
else
{
printf("从集合证书库中删除此证书库生效.\n");
printf("%S 证书的链接在集合证书库中未找到.\n",pswzSecondCert);
}
if(hMemoryStore)
CertCloseStore(
hMemoryStore,
CERT_CLOSE_STORE_CHECK_FLAG);
if(hSystemStore)
CertCloseStore(
hSystemStore,
CERT_CLOSE_STORE_CHECK_FLAG);
if(hStoreFileHandle)
CloseHandle(hStoreFileHandle);
printf("全部证书库和文件均已关闭. \n");
if(hMemoryStore = CertOpenStore(
CERT_STORE_PROV_FILENAME, // 文件证书库
MY_ENCODING_TYPE, // 编码类型
NULL, // 使用默认的CSP
0, // 不需要设置
L"TestStor.sto" )) // 文件名
{
printf("文件证书库已经被重新打开. \n");
}
else
{
printf("文件证书不能被重新打开. \n");
}
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(pDesiredCert=CertFindCertificateInStore(
hMemoryStore,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
pswzSecondCert,
NULL))
{
printf("%S 证书的链接在文件证书库中被找到. \n",pswzSecondCert);
}
else
{
printf("此证书的链接不在文件证书库.\n");
}
//--
// 释放内存
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(hMemoryStore)
CertCloseStore(
hMemoryStore,
CERT_CLOSE_STORE_CHECK_FLAG);
printf("全部的证书库和文件均关闭. \n");
} // End of main
void HandleError(char *s)
{
printf("程序运行出错.\n");
printf("%s\n",s);
printf("错误代码 %x\n.",GetLastError());
printf("程序终止.\n");
exit(1);
}
用vs2010错误提示:error C2664 “CreateFileW”:不能将参数1从“LPCSTR”转化为“LPCWSTR” OPESTORES.CPP 228 1 1
IntelliSemse:”LPCSTR”类型的实参与“LPCWSTR”类型的形参不兼容 opestores.cpp 222 5 1
那位高手能告诉本人这是怎么回事,这段代码是书上带的光盘上面的,应该不会错。谢谢
解决方案