X.509、PKCS文件格式介绍
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 Certificate 或 Identity 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文件格式介绍相关推荐
- 大数据常用文件格式介绍
文章目录 一.SequenceFile 二.Avro 三.parquet 四.Orc 五.同为列式存储, orc和parquet的区别 列式存储的优化点 orc和parquet的一些区别和对比 六.一 ...
- N-Gram文件格式介绍 - ARPA
From: https://cmusphinx.github.io/wiki/arpaformat/ Source: Wiki N-Gram文件格式介绍 - ARPA Statistical lang ...
- Flink大数据实时计算系列-列式存储parquet文件格式介绍、Flink进行rowformat格式文件保存
Flink大数据实时计算系列-列式存储parquet文件格式介绍 Flink进行rowformat格式文件保存 列式存储parquet文件格式介绍
- 常用电子书文件格式介绍
常用电子书文件格式介绍 http://ebook.18shouji.com/ old_西勾月 西勾月 论坛元老 发短消息 加为好友 当前离线 1# 大 中 小 发表于 2007-11-15 17:35 ...
- dxf文件用什么打开(dxf文件格式介绍)
很多机械设计小伙伴日常工作都会接触到dxf文件,那么dxf是什么文件格式呢?以及dxf文件用什么打开?相信这都是很多机械设计小伙伴关心的问题,接下来小编就来跟大家讲解一下. 1.dxf文件格式介绍 D ...
- X.509证书的介绍
目录 1.X.509简介 2.证书组成结构 3.证书文件扩展名 4.生成一个自签名证书的示例 5.生成签名请求及CA 签名 1.X.509简介 X.509是密码学里公钥证书的格式标准.X.509证书已 ...
- 程序常用配置文件格式介绍
文章目录 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 ...
- mp3 文件格式介绍
1, MP3简介 MP3是今天一种常见的音乐格式,但恐怕除了工作要求之外,有兴趣对此进行研究的人恐怕不多.所以,当我打算做MP3解码方面的工作时,在找资料时也颇费了一番周折,同时也觉得很有趣.所以想在 ...
- Houdini文件格式介绍指南
Houdini是一款专门用来制作视频特效的Mac软件,根据Houdini版本的不同,软件也会为大家提供不同形式的文件格式,例如Houdini Apprentice场景文件后缀为.hipnc(非商业性) ...
最新文章
- TiM:清华杨云锋-微生物功能性状的新兴模式
- 统计学原理-----概率分布
- 使用apidoc文档神器,快速生成api文档
- 在 aws emr 上,将 hbase table A 的数据,对 key 做 hash,写到另外一张 table B
- mysql t-sql,将T-SQL转换为MySQL
- 程序员的光荣与梦想——论侠客梦的延续与幻灭
- python字符串常用的方法_python字符串常用方法
- 二十一世纪Windows简史
- Wpf 数据绑定简介、实例1
- kaggle共享单车数据分析及预测(随机森林)
- java list转数组_java list 转数组
- 特斯拉卖保险会比卖车更赚钱吗?
- 介绍Unity中相机的投影矩阵与剪切图像、投影概念
- 机器阅读理解(MRC)和问答(QA)在信息抽取中的应用
- IDEA配置JavaScript库
- python can通信_Python中的高级/抽象Canbus接口
- 利好:北京医改鼓励医生个体行医异地行医
- 生成Xcode中各个尺寸的Mac App Icon
- 卷积神经网络group群卷积以及group lasso
- 第十二周项目四----利用遍历思想求解图问题之输出简单路径
热门文章
- 2018年中国对美贸易顺差3233.2亿美元 同比扩大17.2%
- postgre数据库优缺点
- vue页面截图;H5页面截图;vue项目中将特定网页内容生成图片(截图);html2canvas截图
- 如何使用slick插件(响应式轮播插件)
- java_基础_遍历map删除元素_Java 遍历Map(包括集合)时,修改删除元素
- 面试算法题-平衡点问题
- 如何提升推荐系统的可解释性?京东智能推荐卖点技术全解析
- PLSQL导入Excel遇到的奇怪问题
- 组合数学——二项式反演
- 0701微分方程的基本概念-微分方程