找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3777|回复: 0

[原]VC++网络安全编程范例(1)--数字证书有效期验证

[复制链接]
发表于 2012-3-8 14:42:35 | 显示全部楼层 |阅读模式
  数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authorit y)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权 中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一 个公开密钥、名称以及证书授权中心的数字签名。一般情况下证书中还包括密钥的有 效时间,发证机关(证书授权中心)的名称,该证书的序列号等信息,证书的格式遵循 ITUT X.509国际标准
  一个标准的X.509数字证书包含以下一些内容:
  证书的版本信息;
  证书的序列号,每个证书都有一个唯一的证书序列号;
  证书所使用的签名算法;
  证书的发行机构名称,命名规则一般采用X.500格式;
  证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
  证书所有人的名称,命名规则一般采用X.500格式;
  证书所有人的公开密钥;
  证书发行者对证书的签名


代码如下,分析见源码
  1. #ifndef _WIN32_WINNT
  2. #define _WIN32_WINNT 0x0400
  3. #endif
  4. #include <stdio.h>
  5. #include <windows.h>
  6. #include <wincrypt.h>
  7. #define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
  8. void HandleError(char *s);
  9. void main(void)
  10. {
  11.         //-------------------------------------------------------------------
  12.         // 变量申明与初始化
  13.         HCERTSTORE      hSystemStore;
  14.         PCCERT_CONTEXT  pTargetCert=NULL;
  15.         PCERT_INFO      pTargetCertInfo;
  16.         char            szSubjectName[] = "China-wuhan-ruanou";
  17.                                                   // 证书客体名称,应保证此证书在证书库中有效
  18.         //-------------------------------------------------------------------
  19.         // 打开系统证书库
  20.         if(hSystemStore = CertOpenStore(
  21.                   CERT_STORE_PROV_SYSTEM,  // 系统证书库
  22.                   0,                       // 编码类型,这里不需要
  23.                   NULL,                    // 使用默认的CSP
  24.                   CERT_SYSTEM_STORE_CURRENT_USER,//系统库存储位置
  25.                   L"MY"))                        // 系统库名称
  26.         {
  27.            printf("打开系统证书库成功. MY 证书库已经打开. \n");
  28.         }
  29.         else
  30.         {
  31.            HandleError( "打开根证书库出错.");
  32.         }
  33.         //-------------------------------------------------------------------
  34.         // 在系统证书库中查询证书
  35.         if(pTargetCert = CertFindCertificateInStore(
  36.                   hSystemStore,           // 证书库句柄,系统证书库
  37.                   MY_ENCODING_TYPE,       // 编码类型
  38.                   0,                      // 不需要设置标志位
  39.                   CERT_FIND_SUBJECT_STR_A,// 查找标准为:证书客体名称为szSubjectName
  40.                   szSubjectName,          // 证书客体名称
  41.                   pTargetCert))           // 上次查找到的证书, 第一次查找,从证书库开始位置查找
  42.         {
  43.            printf("找到了此证书. \n");
  44.         }
  45.         else
  46.         {
  47.            HandleError("未能找到所需的证书.");
  48.         }
  49.         //-------------------------------------------------------------------
  50.         // 证书有效期验证
  51.         pTargetCertInfo = pTargetCert->pCertInfo;   
  52.         switch(CertVerifyTimeValidity(
  53.                   NULL,               // 使用当前时间
  54.                   pTargetCertInfo))   // 欲验证有效期的证书指针
  55.         {
  56.            case -1 :
  57.            {
  58.                         printf("证书无效. \n");
  59.                         break;
  60.            }
  61.            case 1:
  62.            {
  63.                    printf("证书已过期. \n");
  64.                    break;
  65.            }
  66.            case 0:
  67.            {
  68.                   printf("证书的时间有效. \n");
  69.                   break;
  70.                 }
  71.         };
  72.         //-----------------
复制代码

作者:yincheng01 发表于2011-10-5 21:15:43 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 18:18 , Processed in 0.026964 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表