草庐IT

X509证书详解

Simple-Easy 化繁为简 2023-09-06 原文

先解释一些概念:

Certification authority (CA):被信任的证书颁发机构,负责创建公钥证书和提供数字签名。

CA certificate: 一个CA的公钥证书,可以是自己发给自己的,也可以来自别的CA。

public-key infrastructure (PKI):公钥体系

subscriber 证书订阅人,向证书颁发机构申请证书

公钥证书分为两大类:

  • CA certificates:证书颁发机构的自身证书,通常是由上一级单位发放
  • end-entity public-key certificates:普通用户证书

CA 权威公钥证书分为三种类型:

  • Self-issued certificate:自发放证书,颁发证书的CA和被颁发者是同一个CA;
  • Self-signed certificate:自签名证书,是一种特殊的自发放证书,此证书签名用的私钥是和证书里面的公钥是配对的。
  • Cross-certificate:颁发证书的CA和被颁发者是不同的CA;

注意:CA证书里面应该把  basicConstraints 扩展项的cA 字段设置为TRUE

CA权威机构之间关系:

 证书的信任路径:

Relying party 是使用证书的用户(certificate user),它验证由 CA 颁发给 subscriber的证书是否合法。 

公钥证书或数字证书是由认证机构(CA: Certificate Authority)颁发的,使用者需要对证书进行验证,如果证书的格式千差万别那就不方便了。于是,人们制定了证书的标准规范,其中使用最广泛的是由 ITU(International Telecommunication Union)定义,经PKIX(Public-Key Infrastructure standards for X.509)工作组改造过的X.509规范(RFC5280)

PKI 主要由证书订阅人(申请并提供证书的服务端)、证书登记注册机构(RA: Registration Authority)、证书认证颁发机构(CA: Certification Authority)、证书使用者(请求验证证书的客户端)等部分构成,

证书的订阅:由订阅人subscriber发起订阅请求,CA权威机构负责处理和发放证书。发放的公钥证书需要包含订阅人公钥、订阅人身份信息、证书颁发者数字签名等相关信息的数字文件,

 证书的吊销:

当证书申请者出现私钥泄露或者不再使用证书等情况时,就需要将证书作废。要作废数字证书需要符合相应的标准或流程,目前主要有两种证书吊销标准:

CRL(Certificate Revocation List):证书吊销列表CRL是一组未过期、但是却已经被吊销的证书序列号列表,CA维护了一个或多个这样的列表,每一张证书都需要在CRL分发点扩展字段中包含对应的CRL地址。CRL最大的问题在于它越来越大,实时查询起来会非常慢;
OCSP(Online Certificate Status Protocol):在线证书状态协议OCSP允许验证证书的客户端获得一张证书的吊销信息,OCSP服务器的地址包含在证书的授权信息访问扩展字段中。OCSP支持实时查询并且解决了CRL最大的缺点,证书吊销检查更快速可靠,但也带来了一些新的问题,这些问题将在网络攻防中不断解决。
 

因为根认证机构数量有限,不可能所有的服务器都直接找根认证机构申请证书。为了提高证书的申请与管理效率,证书的申请认证是分层级的,从根证书到申请机构可能有多个中间层级的认证机构,这些中间层级的认证机构都需要有上一级的认证机构数字签名才是可信的,最终一直到根认证机构签名。我们使用的操作系统或浏览器中可能只有根认证机构的公钥,从根认证机构的证书逐层往下验证到服务器的证书颁发机构。很显然,证书链越短,进行身份认证需要传输的数据量越少,身份认证效率自然越高。

在 root CA offline 的前提下,为使证书 issuance 可扩展(例如,使自动化成为可能),root private key 只在很少情况下使用,

用来签发几个intermediate certificates。然后 intermediate CA(也称为 subordinate CAs)用相应的 intermediate private keys 来签发 leaf certificates to subscribers。

这种 leaf、intermediate、root 组成的证书捆绑(bundle)机制,形成了一个证书链(certificate chain)。

leaf 由 intermediate 签发,

intermediate 又由 root 签发,

root 自签名(signs itself)

技术上来说,上面都是简化的例子,你可以创建更长的 chain 和更复杂的图(例如,cross-certification[48])。但不推荐这么做,因为复杂性很快会失控。在任何情况下,end entity certificates 都是叶子节点,这也是称为叶子证书(leaf certificate)的原因。

二 X509证书的ASN.1的描述

     X509的公钥证书的机构是通过ASN.1来描述的,可以通过DER编码生成二进制,然后在经过Base64的编码生成文本文件保存。一般是PEM后缀的文件。如下例子中的PEM文件内容:

-----BEGIN CERTIFICATE-----MIIBwzCCAWqgAwIBAgIRAIi5QRl9kz1wb+SUP20gB1kwCgYIKoZIzj0EAwIwGzEZMBcGA1UEAxMQTDVkIFRlc3QgUm9vdCBDQTAeFw0xODExMDYyMjA0MDNaFw0yODExBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRc+LHppFk8sflIpm/XKpbNMwx3SDAfBgNVHSMEGDAWgBTirEpzC7/gexnnz7ozjWKd71lz5DAKBggqhkjOPQQDAgNHADBEAiAejDEfua7dud78lxWe9eYxYcM93mlUMFIzbWlOJzg+rgIgcdtU9wIKmn5qFU3iOiRP5VyLNmrsQD3/ItjUN1f1ouY=

-----END CERTIFICATE-----

数字证书 X509详解 && python解析SSL证书_大鹏爱分享的博客-CSDN博客_python x509

成员格式
版本号INTEGER
序列号INTEGER
签名算法OBJECT
颁发者SET
有效期UTC_TIME
主体SET
主体公钥BIT_STRING
主体公钥算法OBJECT
签名值BIT_STRING

公钥证书的ASN.1的结构如下:

Certificate ::= SEQUENCE {

        tbsCertificate       TBSCertificate, -- 证书主体

        signatureAlgorithm   AlgorithmIdentifier, -- 证书签名算法标识

        signatureValue       BIT STRING --证书签名值,是使用signatureAlgorithm部分指定的签名算法对tbsCertificate证书主题部分签名后的值;具体取值取决于采用的算法和被签名的内容。

         }

   TBSCertificate ::= SEQUENCE {

        version         [0] EXPLICIT Version DEFAULT v1, -- 证书版本号

        serialNumber         CertificateSerialNumber, -- 证书序列号,对同一CA所颁发的证书,序列号唯一标识证书

        signature            AlgorithmIdentifier, --证书签名算法标识

        issuer               Name,                --证书发行者名称

        validity             Validity,            --证书有效期

        subject              Name,                --证书主体名称

        subjectPublicKeyInfo SubjectPublicKeyInfo,--证书公钥

        issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,

                             -- 证书发行者ID(可选),只在证书版本2、3中才有

        subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,

                             -- 证书主体ID(可选),只在证书版本2、3中才有

        extensions      [3] EXPLICIT Extensions OPTIONAL

                             -- 证书扩展段(可选),只在证书版本3中才有

        }

   Version ::= INTEGER { v1(0), v2(1), v3(2) }

   CertificateSerialNumber ::= INTEGER

   AlgorithmIdentifier ::= SEQUENCE {

        algorithm               OBJECT IDENTIFIER,

        parameters              ANY DEFINED BY algorithm OPTIONAL }

   parameters:

   Dss-Parms ::= SEQUENCE { -- parameters ,DSA(DSS)算法时的parameters,

RSA算法没有此参数

        p             INTEGER,

        q             INTEGER,

        g             INTEGER }

signatureValue:

Dss-Sig-Value ::= SEQUENCE { -- sha1DSA签名算法时,签名值

                   r       INTEGER,

                      s       INTEGER }
   Name ::= CHOICE {

     RDNSequence }

   RDNSequence ::= SEQUENCE OF RelativeDistinguishedName

   RelativeDistinguishedName ::=

     SET OF AttributeTypeAndValue

   AttributeTypeAndValue ::= SEQUENCE {

     type     AttributeType,

     value    AttributeValue }

   AttributeType ::= OBJECT IDENTIFIER

   AttributeValue ::= ANY DEFINED BY AttributeType

   Validity ::= SEQUENCE {

        notBefore      Time,  -- 证书有效期起始时间

        notAfter       Time  -- 证书有效期终止时间

        }

   Time ::= CHOICE {

        utcTime        UTCTime,

        generalTime    GeneralizedTime }

   UniqueIdentifier ::= BIT STRING

   SubjectPublicKeyInfo ::= SEQUENCE {

        algorithm            AlgorithmIdentifier, -- 公钥算法

        subjectPublicKey     BIT STRING            -- 公钥值

        }

subjectPublicKey:

RSAPublicKey ::= SEQUENCE { -- RSA算法时的公钥值

         modulus            INTEGER, -- n

         publicExponent     INTEGER -- e -- }

   Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension

   Extension ::= SEQUENCE {

        extnID      OBJECT IDENTIFIER,

        critical    BOOLEAN DEFAULT FALSE,

        extnValue   OCTET STRING }

具体wireshark里面的例子:


         
                Certificate Length: 516
                Certificate: 30820200308201a3a00302010202060172a83ecf43300c06082a811ccf55018375050030… (id-at-commonName=demo1.gmssl.cn,id-at-organizationalUnitName=PKI/SM2,id-at-organizationName=GMSSL,id-at-countryName=CN)
                    signedCertificate
                        version: v3 (2)
                        serialNumber: 0x0172a83ecf43
                        signature (iso.2.156.10197.1.501)   SM2签名算法(证书的签名算法)
                            Algorithm Id: 1.2.156.10197.1.501 (iso.2.156.10197.1.501)


                      issuer: rdnSequence (0) (证书的签发机构的组织结构位置信息)
                            rdnSequence: 4 items (id-at-commonName=MiddleCA for Test,id-at-organizationalUnitName=PKI/SM2,id-at-organizationName=GMSSL,id-at-countryName=CN)
                                RDNSequence item: 1 item (id-at-countryName=CN)
                                    RelativeDistinguishedName item (id-at-countryName=CN)
                                        Id: 2.5.4.6 (id-at-countryName)
                                        CountryName: CN
                                RDNSequence item: 1 item (id-at-organizationName=GMSSL)
                                    RelativeDistinguishedName item (id-at-organizationName=GMSSL)
                                        Id: 2.5.4.10 (id-at-organizationName)
                                        DirectoryString: printableString (1)
                                RDNSequence item: 1 item (id-at-organizationalUnitName=PKI/SM2)
                                    RelativeDistinguishedName item (id-at-organizationalUnitName=PKI/SM2)
                                        Id: 2.5.4.11 (id-at-organizationalUnitName)
                                        DirectoryString: printableString (1)
                                RDNSequence item: 1 item (id-at-commonName=MiddleCA for Test)
                                    RelativeDistinguishedName item (id-at-commonName=MiddleCA for Test)
                                        Id: 2.5.4.3 (id-at-commonName)
                                        DirectoryString: printableString (1)


                        validity  有效期
                            notBefore: generalizedTime (1)
                            notAfter: generalizedTime (1)
                        subject: rdnSequence (0)  证书订阅人信息(此处未展开)


                        subjectPublicKeyInfo 公钥
                            algorithm (id-ecPublicKey)
                                Algorithm Id: 1.2.840.10045.2.1 (id-ecPublicKey) 
                                ECParameters: namedCurve (1)(未展开的内容应该是椭圆曲线的ISO编号)
                            Padding: 0
                            subjectPublicKey: (公钥具体取值,此处是ECC的公钥,有R/S两部分组成,共64字节,并经过DER编码)04de8ac0d2d5916e178c9cef0292944090572ff44ea19421fb50199881071419c10d7b5c…
                        extensions: 5 items

    Extension Id: 2.5.29.15 (id-ce-keyUsage)  公钥的用途说明:
    critical: True
    Padding: 0
    KeyUsage: 38
        0... .... = digitalSignature: False
        .0.. .... = contentCommitment: False
        ..1. .... = keyEncipherment: True
        ...1 .... = dataEncipherment: True
        .... 1... = keyAgreement: True
        .... .0.. = keyCertSign: False
        .... ..0. = cRLSign: False
        .... ...0 = encipherOnly: False
        0... .... = decipherOnly: False
                    algorithmIdentifier (iso.2.156.10197.1.501)
                    Padding: 0
 encrypted: (此处是证书的签名值,应该是由发证书的CA机构的私钥签名的)3046022100b5ee4b3756f901c9f4849104171dd551f17601a6a88c14803df2c2ea7fedfe

其中:Keyusage说明如下:

digitalSignature: 由上层应用来决定是否使用。

contentCommitment:由上层应用来决定是否使用。

keyEncipherment: 用于在密钥传输过程中的对密钥的加密;

dataEncipherment:用于数据面的加密

keyAgreement:在key协商中当作公钥来使用

keyCertSign:用来当作公钥去验证证书中的颁发机构的签名

cRLSign:用于在证书召回时候的验证签名

encipherOnly:在key协商中当作公钥来使用,仅用于加密

decipherOnly:在key协商中当作公钥来使用,仅用于解密

RDN的解释:

relative distinguished names,用来提供能区分证书颁发者(或证书订阅者)的信息,比如证书颁发者的办公地点/国家/城市/组织名字/域名等。

typedescriptionOID
CNcommonName2.5.4.3
SNsurname 2.5.4.4
SERIALNUMBERserialNumber 2.5.4.5
CcountryName 2.5.4.6
LlocalityName 2.5.4.7
ST or SstateOrProvinceName 2.5.4.8
STREETstreetAddress 2.5.4.9
OorganizationName 2.5.4.10
OUorganizationalUnit 2.5.4.11
T or TITLEtitle 2.5.4.12
G or GNgivenName 2.5.4.42
EemailAddress (deprecated)1.2.840.113549.1.9.1
UIDuserID 0.9.2342.19200300.100.1.1
DCdomainComponent 0.9.2342.19200300.100.1.25



 

有关X509证书详解的更多相关文章

  1. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  2. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  3. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  4. ruby - 如何获得带有 SSL 客户端证书的 HTTPS 请求以与 Ruby EventMachine 一起使用? - 2

    我正在尝试使用RubyEventMachine访问使用SSL证书身份验证的HTTPSWeb服务,但我没有让它工作。我编写了以下简单代码块来对其进行端到端测试:require'rubygems'require'em-http'EventMachine.rundourl='https://foobar.com/'ssl_opts={:private_key_file=>'/tmp/private.key',:cert_chain_file=>'/tmp/ca.pem',:verify_peer=>false}http=EventMachine::HttpRequest.new(url).g

  5. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  6. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  7. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  8. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  9. ruby - OpenSSL 验证来自自己 CA 的证书 - 2

    大家好,感谢您花时间阅读本文。我需要验证由我自己的CA颁发的证书,我有一个证书。我怎样才能做相当于openssl的openssl验证-CAfile在Ruby代码中?OpenSSL的RDoc在这方面不是很有帮助。我试过:require'openssl'ca=OpenSSL::X509::Certificate.new(File.read('ca-cert.pem'))lic=OpenSSL::X509::Certificate.new(File.read('cert.pem'))putslic.verify(ca)但我得到:test.rb:7:in`verify':wrongargume

  10. Ruby Gem Twitter - 证书验证失败(Twitter::Error::ClientError) - 2

    我正在尝试使用ruby​​gem'twitter',但由于未知原因我无法使用它。这是.rb代码:require'twitter'puts"Greetings,World!"puts"Checkpoint1"Twitter.configuredo|config|config.consumer_key="xxxxxxx"#removedforpostingconfig.consumer_secret="xxxxxxx"#removedforpostingconfig.oauth_token="xxxxxxx"#removedforpostingconfig.oauth_token_secr

随机推荐