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编码规则分析及证书密钥编码方式的更多相关文章

  1. 建立标准编码规则(四)-C#编码规范分类及实现

    1 现实中的问题 在任何一个公司,每个程序员编写的习惯可能都是不一样的,大到命名空间,小到变量的名字.甚至,我们去github,里面的大牛每个开源的项目的命名规则可能都不一样. 我们通常会遇到下面的问 ...

  2. WEB前端 [编码] 规则浅析

    前言 说到前端安全问题,首先想到的无疑是XSS(Cross Site Scripting,即跨站脚本),其主要发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被 ...

  3. 通用的业务编码规则设计实现[转:http://www.cnblogs.com/xqin/p/3708367.html]

    一.背景 每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理系统中的订单编号,比如商品管理系统中的商品编码,比如项目管理系统中的项目编码等等,这一系列的编码都需要管理起来,那么它们的 ...

  4. X.509证书的编码及解析:程序解析以及winhex模板解析

    一.证书的整体结构:证书内容.签名算法.签名结果. 用ASN.1语法描述如下: Certificate::=SEQUENCE{ tbsCertificate TBSCertificate, signa ...

  5. IIS8中使用OpenSSL来创建CA并且签发SSL证书

    前言 [转载]http://alvinhu.com/blog/2013/06/12/creating-a-certificate-authority-and-signing-the-ssl-certi ...

  6. 基于OpenSSL自建CA和颁发SSL证书

    关于SSL/TLS介绍见文章 SSL/TLS原理详解.关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个 ...

  7. URL编码规则

    一.问题的由来 问题:当url地址中包含&.+.%等特殊字符(主要是传递参数时,参数的内容中包含这些字符)时,地址无效.比如http://10.190.0.0:108/doc/test+des ...

  8. UTF-8编码规则(转)

    from:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html UTF-8是Unicode的一种实现方式,也就是它的字节 ...

  9. Base64编码原理分析

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...

随机推荐

  1. JS中的for和for in循环

    1.for循环通常用来遍历数组或类数组对象 模式1:长度缓存 for(var i=0,max=arr.length;i<max;i++){ //your code } 模式2:逐减,与零比较比与 ...

  2. C++类中的静态成员变量与静态成员函数的使用

    代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...

  3. C#界面设计疑问

    1.就是想做一个类似下面界面的窗体,上面一排按键,点击一个下面对应改变一次界面的内容,这是如何实现的呢 ...是不是通过,比如这里有四个按键,然后使用4个大小相同的面板,每个面板内容不同.按一个按键, ...

  4. [转载]Git常用命令

    转载自: Git常用命令 Git配置 git config --global user.name "robbin" git config --global user.email & ...

  5. C语言之利用递归将十进制转换为二进制

    #include<stdio.h>#include<stdlib.h>void change2(int num){  if (num != 0)   {   change2(n ...

  6. JDK PATH 和 CLASSPATH环境变量的作用及其配置

    (1)PATH环境变量的作用 在安装JDK程序之后,在安装目录下的bin目录中会提供一些开发Java程序时必备的工具程序. 对于Java的初学者,建议在命令符模式下使用这些工具程序编译运行Java程序 ...

  7. 163k地方门户网站系统自动审核信息脚本

    本代码实现对163k地方门户网站系统发布信息的自动审核,以及对内容中链接全过滤 软件安装 Python 安装 http://www.python.org/download/ pymssql安装 htt ...

  8. 安装wampserver2时出现的问题

    提示丢失MSVCR100.dll 如果安装其他软件也是同样的提示情况,估计也是这个原因,以下分别是32位与64位的VC10下载地址: VC10 SP1 vcredist_x86.exe 32 bits ...

  9. 图片以BLOB存储在后台数据库中,Android客户端要进行读取显示

    解决方法: 1:在后台以InputStream的方式将图片从数据库中读出: public static InputStream getPicInputStream(){ String id = &qu ...

  10. LeetCode_Rotate Image

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...