查看pem证书的ASN数据结构的方法

搞过的同学应该都弄过google 的keybox.xml,里面有google 的attestition key证书内容,类似如下:

    <Key algorithm="ecdsa">
      <PrivateKey format="pem">-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIGy6AjEzbgGKmraHakjGX7Ld01MaK+d+SUv99GpUSosToAoGCCqGSM49
AwEHoUQDQgAENr+geskxIlYpIRCxZTbFTUI+Zv9B4KrGfOyNp8icyC46ZiCLtoZQ
T6IIDzPElyJ6puG4nLaNX+/9raGBFDMnCA==
-----END EC PRIVATE KEY-----
</PrivateKey>
      <CertificateChain>
        <NumberOfCertificates>3</NumberOfCertificates>
        <Certificate format="pem">-----BEGIN CERTIFICATE-----
MIICLDCCAbKgAwIBAgIKGBmVCRR3EhkhKDAKBggqhkjOPQQDAjAbMRkwFwYDVQQF
ExBiZTQwNjQ2NmJlYTM3ODJiMB4XDTE2MDUyNjE3MzQ1MloXDTI2MDUyNDE3MzQ1
MlowGzEZMBcGA1UEBRMQNmNmZGM4ZjM3ZDBjNDc1OTBZMBMGByqGSM49AgEGCCqG
SM49AwEHA0IABDa/oHrJMSJWKSEQsWU2xU1CPmb/QeCqxnzsjafInMguOmYgi7aG
UE+iCA8zxJcieqbhuJy2jV/v/a2hgRQzJwijgd0wgdowHQYDVR0OBBYEFPOca1nC
LHi7kp/w+fE4pXD51769MB8GA1UdIwQYMBaAFKaz3r8xYJllfb5LA5tz0LBld0oB
MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMCQGA1UdHgQdMBugGTAXghVp
bnZhbGlkO2VtYWlsOmludmFsaWQwVAYDVR0fBE0wSzBJoEegRYZDaHR0cHM6Ly9h
bmRyb2lkLmdvb2dsZWFwaXMuY29tL2F0dGVzdGF0aW9uL2NybC8xODE5OTUwOTE0
NzcxMjE5MjEyODAKBggqhkjOPQQDAgNoADBlAjEAo6Fy2NE1Kx3Zozmw8zaFqDCx
vOm+Z+6CXU8rSX2B8pWpdnR+T5efvLdCapmAoK0SAjBGwYT224mzmuG+uxN0ka3D
R1Dc4tD+JlD2rlKbWMoZadPrZ65NpKzm6z/9shwd2Bk=
-----END CERTIFICATE-----
</Certificate>

但是有时候想看一下这个pem对应的内容是什么?
需要使用工具将这个证书内容转换成ASN描述内容,类似如下:
在这里插入图片描述
那应该具体如何操作呢?
步骤如下:
1、将pem的内容复制一下;
2、打印https://lapo.it/asn1js/网址
3、将pem内容复制进去,点击“decode”按钮,就可以生成对应的内容了。

那如果拿到的数据是hex十六进制的,那怎么办?
也有办法,可以先将hex转换成二进制文件,然后再复制到这个网页。
实现的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>

static bool _hex2bin(char* hex, uint32_t hex_size, uint8_t* bin, uint32_t bin_size)
{
    if (hex_size % 2) {
           return false;
        }   

    if (bin_size < hex_size / 2 || !bin) {
           return false;
        }   

    uint32_t j = 0;
    uint8_t t = 0;
    uint8_t c = 0;
    for (uint32_t i = 0; i < hex_size; ++i) {
           if (hex[i] >= '0' && hex[i] <= '9') {
                t = hex[i] - '0';
               } else if (hex[i] >= 'a' && hex[i] <= 'f') {
                      t = hex[i] - 'a' + 10; 
                   } else if (hex[i] >= 'A' && hex[i] <= 'F') {
                          t = hex[i] - 'A' + 10; 
                       } else {
                              return false;
                           }   
    
           if (i % 2 == 0) {
                  c = t << 4;
               } else {
                     c |= t;
                      bin[j++] = c;
                      c = 0;
                   }   
        }   

    return true;
}

uint8_t __bin[2048] = {0};
char* __hex = "";  //把你要转换的数据拷贝到这里面来

int main()
{
    FILE* fout = fopen("out.bin", "w+");
    size_t len = strlen(__hex);
    printf("read len %ld\n", len);
    _hex2bin(__hex, len, __bin, len / 2);
    fwrite(__bin, 1, len/2, fout);
    fclose(fout);
    return 0;
}

转换后,会生成out.bin文件,把这个out.bin拖到https://lapo.it/asn1js/网址中,也可以转换ASN描述的内容了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值