📄 inituser.c
字号:
/*
运行该函数之前,必须保证系统中有一个MY证书库,证书库
中必须包含主题为"Microsoft"和"Test Certificate"的证书。
*/
#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 hSystemStore; //系统库句柄
HCERTSTORE hMemoryStore; //内存库句柄
HCERTSTORE hDuplicateStore; //打开库的副本的句柄
PCCERT_CONTEXT pDesiredCert = NULL; //第一个调用CertFindCertificateInStore设置为空
PCCERT_CONTEXT pCertContext;
HANDLE hStoreFileHandle ; // 输出文件句柄
LPCSTR pszFileName = "TestStor.sto"; // 输出文件名句柄
//-------------------------------------------------------------------
//在内存中打开一个新的证书库
if(hMemoryStore = CertOpenStore(
CERT_STORE_PROV_MEMORY, //内存库
0, //编码类型,没有使用
NULL, // 使用默认CSP
0, // 没有标志
NULL)) // 不需要
{
printf("已打开内存库");
}
else
{
HandleError( "内存库打开错误");
}
//-------------------------------------------------------------------
//打开MY系统库
if(hSystemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM, // 系统库为虚拟库
0, //编码类型,没有使用
NULL, //使用默认HCRYPTPROV.
CERT_SYSTEM_STORE_CURRENT_USER,
//设置注册表中的系统库
L"MY")) //使用以前定义的系统库MY
{
printf("打开了MY系统库\n");
}
else
{
HandleError( "不能打开MY系统库");
}
//--------------------------------------------------------------------
//创建MY库的副本
if(hDuplicateStore = CertDuplicateStore(hSystemStore))
{
printf("MY库已经被复制\n");
}
else
{
printf("复制MY库失败\n");
}
//-------------------------------------------------------------------
//获取主题为"Microsoft"的证书
if(pDesiredCert=CertFindCertificateInStore(
hSystemStore,
MY_ENCODING_TYPE, // 使用X509_ASN_ENCODING
0, //不需要标志
CERT_FIND_SUBJECT_STR, // 查找主题为指定字符串的证书
L"Microsoft", // 指定的字符串,为要查找的证书主题
NULL)) //该参数第一给调用为NULL
//下一次调用中为函数返回的最后一个指针
{
printf("已经找到符合条件的证书\n");
}
else
{
HandleError("不能找到符合条件的证书");
}
//-------------------------------------------------------------------
// pDesiredCert是主题为"Microsoft"的证书指针。
//从一个存在的证书编码部分创建一个新的证书
if(pCertContext = CertCreateCertificateContext(
MY_ENCODING_TYPE , // 编码类型
pDesiredCert->pbCertEncoded, //从证书中接收的编码数据
pDesiredCert->cbCertEncoded)) //编码数据长度
{
printf("新的证书已经被创建\n");
}
else
{
HandleError("新的证书不能被创建");
}
//--------------------------------------------------------------------
// 从MY库中往内存库中增加证书
if(CertAddCertificateContextToStore(
hMemoryStore, // 证书库句柄
pDesiredCert, // 指向证书的指针
CERT_STORE_ADD_USE_EXISTING,
NULL))
{
printf("证书已增加到内存库中\n");
}
else
{
HandleError("不能往内存库中增加证书");
}
//-------------------------------------------------------------------
// 在MY库中查找另外一个不同的证书,并往内存库中增加它的一个连接。
//获取主题为"TEST CERTIFICATE"的证书
if(pDesiredCert=CertFindCertificateInStore(
hSystemStore,
MY_ENCODING_TYPE, // 使用X509_ASN_ENCODING
0, //不需要标志
CERT_FIND_SUBJECT_STR, // 查找主题为指定字符串的证书
L"TEST CERTIFICATE", // 指定的字符串,为要查找的证书主题
NULL)) //该参数第一给调用为NULL
//下一次调用中为函数返回的最后一个指针
{
printf("已经找到主题为'TEST CERTIFICATE'的证书\n");
}
else
{
HandleError("不能找到主题为'TEST CERTIFICATE'的证书");
}
//--------------------------------------------------------------------
// 从MY库到新的内存库增加一个TEST CERTIFICATE证书的连接
if(CertAddCertificateLinkToStore(
hMemoryStore, //库句柄
pDesiredCert, // 指向证书的指针
CERT_STORE_ADD_USE_EXISTING,
NULL))
{
printf("证书连接已增加到内存中库\n");
}
else
{
HandleError("不能往内存库中增加证书连接");
}
//创建一个文件存储新的证书库和证书
if(hStoreFileHandle = CreateFile(
pszFileName, // 文件路径
GENERIC_WRITE, // 存取权限
0, // 共享模式
NULL, // 安全性
CREATE_ALWAYS, // 创建文件方法
FILE_ATTRIBUTE_NORMAL,// 文件属性
NULL)) // 模板
{
printf("在磁盘中创建一个新的文件\n");
}
else
{
HandleError("磁盘中创建新文件失败");
}
//-------------------------------------------------------------------
// hStoreFileHandle为输出文件句柄
//把内存库及其证书存储到输出文件中
if( CertSaveStore(
hMemoryStore, // 库句柄
0, // 编码类型,不需要
CERT_STORE_SAVE_AS_STORE,
CERT_STORE_SAVE_TO_FILE,
hStoreFileHandle, //打开文件句柄
0)) // dwFlags,不需要
{
printf("把内存库保存到文件中\n");
}
else
{
HandleError("不能把内存库保存到文件中");
}
//-------------------------------------------------------------------
// 关闭库和文件。重新打开文件库,并检查其内容
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, //使用默认HCRYPTPROV.
0,
L"TestStor.sto" )) //库名字
{
printf("文件库已经被重新打开\n");
}
else
{
printf("文件库不能被重新打开\n");
}
//--------------------------------------------------------------------
//在打开的文件库中查找证书连接
//获取主题为"TEST CERTIFICATE"的证书
if(pDesiredCert=CertFindCertificateInStore(
hSystemStore,
MY_ENCODING_TYPE, // 使用X509_ASN_ENCODING
0, //不需要标志
CERT_FIND_SUBJECT_STR, // 查找主题为指定字符串的证书
L"TEST CERTIFICATE", // 指定的字符串,为要查找的证书主题
NULL)) //该参数第一给调用为NULL
//下一次调用中为函数返回的最后一个指针
{
printf("在文件库中找到了证书连接\n");
}
else
{
HandleError("在文件库中没有找到证书连接");
}
//-------------------------------------------------------------------
// 资源释放
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(hMemoryStore)
CertCloseStore(
hMemoryStore,
CERT_CLOSE_STORE_CHECK_FLAG);
if(hSystemStore)
CertCloseStore(
hSystemStore,
CERT_CLOSE_STORE_CHECK_FLAG);
if(hStoreFileHandle)
CloseHandle(hStoreFileHandle);
printf("所有的库和文件都已经关闭\n");
return;
}
//错误处理函数
void HandleError(char *s)
{
printf("在运行程序时出现错误\n");
printf("%s\n",s);
printf("错误代号 %x\n.",GetLastError());
printf("程序终止运行\n");
exit(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -