C++获取数字证书的序列号

数字证书 专栏收录该内容
0 篇文章 0 订阅

C++获取数字证书的序列号

目录

我们需要准备一个二进制的证书实体 或是 CRL,给出的例子可以直接解析出证书的序列号,而不需要通过任何的第三方的接口例如:openssl 、CryptoAPI

通过看ASN.1 得知:

  • INTEGER 为任意一个整数 该标记码为 0x02
  • asn.1这规范一般标记码后面是 长度

了解到证书的序列号的长度为 32字节 的十六进制的字符串
二进制的长度为16字节

举个证书序列号的栗子:

序列号 : ‎21 11 78 53 0b 64 aa 92 13 45 59 cd 49 f4 d8 c1

以下是一个简单的例子


/*
@作者:天空中的一米阳光
@由于我的环境是VS 2010 故用了fopen_s方法和sprintf_s方法
*/
#include<iostream>
#include<string>
using namespace std;

int main()
{
    FILE *fp = NULL;
    int iDataLen = 0;
    unsigned char* crlData = NULL;
    errno_t err;

//这里我是用的CRL ,用.cer的证书实体也是一样的
    err = fopen_s(&fp,"crl.crl","rb+");
    if (err!=0)
    {
        cout<<"File wasn't opened"<<endl;
        return -1;
    }
    fseek(fp,0L,SEEK_END);
    iDataLen = ftell(fp); //获取文件的大小
    fseek(fp,0L,SEEK_SET);

    crlData = new unsigned char[iDataLen+1];
    memset(crlData,0x00,iDataLen+1);

    fread(crlData,sizeof(unsigned char),iDataLen,fp);

    int iCount = 0;
    int i = 0;
    iCount = iDataLen;
    for ( i = 0;i<iDataLen;i++)
    {
        if (crlData[i]==2)
        {
            if (crlData[i+1]==16)
            {
                string strNum;
                for (int j = 0;j<16;j++)
                {
                    char str[3] = {0};
                    sprintf_s(str,3,"%02x",crlData[i+2]);//将二进制的数据转变为十六进制的字符串
                    strNum += str;
                    i++;
                }
                cout<<strNum<<endl;
            }else{
                continue;
            }
        }
    }

    fclose(fp);
    delete[] crlData;
    crlData = NULL;
    return 0;
}

转载请声明本文作者为:天空中一米阳光


  • 2
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

天空中一米阳光

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值