更改Click Once 签名证书的有效期

#include "stdafx.h"     void ReadPFXFile(LPCWSTR fileName, CRYPT_DATA_BLOB *pPFX) {             HANDLE hCertFile = NULL;             DWORD cbRead = 0;             DWORD dwFileSize = 0, dwFileSizeHi = 0;               hCertFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);             dwFileSize = GetFileSize(hCertFile, &dwFileSizeHi);             pPFX->pbData = (BYTE *) CryptMemAlloc(dwFileSize*sizeof(BYTE));             pPFX->cbData = dwFileSize;               ReadFile(hCertFile, pPFX->pbData, pPFX->cbData, &cbRead, NULL);             CloseHandle(hCertFile); }   void GetPrivateKey(CRYPT_DATA_BLOB pPFX, LPCWSTR szPassword, HCRYPTPROV *hCPContext) {             HCERTSTORE hCertStore = NULL;             PCCERT_CONTEXT hCertContext = NULL;             DWORD dwKeySpec = AT_SIGNATURE;             BOOL bFreeCertKey = TRUE;               hCertStore = PFXImportCertStore(&pPFX, szPassword, CRYPT_EXPORTABLE);             hCertContext = CertEnumCertificatesInStore(hCertStore, NULL);             CryptAcquireCertificatePrivateKey(hCertContext, 0, NULL, hCPContext, &dwKeySpec, &bFreeCertKey);             CertCloseStore(hCertStore, CERT_CLOSE_STORE_FORCE_FLAG); }   void PrintContainerName(HCRYPTPROV hCPContext) {             DWORD containerNameLen = 0;             CHAR *szContainerName = NULL;               CryptGetProvParam(hCPContext, PP_CONTAINER, NULL, &containerNameLen, 0);             szContainerName = (CHAR *)CryptMemAlloc(sizeof(BYTE)*containerNameLen);             CryptGetProvParam(hCPContext, PP_CONTAINER, (BYTE *)szContainerName, &containerNameLen, 0);             printf("This certificate's container name is: %s", szContainerName); }   void MakeNewCert(HCRYPTPROV hCPContext, LPCWSTR szCertName, LPCWSTR szPassword, CRYPT_DATA_BLOB *pPFX) {             CERT_NAME_BLOB certNameBlob = {0,NULL};             PCCERT_CONTEXT hCertContext = NULL;             SYSTEMTIME certExpireDate;             HCERTSTORE hTempStore = NULL;               CertStrToName(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, szCertName, CERT_OID_NAME_STR, NULL, NULL, &certNameBlob.cbData, NULL);             certNameBlob.pbData = (BYTE *)CryptMemAlloc(sizeof(BYTE)*certNameBlob.cbData);             CertStrToName(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, szCertName, CERT_OID_NAME_STR, NULL, certNameBlob.pbData, &certNameBlob.cbData, NULL);               GetSystemTime(&certExpireDate);             certExpireDate.wYear += 5;               hCertContext = CertCreateSelfSignCertificate(hCPContext, &certNameBlob, 0, NULL, NULL, NULL, &certExpireDate, NULL);             hTempStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, CERT_STORE_CREATE_NEW_FLAG, 0);             CertAddCertificateContextToStore(hTempStore, hCertContext, CERT_STORE_ADD_NEW, NULL);             PFXExportCertStoreEx(hTempStore, pPFX, szPassword, NULL, EXPORT_PRIVATE_KEYS);             pPFX->pbData = (BYTE *)CryptMemAlloc(sizeof(BYTE)*pPFX->cbData);             PFXExportCertStoreEx(hTempStore, pPFX, szPassword, NULL, EXPORT_PRIVATE_KEYS);               CryptMemFree(certNameBlob.pbData);             CertCloseStore(hTempStore, CERT_CLOSE_STORE_FORCE_FLAG);             CertFreeCertificateContext(hCertContext); }   void WritePFX(CRYPT_DATA_BLOB pPFX, LPCWSTR szOutputFile) {             HANDLE hOutputFile = NULL;             DWORD cbWritten = 0;               hOutputFile = CreateFile(szOutputFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);             WriteFile(hOutputFile, pPFX.pbData, pPFX.cbData, &cbWritten, NULL);               CloseHandle(hOutputFile); }   int _tmain(int argc, _TCHAR* argv[]) {             LPCWSTR szCertFileName = NULL;               CRYPT_DATA_BLOB pPFX;             LPCWSTR szPassword = NULL;             HCRYPTPROV hCPContext = NULL;               LPCWSTR szCertName = L"CN=NewCert";             CRYPT_DATA_BLOB pPfxOutputBlob = {0,NULL};             LPCWSTR szOutFile = NULL;               // Parse the command line.             if(argc == 1)             {                         printf("renewcert <PFX File> <new cert filename> <new cert friendly name> [optional]<password>/n");                         printf("Example: renewcert oldcert.pfx newcert.pfx /"CN=MyNewCert/" MySuperSecretPassword");                         return 0;             }               if(argc >= 2)                         szCertFileName = argv[1];             if(argc >= 5)                         szPassword = argv[4];             // Uncomment this block to add <new cert filename> and <new cert friendly name> as parameters             // NOTE: <new cert friendly name> must be of format "CN=<name>"             if(argc >= 3)                         szOutFile = argv[2];             if(argc >= 4)                         szCertName = argv[3];               ReadPFXFile(szCertFileName, &pPFX);                         GetPrivateKey(pPFX, szPassword, &hCPContext);               //PrintContainerName(hCPContext);               // Uncomment this section to make a new PFX rather than just printing the container name.             // Make sure you also uncomment the command line parameter section above.             MakeNewCert(hCPContext, szCertName, szPassword, &pPfxOutputBlob);             WritePFX(pPfxOutputBlob, szOutFile);                           // Clean up.             CryptReleaseContext(hCPContext, 0);             CryptMemFree(pPfxOutputBlob.pbData);             CryptMemFree(pPFX.pbData);             return 0; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值