签名的证书过期后,修改方法

转载 2013年12月05日 02:17:22

原文链接:http://support.microsoft.com/kb/925521/zh-cn


创建一个命令行程序集更新证书。若要执行此操作,请执行以下步骤。


Microsoft 提供的编程示例仅用于说明,没有任何明示或暗示的担保。这包括但不限于适销性或特定用途适用性的暗示保证。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能。但是,他们不会修改这些示例以提供额外的功能或构建过程以满足您的特定要求。
  1. 在 Visual Studio 2005 中,在文件菜单上,单击新建,然后单击项目
  2. 单击Visual C++ Win32 控制台应用程序中的名称框中,键入RenewCert和,然后单击确定
  3. Win32 应用程序向导对话框中,单击完成
  4. 在 RenewCert.cpp 文件中,将现有代码替换为以下代码:
    #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;
    
    }
    
  5. 在 stdafx.h 文件中,将现有代码替换为以下代码:
    // stdafx.h : include file for standard system include files,
    
    // or project specific include files that are used frequently, but
    
    // are changed infrequently.
    
    //
    
    #pragma once
    
    #define WIN32_LEAN_AND_MEAN                     // Exclude rarely used material from Windows headers.
    
    #include <stdio.h>
    
    #include <tchar.h>
    
    #include <windows.h>
    
    #include <wincrypt.h>
    
  6. 项目菜单上,单击属性以打开属性页中的为此项目。
  7. 展开链接器节点,然后单击输入
  8. 在空白窗口右侧的附加依赖项,请单击,然后单击省略号按钮 (...) 在附加依赖项对话框中打开。
  9. 在空白的窗口中,键入Crypt32.lib,然后单击确定
  10. 单击应用,然后单击确定以关闭属性页。
  11. 生成菜单中,单击生成解决方案
  12. 生成解决方案后,执行以下命令,以更新证书,请:
    renewcert <OldCertificate>.pfx <NewCertificate>.pfx \"CN=<NewCertificateName>\" <Password>
    注意 <OldCertificate> 为原来的证书的占位符 <NewCertificate> 为新的证书的占位符 <NewCertificateName> 为新的证书和<Password> 为密码的占位符。

p12证书的导出历程,证书过期或者此证书的签发者无效

最近电脑重装系统,又要重新制作证书,制作的证书加入钥匙串中出现如下的提示或者“此证书是由未知颁发机构签名的”的提示 解决方法: 1.点击钥匙串中系统发现Apple World Wide D...
  • yptzxx
  • yptzxx
  • 2016年06月27日 14:09
  • 1855

pfx证书一键生成

  • 2013年11月17日 12:03
  • 219KB
  • 下载

C语言操作WINDOWS系统存储区数字证书相关函数详解

C语言操作WINDOWS系统存储区数字证书相关函数详解及实例   以下代码使用C++实现遍历存储区证书及使用UI选择一个证书   --使用CertOpenSystemStore打开证...
  • webajax
  • webajax
  • 2011年08月18日 17:07
  • 2598

c++ 如何使用CryptoAPI创建一个自签名证书

引文链接:How to create a self-signed certificate with CryptoAPI (C++) CryptoAPI编程 (1) 微软加密服务体系 ...
  • testcs_dn
  • testcs_dn
  • 2013年12月14日 21:16
  • 7254

代码签名证书过期后时间戳所起的作用

代码签名证书过期后时间戳所起的作用 ,这是许多用户经常提出的问题。首先,让我们了解一下时间戳的作用:任何数字证书都是有有效期的, 代码签名证书支持 1-3 年有效期。 然而,您的软件的生命周期一般都会...
  • fighting_oyj
  • fighting_oyj
  • 2014年09月17日 14:25
  • 1014

代码修改系统时间--1.系统命令设置 2.系统API直接设定毫秒值

一.系统命令设置,前提是手机必须获得ROOT权限,root方法网上自查。 (一)adb shell  进入shell 终端界面,查看是否已获得权限 1、先设置系统的时区配置 cat...
  • seashine_yan
  • seashine_yan
  • 2017年04月21日 11:41
  • 582

CSP:使用CryptoAPI解析X509证书基本项

使用CryptoAPI解码X509证书的基本项,比如版本、序列号、公钥算法、证书用途、颁发者、使用者、有效期等。...
  • yyfzy
  • yyfzy
  • 2015年07月07日 16:12
  • 3316

学习CRYPTO第二天

因为是.net安全,所以必须在VC7上运行下面面的一些例子(今天害得我在VC6上运行,错误一大堆),上面介绍了CRYPTAPI的一些基础,下面我就不按照MSDN的往下看了,下面的几个专题是Hashin...
  • dlfer11
  • dlfer11
  • 2015年12月17日 17:56
  • 985

iOS证书过期解决方案

关于证书过期还有描述文件不匹配的问题见解: 平时问题下列步骤都能解决 大牛(ps英语好的)请去苹果开发文档中心 证书过期一般都是先去开发者中心重新创建证书,不过现在的证书过期之后直接被官...
  • SuYuMingXiangGuan
  • SuYuMingXiangGuan
  • 2016年02月22日 15:53
  • 7051

openssl创建自签名证书

在iOS上使用自签名的SSL证书 破船之家03-17 14:15 本文译自: Five Tips for Using Self Signed SSL Certifi...
  • u012198553
  • u012198553
  • 2015年09月17日 11:24
  • 1612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:签名的证书过期后,修改方法
举报原因:
原因补充:

(最多只允许输入30个字)