openssl ans.1编码规则分析及证书密钥编码方式
1 数据编码格式
openssl的数据编码规则是基于ans.1的,ans.1是什么 ? 先上高大上的解释
ASN.1(Abstract Syntax Notation One), 是一种结构化的描述语言,包括两部分,数据描述语言和数据编码规则,数据描述语言标准:语言标准允许用户自定义的基本数据类型,并可以通过简单的数据类型组成更复杂的数据类型。数据编码规则:这些编码方法规定了将数字对象转换成应用程序能够处理、保存、传输的二进制形式的一组规则。标准ASN.1编码规则有规范编码规则(CER,Canonical Encoding Rules)、唯一编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。
没看懂?好吧,我也没看懂。经过搜索无数资料后,现把自己的理解说一下,有不对的地方请大牛指正
我们知道在计算机语言中有很多的数据结构,有列表、集合、数组等等。但对应用程序特别是网络来说,这些数据结构都是二进制的数据流,那么如何把这些不同的数据结构变成数据流,又能让其他应用能够识别呢。这就需要一个标准,也就是我们说的ans.1,大家都遵守这个标准,自然可以和平共处。OK,这个标准到底是什么玩意?
这个问题一会再来回答。现在我们想想如何把一个二叉树中的数据以流的形式发出去,对于整型、字符串这些基本类型我们可以直接塞进数据流里,但对于这种复杂的结构,这种方法就不显示了,怎么办?我们引入一个数字对象的概念,把这些数据结构转化成一个数字对象,怎么转?这就用到了asn.1标准的第一部分--数据描述语言标准,这个标准定义了一些基本的数据类型,如果我们使用到复杂的数据结构,asn.1还允许通过简单数据类型组成复杂的数据类型(x.509)。
数字对象已经建立的,怎么把这个数据对象变成二进制流呢,这就需要用到ans.1的第二部分--编码规则,编码方法规定了将数字对象转换成应用程序能够处理、保存、传输的二进制形式的一组规则。
现在可以回答上面这个问题了,简单来说这个标准就是规定了把数据转化成数据对象,又规定数据对象编码为二进制流的方法。
openssl使用的是asn.1的der编码规则,保证每个asn.1对象使用der编码的出的二进制编码是唯一的。
openssl使用pem作为基本的文件编码格式,pem和der是什么关系,如下图所示,几种加密环节是可选的

从本质上来说,openssl是pem编码就是在der编码的技术上进行Base64编码,然后添加一些头尾信息组成,可以通过openssl指令对der和pem进行格式转换
2 证书编码格式
常见的证书编码格式有三种X.509证书,PKCS#12证书PKCS#7证书。
X.509证书:最常用的证书格式,它仅包含了公钥信息而没有私钥信息,一个openssl签发经过PEM编码的X.509证书看起来如下
-----BEGIN CERTIFICATE-----
XXX
-----END CERTIFICATE-----
中间部分就是经过PEM编码的X509证书。除了上述形式的头尾格式,还可能出现以下两种不同的标识符
-----BEGIN X. CERTIFICATE----
XXX
-----END X. CERTIFICATE-----
或者
-----BEGIN TRUSTED CERTIFICATE-----
-----END TRUSTED CERTIFICATE-----
X.509证书文件的后缀名经常是der,cer或者crt。openssl的指令x509提供了对X.509证书进行格式转换的方法。
PKCS#12证书:PKCS12证书可以包含一个或者多个证书,并且还可以包含证书对应的私钥。openssl的pkcs12指令可以将X.509格式的证书和私钥封装成PKCS#12格式的证书,也可以将PKCS#12证书转换成X.509证书
PKCS#12证书的后缀名通常是p12或者pdx
PKCS#7证书: PKCS#7可以封装一个或者多个X.509证书或者PKCS#6证书,并且可以包含CRL信息。PKCS#7证书中也不包含私钥信息。openssl提供了crl2pkcs7和pkcs7两个指令来生成和处理PKCS#7文件,可以使用他们在X.509证书和PKCS#7证书之间进行转换和处理
PKCS#7证书的后缀名是p7b
3 密钥编码
openssl有多种形式的密钥,openssl提供PEM和DER两种编码方式对这些密钥进行编码,并提供相关指令可以使用户在这两种格式之间进行转换
openssl密钥大致可以分为两种,一种是可以公开的,例如公钥,一种是不能公开的,比对私钥。反映在编码上,有的密钥需要加密,有的密钥就不需要加密。一个经过加密的PEM编码密钥文件会在PEM文件中增加一些头信息,表明密钥的加密状态,加密算法及初始化向量等信息
openssl指令提供了对密钥加密的功能,并提供了多种可选的对称加密算法,比如DES和DES3。当对密钥进行加密的时候通常需要用户输入口令,这里的口令并非直接用来作为加密的密钥,而是根据这个口令使用一系列HASH操作来生成一个用户加密密钥数据的密钥。当读取这类密钥的时候,同样需要输入同样的口令。
openssl ans.1编码规则分析及证书密钥编码方式的更多相关文章
- 建立标准编码规则(四)-C#编码规范分类及实现
1 现实中的问题 在任何一个公司,每个程序员编写的习惯可能都是不一样的,大到命名空间,小到变量的名字.甚至,我们去github,里面的大牛每个开源的项目的命名规则可能都不一样. 我们通常会遇到下面的问 ...
- WEB前端 [编码] 规则浅析
前言 说到前端安全问题,首先想到的无疑是XSS(Cross Site Scripting,即跨站脚本),其主要发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被 ...
- 通用的业务编码规则设计实现[转:http://www.cnblogs.com/xqin/p/3708367.html]
一.背景 每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理系统中的订单编号,比如商品管理系统中的商品编码,比如项目管理系统中的项目编码等等,这一系列的编码都需要管理起来,那么它们的 ...
- X.509证书的编码及解析:程序解析以及winhex模板解析
一.证书的整体结构:证书内容.签名算法.签名结果. 用ASN.1语法描述如下: Certificate::=SEQUENCE{ tbsCertificate TBSCertificate, signa ...
- IIS8中使用OpenSSL来创建CA并且签发SSL证书
前言 [转载]http://alvinhu.com/blog/2013/06/12/creating-a-certificate-authority-and-signing-the-ssl-certi ...
- 基于OpenSSL自建CA和颁发SSL证书
关于SSL/TLS介绍见文章 SSL/TLS原理详解.关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个 ...
- URL编码规则
一.问题的由来 问题:当url地址中包含&.+.%等特殊字符(主要是传递参数时,参数的内容中包含这些字符)时,地址无效.比如http://10.190.0.0:108/doc/test+des ...
- UTF-8编码规则(转)
from:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html UTF-8是Unicode的一种实现方式,也就是它的字节 ...
- Base64编码原理分析
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...
随机推荐
- JS中的for和for in循环
1.for循环通常用来遍历数组或类数组对象 模式1:长度缓存 for(var i=0,max=arr.length;i<max;i++){ //your code } 模式2:逐减,与零比较比与 ...
- C++类中的静态成员变量与静态成员函数的使用
代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...
- C#界面设计疑问
1.就是想做一个类似下面界面的窗体,上面一排按键,点击一个下面对应改变一次界面的内容,这是如何实现的呢 ...是不是通过,比如这里有四个按键,然后使用4个大小相同的面板,每个面板内容不同.按一个按键, ...
- [转载]Git常用命令
转载自: Git常用命令 Git配置 git config --global user.name "robbin" git config --global user.email & ...
- C语言之利用递归将十进制转换为二进制
#include<stdio.h>#include<stdlib.h>void change2(int num){ if (num != 0) { change2(n ...
- JDK PATH 和 CLASSPATH环境变量的作用及其配置
(1)PATH环境变量的作用 在安装JDK程序之后,在安装目录下的bin目录中会提供一些开发Java程序时必备的工具程序. 对于Java的初学者,建议在命令符模式下使用这些工具程序编译运行Java程序 ...
- 163k地方门户网站系统自动审核信息脚本
本代码实现对163k地方门户网站系统发布信息的自动审核,以及对内容中链接全过滤 软件安装 Python 安装 http://www.python.org/download/ pymssql安装 htt ...
- 安装wampserver2时出现的问题
提示丢失MSVCR100.dll 如果安装其他软件也是同样的提示情况,估计也是这个原因,以下分别是32位与64位的VC10下载地址: VC10 SP1 vcredist_x86.exe 32 bits ...
- 图片以BLOB存储在后台数据库中,Android客户端要进行读取显示
解决方法: 1:在后台以InputStream的方式将图片从数据库中读出: public static InputStream getPicInputStream(){ String id = &qu ...
- LeetCode_Rotate Image
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...