vc++网络安全编程范例(18)-open ssl 实现数字证书编程

数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名
数字证书是一种权威性的电子文档,由权威公正的第三方机构,即CA中心签发的证书。

  它以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性。使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。

  它能提供在Internet上进行身份验证的一种权威性电子文档,人们可以在互联网交往中用它来证明自己的身份和识别对方的身份。当然在数字证书认证的过程中证书认证中心(CA)作为权威的、公正的、可信赖的第三方,其作用是至关重要的.如何判断数字认证中心公正第三方的地位是权威可信的,国家工业和信息化部以资质合规的方式,陆续向天威诚信数字认证中心等30家相关机构颁发了从业资质。  

 由于Internet网电子商务系统技术使在网上购物的顾客能够极其方便轻松地获得商家和企业的信息,但同时也增加了对某些敏感或有价值的数据被滥用的风险. 为了保证互联网上电子交易及支付的安全性,保密性等,防范交易及支付过程中的欺诈行为,必须在网上建立一种信任机制。这就要求参加电子商务的买方和卖方都必须拥有合法的身份,并且在网上能够有效无误的被进行验证。  

 数字证书可用于:发送安全电子邮件、访问安全站点、网上证券交易、网上招标采购、网上办公、网上保险、网上税务、网上签约和网上银行等安全电子事务处理和安全电子交易活动。
数字证书里存有很多数字和英文,当使用数字证书进行身份认证时,它将随机生成128位的身份码,每份数字证书都能生成相应但每次都不可能相同的数码,从而保证数据传输的保密性,即相当于生成一个复杂的密码。  

 数字证书绑定了公钥及其持有者的真实身份,它类似于现实生活中的居民身份证,所不同的是数字证书不再是纸质的证照,而是一段含有证书持有者身份信息并经过认证中心审核签发的电子数据,可以更加方便灵活地运用在电子商务和电子政务中。


我们来用VC++实现证书库注册,请见代码实现与注释讲解

#include #include #include #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void HandleError(char *s); void main() { //-------------------------------------------------------------------- // 变量申明与初始化 HCERTSTORE hSystemStore; //系统证书库句柄 DWORD dwFlags= CERT_SYSTEM_STORE_CURRENT_USER; //系统证书库保存位置 LPCWSTR pvSystemName= L"MYSTORE"; // 证书库名称 CERT_PHYSICAL_STORE_INFO PhysicalStoreInfo; //物理证书库结构 BYTE fResponse = 'n'; if(CertRegisterSystemStore( pvSystemName,//系统证书库名称 dwFlags, //系统证书库保存位置 NULL, NULL)) { printf("系统证书库 %S 已被注册. \n",pvSystemName); } else { printf("系统证书库没有注册. \n"); } //-------------------------------------------------------------------- // 初始化 PhysicalStoreInfo. PhysicalStoreInfo.cbSize=sizeof(CERT_PHYSICAL_STORE_INFO); PhysicalStoreInfo.pszOpenStoreProvider=(char *)CERT_STORE_PROV_FILENAME; PhysicalStoreInfo.dwFlags=CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG; PhysicalStoreInfo.dwPriority=1; PhysicalStoreInfo.dwOpenEncodingType=MY_ENCODING_TYPE; PhysicalStoreInfo.OpenParameters.pbData = (BYTE *) L"e:\\mystore\\TestStor.sto"; PhysicalStoreInfo.OpenParameters.cbData = (wcslen((LPWSTR) PhysicalStoreInfo.OpenParameters.pbData) + 1) * sizeof(WCHAR); //-------------------------------------------------------------------- // 向系统证书库注册一个物理库 if(CertRegisterPhysicalStore( pvSystemName, //系统证书库名称 dwFlags, //标志位,指示证书库存储位置。 L"TESTOR.STO", //物理证书库名称 &PhysicalStoreInfo, // NULL )) { printf("物理证书库已被注册. \n"); } else { printf("物理证书库没有被注册.\n"); } //-------------------------------------------------------------------- // 反注册系统证书库 printf("想要反注册这个 %S 证书库吗? (y/n) ",pvSystemName); scanf("%c",&fResponse); if(fResponse=='y') { if(CertUnregisterSystemStore( pvSystemName, dwFlags)) { printf("系统证书库 %S 已经被反注册.\n",pvSystemName); } else { printf("此系统证书库未被反注册.\n"); } } } // End main //-------------------------------------------------------------------- // HandleError:错误处理函数,打印错误信息,并退出程序 void HandleError(char *s) { printf("An error occurred in running the program.\n"); printf("%s\n",s); printf("Error number %x\n.",GetLastError()); printf("Program terminating.\n"); exit(1); }


我们来用VC++实现 证书库操作,请见代码实现与注释讲解

#include #include #include #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void HandleError(char *s); void main(void) { //-------------------------------------------------------------------- // 变量申明与初始化 HCERTSTORE hCollectionStore; // 集合证书库句柄 HCERTSTORE hSystemStore; // 系统证书库句柄 HCERTSTORE hMemoryStore; // 内存证书库句柄 PCCERT_CONTEXT pDesiredCert = NULL; // 证书句柄 HANDLE hStoreFileHandle ; // 输出文件句柄 LPCSTR pszFileName = "TestStor.sto"; // 输出文件名 LPWSTR pswzFirstCert = L"TEST_SIGNER_NAME";// 第一个证书客体名称,必须确定在“my”证书库中有此证书 LPWSTR pswzSecondCert = L"China-wuhan-ruanou"; // 第二个证书客体名称 ,必须确定在“my”证书库中有此证书 //------------------------------------------------------------------- // 打开一个证书库集合 if(hCollectionStore = CertOpenStore( CERT_STORE_PROV_COLLECTION, // 集合证书库 0, // 编码类型,这里不需要 NULL, // 使用默认的CSP 0, // 不需要标志位 NULL)) // 不需要此参数 { printf("打开一个证书库集合. \n"); } else { HandleError( "打开集合证书库出错."); } //------------------------------------------------------------------- // 打开一个新内存证书库,它是一个临时证书库 if(hMemoryStore = CertOpenStore( CERT_STORE_PROV_MEMORY, // 内存证书库 0, // 编码类型,这里不需要 NULL, // 使用默认的CSP 0, // 不需要标志位 NULL)) // 不需要此参数 { printf("打开一个内存证书库. \n"); } else { HandleError( "打开内存证书库出错."); } //------------------------------------------------------------------- // 打开系统证书库“my” if(hSystemStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, // 系统证书库 0, // 编码类型,这里不需要 NULL, // 使用默认的CSP CERT_SYSTEM_STORE_CURRENT_USER,//系统库存储位置 L"MY")) // 系统库名称 { printf("打开系统证书库 MY. \n"); } else { HandleError( "不能打开 MY 系统证书库."); } //------------------------------------------------------------------- // 从系统证书库中寻找证书客体名称为DUMMY_SIGNER_NAME的证书 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hSystemStore, // 证书库句柄,系统证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert pswzFirstCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书被找到. \n",pswzFirstCert); } else { HandleError("未能找到所期望的证书."); } //-------------------------------------------------------------------- // 把刚寻找到的第一个证书添加到内存证书库中 if(CertAddCertificateContextToStore( hMemoryStore, // 证书库句柄 pDesiredCert, // 欲添加的证书结构指针 CERT_STORE_ADD_USE_EXISTING, // 当证书库中存在有和此证书匹配的证书或链接时 // 不添加证书,但会把新证书的属性添加到匹配证书中 NULL)) // 添加的证书结构指针的拷贝 { printf("所找到的证书添加到了内存证书库中. \n"); } else { HandleError("未能将此证书添加到内存证书库中."); } //------------------------------------------------------------------- // 把内存库添加到证书库集合中。内存库中的所有证书在证书库集合中均有效 if(CertAddStoreToCollection( hCollectionStore, //证书库集合句柄 hMemoryStore, //欲添加的成员证书库句柄 CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG,// 表示证书、CRL、CTL可以添加到此成员证书库中 1)) // 此成员证书库的优先级 { printf("内存证书库添加到了证书库集合中.\n"); } else { HandleError("内存证书库未被添加到证书库集合中."); } //------------------------------------------------------------------- // 在系统证书库my中寻找另一个证书 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hSystemStore, // 证书库句柄,系统证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert pswzSecondCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书被找到. \n",pswzSecondCert); } else { HandleError("未能找到另一个证书."); } //-------------------------------------------------------------------- // 添加一个对刚寻找到第二个证书的链接到内存库 if(CertAddCertificateLinkToStore( hMemoryStore, // 证书库句柄 pDesiredCert, // 欲添加链接的证书结构指针 CERT_STORE_ADD_USE_EXISTING, // 当存在匹配时,不添加证书链接 NULL)) // 添加的证书结构链接指针的拷贝 { printf("%S 证书的链接添加到了内存证书库. \n",pswzSecondCert); } else { HandleError("未能将此证书的链接添加到内存证书库中."); } //-------------------------------------------------------------------- // 在内存库中寻找第一个证书,预期查找成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hMemoryStore, // 证书库句柄,内存证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert pswzFirstCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书在内存证书库中找到了. \n",pswzFirstCert); } else { printf("%S 证书不在内存证书库中.\n", pswzFirstCert); } //-------------------------------------------------------------------- // 在证书库集合中寻找第一个证书,预期查找成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hCollectionStore, // 证书库句柄,集合证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert pswzFirstCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书在集合证书库中被找到. \n", pswzFirstCert); } else { printf("%S 证书不在集合证书库中.\n", pswzFirstCert); } //-------------------------------------------------------------------- // 在内存库中寻找第二个证书的链接,预期查找成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hCollectionStore, // 证书库句柄,集合证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert pswzSecondCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书的链接在集合证书库中被找到. \n", pswzSecondCert); } else { printf("%S 证书的链接不在内存证书库中.\n", pswzSecondCert); } //------------------------------------------------------------------- // 创建一个文件,用于保存新证书库与证书 if(hStoreFileHandle = CreateFile( pszFileName, // 文件路径 GENERIC_WRITE, // 访问方式,可写 0, // 共享模式 NULL, // 安全机制 CREATE_ALWAYS, // 直接创建 FILE_ATTRIBUTE_NORMAL, // 文件属性 NULL)) // 文件模版 { printf("在磁盘上创建了一个新的文件. \n"); } else { HandleError("不能在磁盘上创建文件."); } //------------------------------------------------------------------- // 保存内存证书库及其所有证书到文件 if( CertSaveStore( hMemoryStore, // 欲保存的证书库句柄 0, // 编码类型不需要 CERT_STORE_SAVE_AS_STORE,// 证书库保存为序列化信息。 CERT_STORE_SAVE_TO_FILE, // 保存到文件中 hStoreFileHandle, // 打开的文件句柄 0)) { printf("保存了内存证书库到磁盘. \n"); } else { HandleError("未能将内存证书库保存到磁盘上."); } //-------------------------------------------------------------------- // 从集合证书库中删除成员库--内存库 printf("\n从集合证书库中删除内存证书库.\n"); CertRemoveStoreFromCollection( hCollectionStore, hMemoryStore); //-------------------------------------------------------------------- // 在内存库中寻找第二个证书的链接,预期查找成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hMemoryStore, // 证书库句柄,内存证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert pswzSecondCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书的链接仍在内存证书库中. \n", pswzSecondCert); } else { printf("此证书的链接不在内存证书库.\n"); } //-------------------------------------------------------------------- // 在证书库集合中寻找第二个证书的链接,预期查找不成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hCollectionStore, // 证书库句柄,集合证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert pswzSecondCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("The %S link was found in the collection store. \n", pswzSecondCert); } else { printf("从集合证书库中删除此证书库生效.\n"); printf("%S 证书的链接在集合证书库中未找到.\n",pswzSecondCert); } //------------------------------------------------------------------- // 关闭内存证书库 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, // 使用默认的CSP 0, // 不需要设置 L"TestStor.sto" )) // 文件名 { printf("文件证书库已经被重新打开. \n"); } else { printf("文件证书不能被重新打开. \n"); } //-------------------------------------------------------------------- // 在新打开的文件证书库中寻找证书链接,预期查找成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hMemoryStore, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_STR, pswzSecondCert, NULL)) { printf("%S 证书的链接在文件证书库中被找到. \n",pswzSecondCert); } else { printf("此证书的链接不在文件证书库.\n"); } //------------------------------------------------------------------- // 释放内存 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(hMemoryStore) CertCloseStore( hMemoryStore, CERT_CLOSE_STORE_CHECK_FLAG); printf("所有的证书库和文件均关闭. \n"); } // End of main //-------------------------------------------------------------------- // HandleError:错误处理函数,打印错误信息,并退出程序 void HandleError(char *s) { printf("程序运行出错.\n"); printf("%s\n",s); printf("错误代码 %x\n.",GetLastError()); printf("程序终止.\n"); exit(1); }


我们来用VC++实现文件加密,请见代码实现与注释讲解

#include #include #include #include #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void HandleError(char *s); void main(void) { //-------------------------------------------------------------------- // 变量申明与初始化 HCERTSTORE hCertStore; PCCERT_CONTEXT pCertContext=NULL; char pszNameString[256]; char pszStoreName[256]; DWORD dwPropId = 0; //-------------------------------------------------------------------- // 输入系统证书库名称 fprintf(stderr,"请输入系统证书库名称:"); scanf("%s",pszStoreName); fprintf(stderr,"此证书库名为 %s .\n",pszStoreName); //-------------------------------------------------------------------- // 打开系统证书库 if ( hCertStore = CertOpenSystemStore( NULL, pszStoreName)) { fprintf(stderr," %s 证书库已经被打开. \n", pszStoreName); } else { HandleError("此证书库未被打开."); } //-------------------------------------------------------------------- // 从证书库中枚举所有的证书 while(pCertContext= CertEnumCertificatesInStore( hCertStore, //证书库句柄 pCertContext)) //指向上次查询到证书的指针,第一次调用时此参数必须设为NULL { //-------------------------------------------------------------------- // 显示刚获取的证书 if ( CryptUIDlgViewContext( CERT_STORE_CERTIFICATE_CONTEXT, //指显示证书 pCertContext, //证书指针 NULL, //显示的窗口句柄,指显示默认句柄----当前桌面窗口 NULL, //显示的标题名称,指显示默认的上下文类型 0, NULL)) { } else { HandleError("显示失败."); } if(CertGetNameString( pCertContext, //证书指针 CERT_NAME_SIMPLE_DISPLAY_TYPE,//输出格式 0, //获取证书客体名称 NULL, //表示名称属性类型的指针,由dwType确定 pszNameString, //保存返回字符串的内存指针 128)) //返回字符串的长度 { printf("\nCertificate for %s \n",pszNameString); } else { fprintf(stderr,"CertGetName failed. \n"); } //-------------------------------------------------------------------- // 循环枚举证书的所有属性。当返回值为0时,循环结束 while(dwPropId = CertEnumCertificateContextProperties( pCertContext, // 证书指针 dwPropId)) // 指向上次查询到证书属性的属性值,第一次调用时此参数必须设为0 { printf("Property # %d found->", dwPropId); //-------------------------------------------------------------------- // 显示查找到的证书属性类型 switch(dwPropId) { case CERT_FRIENDLY_NAME_PROP_ID: { printf("Friendly name: \n"); break; } case CERT_SIGNATURE_HASH_PROP_ID: { printf("Signature hash identifier \n"); break; } case CERT_KEY_PROV_HANDLE_PROP_ID: { printf("KEY PROVE HANDLE \n"); break; } case CERT_KEY_PROV_INFO_PROP_ID: { printf("KEY PROV INFO PROP ID \n"); break; } case CERT_SHA1_HASH_PROP_ID: { printf("SHA1 HASH identifier\n"); break; } case CERT_MD5_HASH_PROP_ID: { printf("md5 hash identifier \n"); break; } case CERT_KEY_CONTEXT_PROP_ID: { printf("KEY CONTEXT PROP identifier\n"); break; } case CERT_KEY_SPEC_PROP_ID: { printf("KEY SPEC PROP identifier\n"); break; } case CERT_ENHKEY_USAGE_PROP_ID: { printf("ENHKEY USAGE PROP identifier\n"); break; } case CERT_NEXT_UPDATE_LOCATION_PROP_ID: { printf("NEXT UPDATE LOCATION PROP identifier\n"); break; } case CERT_PVK_FILE_PROP_ID: { printf("PVK FILE PROP identifier \n"); break; } case CERT_DESCRIPTION_PROP_ID: { printf("DESCRIPTION PROP identifier \n"); break; } case CERT_ACCESS_STATE_PROP_ID: { printf("ACCESS STATE PROP identifier \n"); break; } case CERT_SMART_CARD_DATA_PROP_ID: { printf("SMART_CARD DATA PROP identifier \n"); break; } case CERT_EFS_PROP_ID: { printf("EFS PROP identifier \n"); break; } case CERT_FORTEZZA_DATA_PROP_ID: { printf("FORTEZZA DATA PROP identifier \n"); break; } case CERT_ARCHIVED_PROP_ID: { printf("ARCHIVED PROP identifier\n"); break; } case CERT_KEY_IDENTIFIER_PROP_ID: { printf("KEY IDENTIFIER PROP identifier \n"); break; } case CERT_AUTO_ENROLL_PROP_ID: { printf("AUTO ENROLL identifier. \n"); break; } } // End switch } // End inner while } // End outer while //-------------------------------------------------------------------- // 释放内存 CertFreeCertificateContext(pCertContext); CertCloseStore(hCertStore,0); printf("此程序执行成功. \n"); } // End of main // HandleError:错误处理函数,打印错误信息,并退出程序 void HandleError(char *s) { printf("程序执行发生错误!\n"); printf("%s\n",s); printf("错误代码为: %x.\n",GetLastError()); printf("程序终止执行!\n"); exit(1); }


你可能感兴趣的:(vc++网络安全编程范例(18)-open ssl 实现数字证书编程)