|
数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authorit y)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权 中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一 个公开密钥、名称以及证书授权中心的数字签名。一般情况下证书中还包括密钥的有 效时间,发证机关(证书授权中心)的名称,该证书的序列号等信息,证书的格式遵循 ITUT X.509国际标准
一个标准的X.509数字证书包含以下一些内容:
证书的版本信息;
证书的序列号,每个证书都有一个唯一的证书序列号;
证书所使用的签名算法;
证书的发行机构名称,命名规则一般采用X.500格式;
证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
证书所有人的名称,命名规则一般采用X.500格式;
证书所有人的公开密钥;
证书发行者对证书的签名
代码如下,分析见源码- #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 hSystemStore;
- PCCERT_CONTEXT pTargetCert=NULL;
- PCERT_INFO pTargetCertInfo;
- char szSubjectName[] = "China-wuhan-ruanou";
- // 证书客体名称,应保证此证书在证书库中有效
- //-------------------------------------------------------------------
- // 打开系统证书库
- if(hSystemStore = CertOpenStore(
- CERT_STORE_PROV_SYSTEM, // 系统证书库
- 0, // 编码类型,这里不需要
- NULL, // 使用默认的CSP
- CERT_SYSTEM_STORE_CURRENT_USER,//系统库存储位置
- L"MY")) // 系统库名称
- {
- printf("打开系统证书库成功. MY 证书库已经打开. \n");
- }
- else
- {
- HandleError( "打开根证书库出错.");
- }
- //-------------------------------------------------------------------
- // 在系统证书库中查询证书
- if(pTargetCert = CertFindCertificateInStore(
- hSystemStore, // 证书库句柄,系统证书库
- MY_ENCODING_TYPE, // 编码类型
- 0, // 不需要设置标志位
- CERT_FIND_SUBJECT_STR_A,// 查找标准为:证书客体名称为szSubjectName
- szSubjectName, // 证书客体名称
- pTargetCert)) // 上次查找到的证书, 第一次查找,从证书库开始位置查找
- {
- printf("找到了此证书. \n");
- }
- else
- {
- HandleError("未能找到所需的证书.");
- }
- //-------------------------------------------------------------------
- // 证书有效期验证
- pTargetCertInfo = pTargetCert->pCertInfo;
- switch(CertVerifyTimeValidity(
- NULL, // 使用当前时间
- pTargetCertInfo)) // 欲验证有效期的证书指针
- {
- case -1 :
- {
- printf("证书无效. \n");
- break;
- }
- case 1:
- {
- printf("证书已过期. \n");
- break;
- }
- case 0:
- {
- printf("证书的时间有效. \n");
- break;
- }
- };
- //-----------------
复制代码
作者:yincheng01 发表于2011-10-5 21:15:43 原文链接
|
|