CSP:使用CryptoAPI解码X509证书内容
微软的CryptoAPI提供了一套解码X509证书的函数,一个X509证书解码之后,得到一个PCCERT_CONTEXT类型的结构体指针。
通过该结构体,我们就能够获取想要的证书项和属性等。
X509证书文件,依据封装的不同,主要有下面三种类型:
*.cer:单个X509证书文件,不私钥。能够是二进制和Base64格式。该类型的证书最常见;
*.p7b:PKCS#7格式的证书链文件,包括一个或多个X509证书,不含私钥。通常从CA中心申请RSA证书时,返回的签名证书就是p7b格式的证书文件。
*.pfx:PKCS#12格式的证书文件,能够包括一个或者多个X509证书,含有私钥。一般有password保护。
通常从CA中心申请RSA证书时,加密证书和RSA加密私钥就是一个pfx格式的文件返回。
以下。针对这三种类型的证书文件。使用CryptoAPI进行解码,得到相应的PCCERT_CONTEXT结构体指针。须要注意的是,演示样例代码中的证书文件内容都是指二进制数据,假设证书文件本身使用的Base64格式。从文件读取之后,须要将Base64格式的内容转化为二进制数据,才干使用以下的解码函数。
一、解码CER证书文件
CER格式的文件最简单,仅仅须要调用API CertCreateCertificateContext()就可以。演示样例代码例如以下(lpCertData为二进制数据):
ULONG CCSPCertificate::_DecodeX509Cert(LPBYTE lpCertData, ULONG ulDataLen)
{
if (!lpCertData || ulDataLen == 0)
{
return CERT_ERR_INVALIDPARAM;
} m_pCertContext = CertCreateCertificateContext(GLOBAL_ENCODING_TYPE, lpCertData, ulDataLen);
if (!m_pCertContext)
{
return GetLastError();
} return CERT_ERR_OK;
}
二、解码P7B证书文件
因为P7B是个证书链文件,理论上能够包括多个X509证书。可是实际应用中。往往仅仅包括一个文件,所以我们仅仅处理第一个证书。演示样例代码例如以下:
ULONG CCSPCertificate::_DecodeP7bCert(LPBYTE lpCertData, ULONG ulDataLen)
{
ULONG ulRes = CERT_ERR_OK;
ULONG ulFlag = CRYPT_FIRST;
ULONG ulContainerNameLen = 512;
CHAR csContainerName[512] = {0};
BOOL bFoundContainer = FALSE; if (!lpCertData || ulDataLen == 0)
{
return CERT_ERR_INVALIDPARAM;
} // 由证书链创建一个证书库
HCERTSTORE hCertStore = NULL;
CRYPT_DATA_BLOB dataBlob = {ulDataLen, lpCertData};
hCertStore = CertOpenStore(CERT_STORE_PROV_PKCS7, GLOBAL_ENCODING_TYPE, NULL, 0, &dataBlob);
if (NULL == hCertStore)
{
ulRes = GetLastError();
return ulRes;
} // 释放之前的证书内容
if (m_pCertContext)
{
CertFreeCertificateContext(m_pCertContext);
m_pCertContext = NULL;
} // 得到第一个证书内容
m_pCertContext = CertEnumCertificatesInStore(hCertStore, m_pCertContext);
if (NULL == m_pCertContext)
{
ulRes = GetLastError();
goto CLOSE_STORE;
} // 关闭证书库
CLOSE_STORE:
if (hCertStore)
{
CertCloseStore(hCertStore, 0);
hCertStore = NULL;
} return ulRes;
}
如在特殊的情况下。须要处理整个证书链中的全部证书,则仅仅须要循环调用CertEnumCertificatesInStore()知道返回为NULL为止。
三、解码PFX证书文件
解码PFX证书时,和处理P7B非常相似。仅仅是多了password检验。演示样例代码例如以下:
ULONG CCSPCertificate::_DecodePfxCert(LPBYTE lpCertData, ULONG ulDataLen, LPSTR lpscPassword)
{
ULONG ulRes = 0;
HCERTSTORE hCertStore = NULL;
PCCERT_CONTEXT pCertContext = NULL; USES_CONVERSION; if (!lpCertData || ulDataLen == 0)
{
return CERT_ERR_INVALIDPARAM;
} // 创建证书库
CRYPT_DATA_BLOB dataBlob = {ulDataLen, lpCertData};
hCertStore = PFXImportCertStore(&dataBlob, lpscPassword ? A2W(lpscPassword) : NULL, CRYPT_EXPORTABLE);
if (NULL == hCertStore)
{
hCertStore = PFXImportCertStore(&dataBlob, L"", CRYPT_EXPORTABLE);
}
if (NULL == hCertStore)
{
ulRes = GetLastError();
return ulRes;
} // 枚举证书,仅仅处理第一个证书
while(pCertContext = CertEnumCertificatesInStore(hCertStore, pCertContext))
{
if (pCertContext->pbCertEncoded && pCertContext->cbCertEncoded > 0)
{
m_pCertContext = CertDuplicateCertificateContext(pCertContext);
break;
}
} // 关闭证书库
CertCloseStore(hCertStore, 0);
hCertStore = NULL; return ulRes;
}
至此,三种常见证书文件的解码以完毕。通过解码得到的证书上下文结构体指针m_pCertContext 就能够解析证书的项和扩展属性了。详细的解析方法。将在兴许的Blog中逐一介绍。
CSP:使用CryptoAPI解码X509证书内容的更多相关文章
- 通过OpenSSL解码X509证书文件
在Windows平台下.假设要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI. 可是在非Windows平台下,就仅仅能使用强大的开源跨平台库OpenSSL了.一个X509证书通过 ...
- [转贴]使用CryptoAPI解析X509证书和P12证书
原文在 http://bbs.pediy.com/archive/index.php?t-97663.html,但是觉得这篇文章非常好,我抄下来作我笔记用 一.解析X509证书 1.从磁盘上的证书文件 ...
- 通过OpenSSL解析X509证书基本项
在之前的文章"通过OpenSSL解码X509证书文件"里.讲述了怎样使用OpenSSL将证书文件解码,得到证书上下文结构体X509的方法. 以下我们接着讲述怎样通过证书上下文结构体 ...
- x509证书相关内容
什么是证书 X.509证书,其核心是根据RFC 5280编码或数字签名的数字文档. 实际上,术语X.509证书通常指的是IETF的PKIX证书和X.509 v3证书标准的CRL 文件,即如RFC ...
- OpenSSL 使用拾遗(二)---- X509 证书的 SKID/AKID 字段
SKID(证书使用者密钥标识符,subject key identifier 的简称)和 AKID(证书颁发机构密钥标识符,authority key identifier 的简称)是 X509 证书 ...
- MQTT研究之EMQ:【JAVA代码构建X509证书【续集】】
openssl创建私钥,获取公钥,创建证书都是比较简单的,就几个指令,很快就可以搞定,之所以说简单,是因为证书里面的基本参数配置不需要我们组装,只需要将命令行里面需要的几个参数配置进去即可.但是呢,用 ...
- MQTT研究之EMQ:【JAVA代码构建X509证书】
这篇帖子,不会过多解释X509证书的基础理论知识,也不会介绍太多SSL/TLS的基本信息,重点介绍如何用java实现SSL协议需要的X509规范的证书. 之前的博文,介绍过用openssl创建证书,并 ...
- 【openssl】利用openssl完成X509证书和PFX证书之间的互转
利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装: 1.下载地址: 官方网址—— https://www.openssl.org/source/ OpenSSL ...
- openssl rsa加密,解密以及X509证书的使用
Openssl的相关使用 生成证书 生成证书见:使用 openssl 生成证书 代码实现 Cert.h #ifndef _CERT_H #define _CERT_H ///header files ...
随机推荐
- 算法学习记录-图——最短路径之Dijkstra算法
在网图中,最短路径的概论: 两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点. 维基百科上面的解释: 这个算法是通过为每个顶点 v 保留目前为止所找到的从 ...
- 深入浅出Oracle:DBA入门、进阶与诊断案例(读书笔记2)
第5章 Buffer Cache与Shared Pool原理 5.1 Buffer Cache原理 Buffer Cache是Oracle SGA中的一个重要部分,通常的数据访问和修改都需要通过Bu ...
- Java-转换Unicode和utf-8
package com.tj; import java.io.UnsupportedEncodingException; public class MyClass implements Cloneab ...
- luogu2569 [SCOI2010]股票交易
题解看这里 #include <iostream> #include <cstring> #include <cstdio> using namespace std ...
- python3--__getattr__和__setattr__捕捉属性的一个引用
__getattr__和__setattr__捕捉属性的一个引用 __getattr__方法是拦截属性点号运算.更确切地说,当通过对未定义(不存在)属性名称和实例进行点号运算时,就会用属性名称为字符串 ...
- SG博弈函数模板
下面这两个模版应该就比较严密了,这个里边的f[]是从零开始的. 转载出处:转自:http://blog.csdn.net/primoblog/article/details/13376057 1.sg ...
- Spring Cloud 从入门到精通
Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量. 本 ...
- [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)
传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...
- [BZOJ1592] [Usaco2008 Feb]Making the Grade 路面修整(DP)
传送门 有个结论,每一个位置修改高度后的数,一定是原来在这个数列中出现过的数 因为最终结果要么不递增要么不递减, 不递增的话, 如果x1 >= x2那么不用动,如果x1 < x2,把x1变 ...
- 刷题总结——shortest(ssoi)
题目: 题目背景 SOURCE:NOIP2015-SHY-3 题目描述 给定一张 n 个点的有向带权完全图,和一个数组 a[] ,请按顺序删除数组中的点,请求出在删除点 a[i] 以前,所有未删除点对 ...