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

来源:互联网 发布:cda数据分析一级好考吗 编辑:程序博客网 时间:2024/06/08 12:36

一、准备工作
    1步、必须在#include前进行宏定义
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0xXXXX  //其中0xXXXX对应于下面Windows版本宏定义中的0x0XXX,不同操作系统版本对应不同。
//  
// _WIN32_WINNT version constants  
//  
#define _WIN32_WINNT_NT4                    0x0400  
#define _WIN32_WINNT_WIN2K               0x0500  
#define _WIN32_WINNT_WINXP               0x0501  
#define _WIN32_WINNT_WS03                 0x0502  
#define _WIN32_WINNT_WIN6                  0x0600  
#define _WIN32_WINNT_VISTA                 0x0600  
#define _WIN32_WINNT_WS08                 0x0600  
#define _WIN32_WINNT_LONGHORN     0x0600  
#define _WIN32_WINNT_WIN7                  0x0601


    2步、必须包涵3个头文件和1个宏定义:
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)     //这句的具体用处我还没弄清楚


    3步、具体代码如下:
void main(void)
{
    //------------------------------------------------------------------------------------------------------------------------------------------------------
    //变量申请与初始化
    HCERTSTORE                hSystemStore;
    PCCERT_CONTEXT      pTargetCert = NULL;
    PCERT_INFO                  pTargetCertInfo;
    char                                   szSubjectName[] = "China-wuhan-ruanou";      //证书客体名称,应保证此证书在证书库中有效


    //------------------------------------------------------------------------------------------------------------------------------------------------------
    //打开系统证书库
    if(hSystemStore = CerOpenStore(                                                                                     //以前用的是=号,我改成==,不知道正确不
                                                                 CERT_STORE_PROV_SYSTEM,                            //系统证书库
                                                                 0,                                                                                    //编码类型,默认?
                                                                 NULL,                                                                            //使用默认的CSP
                                                                 CERT_SYSTEM_STORE_CURRENT_USER,     //系统库存储位置
                                                                 L"MY"                                                                             //系统库名称,其中L“MY”前的L不懂什么意思
                                                                )
        )
      {
        printf("打开系统证书库成功。MY证书库已经打开。\n");
      }
      else
      {
        HandleError("打开根证书库出错。");
      }
    //------------------------------------------------------------------------------------------------------------------------------------------------------
    //系统证书库中查询证书
    if(pTargetCert = CertFindCertificateInStore(
                                                                                     hSystemStore,                                          //证书库句柄,系统证书库
                                                                                     MY_ENCODING_TYPE,                          //编码类型
                                                                                     0,                                                                 //不需要设置标志位
                                                                                     CERT_FIND_SUBJECT_STR_A,         //查找标准为:证书客体名称为szSubjiectName
                                                                                     szSubjiectName,                                     //证书客体名称
                                                                                     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; 
        } 
    }; 
    //----------------- 


}










原创粉丝点击