当前位置:编程学习 > VC++ >>

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

 数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在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; 
        } 
    }; 
    //----------------- 

摘自:YinCheng的博客

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,