X.509数字证书

1、简介

       X.509是被广泛使用的数字证书标准:是由国际电联电信委员会为单点登录和授权管理基础设施制定的PKI标准。

        X.509定义了(但不仅限于)公钥证书、证书吊销清单、属性证书和证书路径验证算法等证书标准。

        X.509数字证书:由用户公钥和用户标识符组成。此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息。

2、版本

        1)X.509 v1:设定了一系列严格的CA分级体系来颁发数字证书。和其他网络信任模型对比,任何人,不仅仅是特定的CA,可以签发并验证其他密钥证书的有效性。

        2)X.509 v2: 引入了主体和签发人唯一标识符的概念,以解决主体和/或签发人名称在一段时间后可能重复使用的问题。(未广泛使用)

        3)X.509 v3 :增加支持扩展的概念,因此任何人均可定义扩展并将其纳入证书中。现在常用的扩展包括:KeyUsage(仅限密钥用于特殊目的,例如“只签”)和 AlternativeNames(允许其它标识与该公钥关联,例如 DNS 名、电子邮件地址、IP 地址)。扩展可标记为“极重要”,以表示应选中该扩展并强制执行或使用。(使用最广)

3、结构 

4、编码

        1)结构概述

        X.509证书的结构是用ASN1(Abstract Syntax Notation One)进行描述数据结构,并使用ASN1语法进行编码。

        ASN1采用一个个的数据块来描述整个数据结构,每个数据块都有四个部分组成:

类型标识(1字节)

长度(1字节)

值(不定长)

结束标识(2字节)

        a、数据块数据类型标识(一个字节)

        简单类型:不能再分解类型,如整型、比特串、字节串、对象标示符、日期型等。

        结构类型:由简单类型和结构类型组合而成的,如顺序类型、选择类型、集合类型等。

        b、数据块长度(1-128个字节)

        若长度值小于等于127,则用一个字节表示,bit8 = 0, bit7-bit1 存放长度值;

        若长度值大于127,则用多个字节表示,可以有2到127个字节。第一个字节的第8位为1,其它低7位给出后面该域使用的字节的数量,从该域第二个字节开始给出数据的长度,高位优先。

        还有一种特殊情况,这个字节为0x80,表示数据块长度不定,由数据块结束标识结束数据块。

        c、数据块的值

        存放数据块的值,具体编码随数据块类型不同而不同。

        d、数据块结束标识(可选)

        结束标示字段,两个字节(0x0000),只有在长度值为不定时才会出现。

        2)类型标识定义

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

标示 TAG 类型

结构体

类型的TAG

        a、Bit7-bit6用来标示TAG类型

        (00) universal:普通类型,如:

                BOOLEAN            [有两个值:falsetrue]

                INTEGER             [整型值]

                BIT STRING         [0位或多位]

        (01) application:

        (10) context-specific: 特殊内容, bit4-bit0的值含义如下:

                [0] –- 表示证书的版本

                [1] –- issuerUniqueID,表示证书发行者的唯一id

                [2] –- subjectUniqueID,表示证书主体的唯一id

                [3] –- 表示证书的扩展字段

        (11) private:

        b、Bit5表示是否为结构类型

        1是结构类型,0是简单类型。

        c、Bit4-bit0是类型的TAG值

        根据bit7-bit6的不同值有不同的含义

5、文件格式

        1).cer/.crt是用于存放证书,以二进制形式存放,不含私钥

        2).pem.crt/.cer的区别是它以Ascii来表示,可以用于存放证书或私钥。

        3).pfx/.p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式。

        4).p10是证书请求。

        5).p7rCA对证书请求的回复,只用于导入

        6).p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥

6、openssl创建根证书

        1)创建根证私钥

openssl genrsa -out root-key.key 1024

        2)创建根证书请求文件

openssl req -new -out root-req.csr -key root-key.key -keyform PEM

        3)自签根证书

openssl x509 -req   -extfile /etc/pki/tls/openssl.cnf -extensions v3_req  -in root-req.csr -out root-cert.cer -signkey root-key.key -CAcreateserial -days 3650

         重要说明: -extfile /etc/pki/tls/openssl.cnf -extensions v3_req  参数是生成 X509 V3 版本的证书的必要条件。 /etc/pki/tls/openssl.cnf  是系统自带的OpenSSL配置文件,该配置文件默认开启 X509 V3 格式

        4) 导出p12格式根证书

openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root-key.key -out root.p12

7、openssl颁发证书 

        1)生成客户端key

openssl genrsa -out client-key.key 1024

        2)生成客户端请求文件

openssl req -new -out client-req.csr -key client-key.key

        3)生成客户端证书,使用根证书签名

openssl x509 -req -extfile /etc/pki/tls/openssl.cnf -extensions v3_req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA root-cert.cer  -CAkey root-key.key -CAcreateserial -days 3650

        4)生成客户端p12格式根证书

openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...