ASN.1 - 数据结构描述语言

引用自Wiki:

ASN.1 is a standard interface description language for defining data structures that can be serialized and deserialized in a cross-platform way.

也就是说ASN.1是一种用来定义数据结构的接口描述语言,它不是二进制,也不是文件格式,看下面的例子你就会明白了:

FooQuestion ::= SEQUENCE {trackingNumber INTEGER,question       IA5String
}

复制

这段代码定义了FooQuestion的数据结构,下面是FooQuestion这个数据接口的某个具体的数据:

myQuestion FooQuestion ::= SEQUENCE {trackingNumber     5,question           "Anybody there?"
}

复制

ASN.1用在很多地方比如下面要讲的X.509和PKCS group of cryptography standards。

文件编码格式

DER编码格式

引用自Wiki:

ASN.1 is closely associated with a set of encoding rules that specify how to represent a data structure as a series of bytes

意思是ASN.1有一套关联的编码规则,这些编码规则用来规定如何用二进制来表示数据结构,DER是其中一种。

把上面的FooQuestion的例子用DER编码则是(16进制):

30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

复制

翻译过来就是:

30 — type tag indicating SEQUENCE
13 — length in octets of value that follows02 — type tag indicating INTEGER01 — length in octets of value that follows05 — value (5)16 — type tag indicating IA5String (IA5 means the full 7-bit ISO 646 set, including variants, but is generally US-ASCII)0e — length in octets of value that follows41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f — value ("Anybody there?")

复制

看到这里你应该对DER编码格式有一个比较好的认识了。

PEM编码格式

引用自Wiki:

Privacy-Enhanced Mail (PEM) is a de facto file format for storing and sending cryptographic keys, certificates, and other data, based on a set of 1993 IETF standards defining "privacy-enhanced mail."

PEM是一个用来存储和发送密码学key、证书和其他数据的文件格式的事实标准。许多使用ASN.1的密码学标准(比如X.509和PKCS)都使用DER编码,而DER编码的内容是二进制的,不适合与邮件传输(早期Email不能发送附件),因此使用PEM把二进制内容转换成ASCII码。文件内容的格式像下面这样:

-----BEGIN label-----
BASE64Encoded
-----END label-----

复制

label用来区分内容到底是什么类型,下面会讲。

和PEM相关的RFC有很多,与本文内容相关的则是RFC7468,这里面规定了很多label,不过要注意不是所有label都会有对应的RFC或Specification,这些label只是一种约定俗成。

PEM实际上就是把DER编码的文件的二进制内容用base64编码一下,然后加上-----BEGIN label-----这样的头和-----END label-----这样的尾,中间则是DER文件的Base64编码。

我们可以通过下面的方法验证这个结论,先生成一个RSA Private Key,编码格式是PEM格式:

openssl genrsa -out key.pem

复制

查看一下文件内容,可以看到label是RSA PRIVATE KEY

-----BEGIN RSA PRIVATE KEY-----
BASE64Encoded
-----END RSA PRIVATE KEY-----

复制

然后我们把PEM格式转换成DER格式:

openssl rsa -in key.pem -outform der -out key.der

复制

如果你这个时候看一下文件内容会发现都是二进制。然后我们把DER文件的内容Base64一下,会看到内容和PEM文件一样(忽略头尾和换行):

base64 -i key.der -o key.der.base64

复制

证书、密码学Key格式

上面讲到的PEM是对证书、密码学Key文件的一种编码方式,下面举例这些证书、密码学Key文件格式:

X.509证书

引用自Wiki :

In cryptography, X.509 is a standard defining the format of public key certificates. X.509 certificates are used in many Internet protocols, including TLS/SSL, which is the basis for HTTPS, the secure protocol for browsing the web.

X.509是一个Public Key Certificates的格式标准,TLS/SSL使用它,TLS/SSL是HTTPS的基础所以HTTPS也使用它。而所谓Public Key Certificates又被称为Digital CertificateIdentity Certificate

An X.509 certificate contains a public key and an identity (a hostname, or an organization, or an individual), and is either signed by a certificate authority or self-signed.

一个X.509 Certificate包含一个Public Key和一个身份信息,它要么是被CA签发的要么是自签发的。

下面这种张图就是一个X.509 Certificate:

事实上X.509 Certificate这个名词通常指代的是IETF的PKIX Certificate和CRL Profile,见RFC5280。所以当你看到PKIX Certificate字样的时候可以认为就是X.509 Certificate。

PKCS系列

引用自Wiki:

In cryptography, PKCS stands for "Public Key Cryptography Standards"

前面提到的X.509是定义Public Key Certificates的格式的标准,看上去和PKCS有点像,但实际上不同,PKCS是Public Key密码学标准。此外Public-Key Cryptography虽然名字看上去只涉及Public Key,实际上也涉及Priviate Key,因此PKCS也涉及Private Key。

PKCS一共有15个标准编号从1到15,这里只挑讲PKCS #1、PKCS #8、PKCS #12。

PKCS #1

PKCS #1,RSA Cryptography Standard,定义了RSA Public Key和Private Key数学属性和格式,详见RFC8017。

PKCS #8

PKCS #8,Private-Key Information Syntax Standard,用于加密或非加密地存储Private Certificate Keypairs(不限于RSA),详见RFC5858。

PKCS #12

PKCS #12定义了通常用来存储Private Keys和Public Key Certificates(例如前面提到的X.509)的文件格式,使用基于密码的对称密钥进行保护。注意上述Private Keys和Public Key Certificates是复数形式,这意味着PKCS #12文件实际上是一个Keystore,PKCS #12文件可以被用做Java Key Store(JKS),详见RFC7292。

如果你用自己的CA所签发了一个证书,运行下列命令可以生成PKCS #12 keystore:

openssl pkcs12 -export \-in <cert> \-inkey <private-key> \-name my-cert \-caname my-ca-root \-CAfile <ca-cert> \-chain-out <pkcs-file>

复制

PKCS #12一般不导出PEM编码格式。

PEM格式速查

当你不知道你的PEM文件内容是什么格式的可以根据下面查询。

X.509 Certificate

RFC7468 - Textual Encoding of Certificates

-----BEGIN CERTIFICATE-----
BASE64Encoded
-----END CERTIFICATE-----

复制

X.509 Certificate Subject Public Key Info

RFC7468 - Textual Encoding of Subject Public Key Info

-----BEGIN PUBLIC KEY-----
BASE64Encoded
-----END PUBLIC KEY-----

复制

PKCS #1 Private Key

没有RFC或权威Specification,该格式有时候被称为traditional format、SSLeay format(见SO)

-----BEGIN RSA PRIVATE KEY-----
BASE64Encoded
-----END RSA PRIVATE KEY-----

复制

PKCS #1 Public Key

同上没有RFC或权威Specification

-----BEGIN RSA PUBLIC KEY-----
BASE64Encoded
-----END RSA PUBLIC KEY-----

复制

PKCS #8 Unencrypted Private Key

RFC7468 - One Asymmetric Key and the Textual Encoding of PKCS #8 Private Key Info

-----BEGIN PRIVATE KEY-----
BASE64Encoded
-----END PRIVATE KEY-----

复制

PKCS #8 Encrypted Private Key

RFC7468 - Textual Encoding of PKCS #8 Encrypted Private Key Info

-----BEGIN ENCRYPTED PRIVATE KEY-----
BASE64Encoded
-----END ENCRYPTED PRIVATE KEY-----

复制

Private Key操作命令

生成

生成PKCS #1格式的RSA Private Key

openssl genrsa -out private-key.p1.pem 2048

复制

转换

PKCS #1 -> Unencrypted PKCS #8

openssl pkcs8 -topk8 -in private-key.p1.pem -out private-key.p8.pem -nocrypt

复制

PKCS #1 -> Encrypted PKCS #8

openssl pkcs8 -topk8 -in private-key.p1.pem -out private-key.p8.pem

复制

过程中会让你输入密码,你至少得输入4位,所以PKCS #8相比PKCS #1更安全。

PKCS #8 -> PKCS #1

openssl rsa -in private-key.p8.pem -out private-key.p1.pem

复制

如果这个PKCS #8是加密的,那么你得输入密码。

Public Key操作命令

从PKCS #1/#8提取

提取指的是从Private Key中提取Public Key,openssl rsa同时支持PKCS #1和PKCS #8的RSA Private Key,唯一的区别是如果PKCS #8是加密的,会要求你输入密码。

提取X.509格式RSA Public Key

openssl rsa -in private-key.pem -pubout -out public-key.x509.pem

复制

提取PKCS #1格式RSA Public Key

openssl rsa -in private-key.pem -out public-key.p1.pem -RSAPublicKey_out

复制

从X.509证书提取

openssl x509 -in cert.pem -pubkey -noout > public-key.x509.pem

复制

转换

X.509 RSA Public Key -> PKCS #1 RSA Public Key

openssl rsa -pubin -in public-key.x509.pem -RSAPublicKey_out -out public-key.p1.pem

复制

PKCS #1 RSA Public Key -> X.509 RSA Public Key

openssl rsa -RSAPublicKey_in -in public-key.p1.pem -pubout -out public-key.x509.pem

X.509、PKCS文件格式介绍相关推荐

  1. 大数据常用文件格式介绍

    文章目录 一.SequenceFile 二.Avro 三.parquet 四.Orc 五.同为列式存储, orc和parquet的区别 列式存储的优化点 orc和parquet的一些区别和对比 六.一 ...

  2. N-Gram文件格式介绍 - ARPA

    From: https://cmusphinx.github.io/wiki/arpaformat/ Source: Wiki N-Gram文件格式介绍 - ARPA Statistical lang ...

  3. Flink大数据实时计算系列-列式存储parquet文件格式介绍、Flink进行rowformat格式文件保存

    Flink大数据实时计算系列-列式存储parquet文件格式介绍 Flink进行rowformat格式文件保存 列式存储parquet文件格式介绍

  4. 常用电子书文件格式介绍

    常用电子书文件格式介绍 http://ebook.18shouji.com/ old_西勾月 西勾月 论坛元老 发短消息 加为好友 当前离线 1# 大 中 小 发表于 2007-11-15 17:35 ...

  5. dxf文件用什么打开(dxf文件格式介绍)

    很多机械设计小伙伴日常工作都会接触到dxf文件,那么dxf是什么文件格式呢?以及dxf文件用什么打开?相信这都是很多机械设计小伙伴关心的问题,接下来小编就来跟大家讲解一下. 1.dxf文件格式介绍 D ...

  6. X.509证书的介绍

    目录 1.X.509简介 2.证书组成结构 3.证书文件扩展名 4.生成一个自签名证书的示例 5.生成签名请求及CA 签名 1.X.509简介 X.509是密码学里公钥证书的格式标准.X.509证书已 ...

  7. 程序常用配置文件格式介绍

    文章目录 1.键值对 2.JSON 2.1 JSON 语法 2.2 JSON 实例 2.3 JSON 解析 3.XML 3.1 XML 语法 3.2 XML 实例 3.3 XML 解析 4.YAML ...

  8. mp3 文件格式介绍

    1, MP3简介 MP3是今天一种常见的音乐格式,但恐怕除了工作要求之外,有兴趣对此进行研究的人恐怕不多.所以,当我打算做MP3解码方面的工作时,在找资料时也颇费了一番周折,同时也觉得很有趣.所以想在 ...

  9. Houdini文件格式介绍指南

    Houdini是一款专门用来制作视频特效的Mac软件,根据Houdini版本的不同,软件也会为大家提供不同形式的文件格式,例如Houdini Apprentice场景文件后缀为.hipnc(非商业性) ...

最新文章

  1. TiM:清华杨云锋-微生物功能性状的新兴模式
  2. 统计学原理-----概率分布
  3. 使用apidoc文档神器,快速生成api文档
  4. 在 aws emr 上,将 hbase table A 的数据,对 key 做 hash,写到另外一张 table B
  5. mysql t-sql,将T-SQL转换为MySQL
  6. 程序员的光荣与梦想——论侠客梦的延续与幻灭
  7. python字符串常用的方法_python字符串常用方法
  8. 二十一世纪Windows简史
  9. Wpf 数据绑定简介、实例1
  10. kaggle共享单车数据分析及预测(随机森林)
  11. java list转数组_java list 转数组
  12. 特斯拉卖保险会比卖车更赚钱吗?
  13. 介绍Unity中相机的投影矩阵与剪切图像、投影概念
  14. 机器阅读理解(MRC)和问答(QA)在信息抽取中的应用
  15. IDEA配置JavaScript库
  16. python can通信_Python中的高级/抽象Canbus接口
  17. 利好:北京医改鼓励医生个体行医异地行医
  18. 生成Xcode中各个尺寸的Mac App Icon
  19. 卷积神经网络group群卷积以及group lasso
  20. 第十二周项目四----利用遍历思想求解图问题之输出简单路径

热门文章

  1. 2018年中国对美贸易顺差3233.2亿美元 同比扩大17.2%
  2. postgre数据库优缺点
  3. vue页面截图;H5页面截图;vue项目中将特定网页内容生成图片(截图);html2canvas截图
  4. 如何使用slick插件(响应式轮播插件)
  5. java_基础_遍历map删除元素_Java 遍历Map(包括集合)时,修改删除元素
  6. 面试算法题-平衡点问题
  7. 如何提升推荐系统的可解释性?京东智能推荐卖点技术全解析
  8. PLSQL导入Excel遇到的奇怪问题
  9. 组合数学——二项式反演
  10. 0701微分方程的基本概念-微分方程