`

创建证书

    博客分类:
  • VC
阅读更多

#include "stdafx.h"
#include <Windows.h>
#include <Wincrypt.h>
#include <iostream>
using namespace std;

#pragma comment(lib, "crypt32.lib")

const char*	g_szContainer = "cont_andylin";
const char* g_szIssuserName = "my name is andylin";
const char* g_szSubjectName = "test subject name";
const char* g_szCertFile = "d:/lin-x509.cer";

DWORD MakeCert();

int main()
{
	DWORD dwErr = MakeCert();

	if (dwErr != 0)
	{
		cout << "Make Cert Failed! Err Code = " << dwErr << endl;
	}
	else
	{
		cout << "Make Cert Succ!" << endl;
	}

	return 0;
}

DWORD MakeCert()
{
	HCRYPTPROV	hProv		= NULL;
	HCRYPTKEY	hKey		= NULL;
	BOOL		bRet		= FALSE;
	CERT_INFO	certInfo	= {0};

	BYTE abySerial[] = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"; 

	do 
	{

		bRet = CryptAcquireContext(&hProv, g_szContainer, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
		if (!bRet)
		{
			bRet = CryptAcquireContext(&hProv, g_szContainer, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
			bRet = CryptAcquireContext(&hProv, g_szContainer, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);

			if (!bRet)
			{
				break;
			}
		}

		bRet = CryptGenKey(hProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &hKey);

		if (!bRet)
		{
			break;
		}

		memset(&certInfo, 0, sizeof(certInfo));
		//1.version
		certInfo.dwVersion = 2;

		//2.SerialNumber
		certInfo.SerialNumber.cbData = sizeof(abySerial);
		certInfo.SerialNumber.pbData = abySerial;

		//3.algorithm
		certInfo.SignatureAlgorithm.pszObjId = szOID_RSA_SHA1RSA;
		certInfo.SignatureAlgorithm.Parameters.cbData = 0;

		//4.Issuer.Encode the Issuer name with ASN.1, reference MSDN source
		CERT_RDN_ATTR stRdnAttr = 
		{
			szOID_COMMON_NAME, //the OID
			CERT_RDN_PRINTABLE_STRING,
			(DWORD)strlen(g_szIssuserName) + 1, // string length including
			(LPBYTE)g_szIssuserName
		};

		CERT_RDN	stRdn[] = 
		{
			1, // number of elements in the CERT_RND's array
			&stRdnAttr
		};

		CERT_NAME_INFO stNameInfo = 
		{
			1,	//number of elements in the CERT_RND's array 
			stRdn
		};

		DWORD	dwEncode	= 0;
		LPBYTE	pbEncode	= NULL;

		bRet = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_NAME, &stNameInfo, 0, NULL, NULL, &dwEncode);

		if (!bRet)
		{
			break;
		}

		pbEncode = new BYTE[dwEncode];
		if (NULL == pbEncode)
		{
			break;
		}

		bRet = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_NAME, &stNameInfo, 0, NULL, NULL, &dwEncode);
		if (!bRet)
		{
			break;
		}

		certInfo.Issuer.cbData = dwEncode;
		certInfo.Issuer.pbData = pbEncode;

		//5.UTCTime .Process the Time of cert. SystemTimeToFileTime
		SYSTEMTIME tmSys;
		GetSystemTime(&tmSys);
		SystemTimeToFileTime(&tmSys, &certInfo.NotBefore);
		tmSys.wYear += 10;
		SystemTimeToFileTime(&tmSys, &certInfo.NotAfter);

		//6. subject
		stRdnAttr.pszObjId = szOID_COMMON_NAME;
		stRdnAttr.dwValueType = CERT_RDN_PRINTABLE_STRING;
		stRdnAttr.Value.cbData = (DWORD)strlen(g_szSubjectName) + 1;
		stRdnAttr.Value.pbData = (PBYTE)g_szSubjectName;

		bRet = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_NAME, &stNameInfo, 0, NULL, NULL, &dwEncode);

		if (!bRet)
		{
			break;
		}

		pbEncode = new BYTE[dwEncode];
		if (NULL == pbEncode)
		{
			break;
		}

		bRet = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_NAME, &stNameInfo, 0, NULL, NULL, &dwEncode);
		if (!bRet)
		{
			break;
		}

		certInfo.Issuer.cbData = dwEncode;
		certInfo.Issuer.pbData = pbEncode;

		//7.PublicKey
		DWORD dwPubKeyLen = 0;
		PCERT_PUBLIC_KEY_INFO	pstKeyInfo = NULL;//reference RACrypt.cpp .Don't know why
		bRet = CryptExportPublicKeyInfo(hProv, AT_SIGNATURE, X509_ASN_ENCODING, NULL, &dwPubKeyLen);

		if (!bRet)
		{
			break;
		}

		pstKeyInfo = (PCERT_PUBLIC_KEY_INFO)malloc(dwPubKeyLen);

		if (NULL == pstKeyInfo)
		{
			break;
		}

		bRet = CryptExportPublicKeyInfo(hProv, AT_SIGNATURE, X509_ASN_ENCODING, pstKeyInfo, &dwPubKeyLen);

		if (!bRet)
		{
			break;
		}

		certInfo.SubjectPublicKeyInfo = *pstKeyInfo;

		//extendsion 
        certInfo.cExtension = 0;
		certInfo.rgExtension = NULL;
		certInfo.IssuerUniqueId.cbData = 0;
		certInfo.SubjectUniqueId.cbData = 0;

		//Make Certificate
		CRYPT_ALGORITHM_IDENTIFIER algId;
		BYTE abyData[16] = {0};
		abyData[0] = 0x05;
		abyData[1] = 0x00;

		algId.pszObjId = szOID_RSA_SHA1RSA;
		algId.Parameters.cbData = 2;
		algId.Parameters.pbData = abyData;

		/*------------------------------------------------------------- 
		CryptSignAndEncodeCertificate 
		The CryptSignAndEncodeCertificate function encodes and signs a certificate, CRL, CTL or certificate request. 
		This function performs the following operations: 
		1-> Calls CryptEncodeObject using lpszStructType to encode the "to be signed" information. 
		2-> Calls CryptSignCertificate to sign this encoded information. 
		3-> Calls CryptEncodeObject again, with lpszStructType set to X509_CERT, 
		to further encode the resulting signed, encoded information. 
		-------------------------------------------------------------*/ 

		// Export As X.509 certificate
		PBYTE pbyCertOut = NULL;
		DWORD dwCertLen = 0;
		bRet = CryptSignAndEncodeCertificate(hProv, AT_SIGNATURE, X509_ASN_ENCODING, X509_CERT_TO_BE_SIGNED, (void*)&certInfo,
			&algId, NULL, NULL, &dwCertLen);

		if (!bRet)
		{
			break;
		}

		pbyCertOut = new BYTE[dwCertLen];
		if (NULL == pbyCertOut)
		{
			break;
		}

		bRet = CryptSignAndEncodeCertificate(hProv, AT_SIGNATURE, X509_ASN_ENCODING, X509_CERT_TO_BE_SIGNED, &certInfo, &algId,
			NULL, pbyCertOut, &dwCertLen);

		if (!bRet)
		{
			break;
		}

		DWORD dwLen = 0;
		HANDLE hFile = CreateFile(g_szCertFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 
			CREATE_ALWAYS, NULL, NULL);

		if (INVALID_HANDLE_VALUE == hFile)
		{
			break;
		}

		bRet = WriteFile(hFile, pbyCertOut, dwCertLen, &dwLen, NULL);
		CloseHandle(hFile);

		if (!bRet)
		{
			break;
		}
		
	} while (0);

	if (!bRet)
	{
		return GetLastError();
	}

	return 0;
}
 
分享到:
评论

相关推荐

    WinForm程序创建证书、签名、安装、发布、自动更新全过程

    本文将详细介绍这些关键步骤,并结合提供的两个文档,即“WinForm程序创建证书、签名、安装、发布、自动更新全过程.docx”和“WinForm应用程序发布_安装_更新记录.docx”,给出详细的实践指南。 1. 创建证书: 在...

    使用 OpenSSL 创建生成CA 证书服务器客户端证书及密钥

    服务器证书的创建流程类似,首先生成服务器私钥,然后创建证书请求,最后由CA签署证书: ```shell # 生成服务器私钥 openssl genrsa -out server.key 2048 # 创建服务器证书请求 openssl req -new -key server.key...

    开发者证书创建 证书

    选择“证书助理”(Certificate Assistant),然后选择“创建证书”(Create a Certificate)。 - 创建证书时,应选择“公钥加密”(Code Signing)作为证书类型。在“证书名称”(Common Name)字段中输入“iPhone...

    真机测试、连调添加设备更新描述文件、创建证书

    真机测试、连调添加设备更新描述文件、创建证书 本文档主要为开发人员提供了真机测试、连调添加设备更新描述文件、创建证书的详细步骤。以下是相关知识点的总结: 1. 添加设备更新描述文件 添加设备的目的就是...

    C# 开发的一个创建证书的例子

    `创建证书.csproj`是项目文件,记录了项目配置、引用和其他元数据。`Main.resx`用于存储窗体资源,如控件布局和文本。`bin`和`obj`目录分别用于存放编译后的可执行文件和中间编译产物。 在创建证书的过程中,我们...

    EJBCA创建证书图解

    **EJBCA创建证书图解** EJBCA是一个开源的企业级PKI(Public Key Infrastructure)系统,用于管理和分发数字证书。它基于Java开发,遵循X.509标准,提供了强大的证书颁发机构(CA)功能。在这个图解教程中,我们将...

    WCF创建证书参数

    **WCF创建证书参数**是Windows Communication Foundation (WCF) 中用于设置安全通信的重要环节,主要涉及X.509证书的生成。X.509证书是一种国际标准,用于在电子通信中验证身份,通常用于加密、数字签名以及SSL/TLS...

    key创建证书指令

    ### key创建证书指令 在IT安全领域中,证书是一种用于证明身份的重要工具,尤其是在网络通信过程中,证书可以确保数据的安全性和完整性。Java平台提供了一种名为`keytool`的命令行工具来帮助用户管理和操作证书、...

    自动化创建证书.zip

    在IT行业中,自动化是提升效率的关键,特别是在重复性工作如创建证书方面。"自动化创建证书.zip"这个压缩包文件提供了一种使用Python脚本和Shell脚本来自动化创建Android应用签名证书的方法,这对于开发者来说是非常...

    创建证书签名的文件.pdf

    ### 创建证书签名的相关知识点 #### 一、概述 在软件开发和部署过程中,为了提高安全性、可信度以及减少被浏览器等安全系统拦截的概率,开发者通常会采用数字证书为自己的应用程序或组件(例如OCX、DLL、EXE等)...

    Exchange日常管理九之创建证书服务器.docx

    在Exchange服务器的日常管理中,创建证书服务器是一个关键步骤,特别是在确保通信安全和提供身份验证服务方面。Exchange很多服务,如Outlook Anywhere、Exchange ActiveSync、SMTP等,都依赖于数字证书来加密数据和...

    OpenSSL生成的ssl证书

    **OpenSSL创建证书** 1. **安装OpenSSL**:虽然在描述中提到无需再下载和配置OpenSSL环境,但在实际操作中,你需要先下载适用于Windows的OpenSSL版本并安装。可以从官方网站或者其他可信源获取安装包。 2. **生成...

    WinForm程序创建证书、签名、安装、发布、自动更新全过程及pvkimprt.exe

    1. **创建证书**:证书是数字身份的证明,用于确认软件的开发者身份和确保代码未被篡改。在Windows中,可以使用“Microsoft Visual Studio”或“MakeCert”工具来创建自签名证书。自签名证书虽然不是由权威的证书...

    windows server 2008 R2证书申请及安装配置

    在右边的操作中找到创建证书申请或者右键选择创建证书申请。然后,输入 web 站点名称和组织单位等其他信息,选择加密程序, 一般为微软 RSA。选择存放的文件, 일반적으로保存为 TXT 文件,待会需要打开该 TXT 文件...

    openssl生成证书

    2. 接着,创建证书签名请求(Certificate Signing Request, CSR),使用`openssl req`命令: ``` openssl req -new -key server.key -out server.csr ``` 提供必要的信息,如组织名、地理位置等,生成CSR文件。 ...

    C#创建并使用签名证书

    C#是一种广泛使用的编程语言,它提供了丰富的库和工具来处理各种安全任务,包括创建和使用签名证书。本篇将详细介绍C#中如何创建签名证书,以及如何利用RSA算法进行加密解密,并结合Pkcs7标准进行数据封装。 首先,...

    iOS创建证书和配置文件(AppStore).docx

    iOS创建证书和配置文件

    windows服务器ssl证书创建、安装及配置方法

    创建证书请求 进入服务器证书配置页面,并选择“创建证书申请”,填写相关信息,点击“下一步”。 选择加密服务提供程序,并设置证书密钥长度,EV证书需选择位长2048,点击“下一步”。 保存证书请求文件到.txt...

    创建证书工具

    本文将深入探讨"创建证书工具"这一主题,并结合标签"CeleSign_1"进行解析。 CeleSign_1可能是一款特定的证书创建工具,其主要功能可能包括生成SSL/TLS证书、代码签名证书以及个人或企业身份认证证书等。CELESIGN....

Global site tag (gtag.js) - Google Analytics