原文同时发布于本人个人博客: https//kutank.com/blog/cert-csr/


简介


CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识,重点集中在 CSR 所包含的信息,及其意义。

CSR 的作用:

CSR 通常由想要获得 X.509 证书的实体(entity) 创建,然后提交给 CA (Certificate Authority), CA 使用它来为实体创建对应的 X.509 证书.


CSR 组成


CSR 中通常包含三部分:

  • 实体的标识名(Distinguished name)
  • 实体的公钥(public key)
  • 其他有关实体的属性信息

在整个证书体系中,所有格式的证书通常以 ASN.1 的方式编码存储在文件中。

接下来,我们学习一下 CSR 的格式,以及如何使用 ASN.1 进行编码


CertificationRequest


CSR 的所有信息包含在根节点 CertificationRequest 中。 它的格式如下:

CertificationRequest ::= SEQUENCE {certificationRequestInfo CertificationRequestInfo,signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},signature BIT STRING
}AlgorithmIdentifier {ALGORITHM:IOSet } ::= SEQUENCE {algorithm ALGORITHM.&id({IOSet}),parameters ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL
}SignatureAlgorithms ALGORITHM ::= {... -- add any locally defined algorithms here -- }

由CertificationRequest 的定义可知,它有三个子节点,分别为:

  • certificationRequestInfo: 这个子节点包含了所有关于实体的信息,以及实体想要附带在证书中的属性信息。 这个结构会被签名 (sign)
  • signatureAlgorithm: 这个子节点包含了 certificationRequestInfo 节点进行签名时所使用的签名算法的信息.
  • signature: 这个子节点包含的对 certificationRequestInfo 节点使用 signatureAlgorithm 进行签名,所得到的签名结果
签名过程

上面我们看到,CertificationRequest 中的 certificationRequestInfo 节点被签名,得到 signature 子节点。

签名过程如下:

  • 首先,对 certificationRequestInfo 节点使用 ASN.1 DER 方式进行签名,确保签名过程的输入无二义性 (ASN.1 BER 编码方式得到的结果不唯一,因此使用 DER).
  • 以第一步所得结果作为输入, 使用实体的私钥(private key), 使用 signatureAlgorithm 节点中所描述的签名算法进行签名。 得到的结果,保存在 signature 节点中.

CertificationRequestInfo


接着,我们来看看 CertificationRequestInfo 的结构,这个子节点是 CSR 的核心,包含实体的信息.


CertificationRequestInfo ::= SEQUENCE {version INTEGER { v1(0) } (v1,...),subject Name,subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},attributes [0] Attributes{{ CRIAttributes }}
}SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE {algorithm AlgorithmIdentifier {{IOSet}},subjectPublicKey BIT STRING
}PKInfoAlgorithms ALGORITHM ::= {... -- add any locally defined algorithms here -- }Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}CRIAttributes ATTRIBUTE ::= {... -- add any locally defined attributes here -- }Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {type ATTRIBUTE.&id({IOSet}),values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type})
}

接下来,我们来逐一描述 CertificationRequestInfo 结构中的各个子节点.

  • version: 版本号。 RFC 中描述,为了和将来新版本的 CSR 规范兼容,这里应该使用 0.
  • subject: 实体的标识名. 这个节点对应于将要生成的 X.509 证书中的 Subject 结构.
  • subjectPublicKeyInfo: 这个节点中包含了实体的公钥信息. (比如,比较常见的是 RSA 公钥, 此时这个此段中包含 RSA 公钥的 ASN.1 编码的结果)
  • attributes: 这个节点包含了一系列属性,这些属性将会被包含在将来生成的 X.509 证书中.

实例


接下来,我们通过一个真实的 CSR 文件来巩固一下上面所学。

我们使用 openssl 来创建一个测试 CSR 文件,命令如下:

openssl req -newkey rsa:2048 -keyout PRIVATEKEY.key -out MYCSR.csr

MYCSR.csr 文件内容如下:

-----BEGIN CERTIFICATE REQUEST-----
MIIC+jCCAeICAQAwgYoxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdTaGFhbnhpMQ0w
CwYDVQQHDARYaWFuMRQwEgYDVQQKDAtUZXN0T3JnTmFtZTEVMBMGA1UECwwMVGVz
dFVuaXROYW1lMQ8wDQYDVQQDDAZUZXN0Q04xHDAaBgkqhkiG9w0BCQEWDXRlc3RA
dGVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5RhgkWN2X
emYjdCR6RLyZjB/WnbafGLzQGuiob9oO89cG2mjL00al19OAPXm/xK9gBwKqO9b+
0QZNFjE81Txo1uxMxs/zILbmVwqISeGESzOi3MOIKCUv/+Zyitrprd9hdSk1Dtny
fS79Nbdd3tkBuVPjIFxay/2fnTv7u4tDDHnfTl1l53Zq+TLRACVtprY45krM/cx4
vhYbjwtZyCtrq1yMZl4QiJCnw1Lcg4jbwjl9tPhziD2ECJErlo5Nhy2u7bFvVXw8
J9L0FhNn9TjJsFa7IXajS4/5VHvmGPBaJMyPSQKiqDhzwi7WjowuV8/X7j/5u8Ei
jUqg7IFIlUblAgMBAAGgKjATBgkqhkiG9w0BCQIxBgwEdGVzdDATBgkqhkiG9w0B
CQcxBgwEdGVzdDANBgkqhkiG9w0BAQsFAAOCAQEAZVHb37v0+iERaXUC2ARncSRa
fTN3m9nHz5UMQVObye98PFIKTPWTyFSZoh0YHQVarIE8lbl1sXSnKIv7xUqaDz1r
8H6Tr3eoy3RpOifU3jC+8GSId/1xgAAzFWhoW6Y/s5X4NdQV1n6OnLr0FGuza0HZ
O2tkXieo+df8P0bbON5AFNQlRztxFm2/t/wkzAl7jT3Olp7oTxCmonZKH8Zb/uIW
7ObYExumz21EpsVawZ38Lqcz6atbZe8O0SHFyZwndzzW0xI4Ulq6n4+lvL3ArDiy
sHQ74wSVAvZPFqdRz3ObfHBuqYyjcNKo4NuxOsFUhQbN1Tffw+w42iRyp8XbKw==
-----END CERTIFICATE REQUEST-----

因为本篇文章,我们不是学习 ASN.1 编码规则,我们不再阐述如何解码, 我们借助工具来看看他的内容。

CSR 的主要结构已经在上图中进行了简要的标注. 我们简单的总结一下:

  • 根节点是 CertificationRequest 结构
  • 根节点下包含了三个子节点,分别为: CertificationRequestInfo, AlgorithmIdentifier, Sigature
  • CertificationRequestInfo 节点中包含了CSR的版本号,请求签名的实体的 Subject 信息,和请求的签名算法,以及实体的额外的属性
  • 版本号为 0,这里是规定的,没有特殊意义
  • Subject 信息是将要创建的 X.509 证书中将要使用的,他是证书中除了公钥之外,最重要的信息。 更多信息,我们在 X509 证书的文章中讲述
  • SubjectPublicKeyInfo 中包含了当前实体想要想要在创建出来的 X.509 证书中使用的公钥。 从上图中,我们看到,是一个 key 长度为 2048 的 RSA 公钥,其中 BIT STRING 节点中包含了对应的公钥参数
  • attributes 包含额外的属性
  • AlgorithmIdentifier 中指定了 Signature 节点中的签名计算时使用的签名算法

疑问?


  1. CSR 中包含实体的私钥吗?

    CSR 中不包含实体的私钥证书。 私钥是永远不会出示给任何其他实体的,应当谨慎保存。 但是创建 CSR 时需要使用实体的私钥对 CSR 中 CertifiationRequestInfo 节点进行签名。 另外,CSR 中需要包含实体的公钥信息(放在 CertificationRequestInfo 的子节点 SubjectPublicKeyInfo 节点中)。


END!!!

证书体系: CSR 解析相关推荐

  1. 国密SSL协议之双证书体系

    1 背景 国密SSL协议使用双证书体系.本文描述了国密双证书体系的组成和差别,并描述了在U盾里面的使用情况. 2 国密SSL双证书 国密SSL协议使用双证书体系,分别称为签名证书和加密证书,服务器和用 ...

  2. 2010年06月《安全天下事之安全的证书与证书体系的安全》

    安全的证书与证书体系的安全 (2010年6月)主持人/江海客 马勇:网名 znsoft,驱动开发网创始人,铠信安全实验室高级合伙人.专注于数字防泄密,公钥基础设施PKI体系以及Windows 文件系统 ...

  3. 【Qt】x509证书操作之解析证书信息

    QSslCertificate支持x509证书信息的解析 证书信息接口 函数 功能 QByteArray version() const 版本 QByteArray serialNumber() co ...

  4. 【备份专题】备份软件体系架构解析

     备份软件体系架构解析 ICT架构师技术交流 从今天开始,我将陆续分享有关备份架构和特性系列知识,数据保护方案目前主要分了两大类,一类是备份,另一类是容灾.备份主要是对数据提供多副本冗余,当数据发 ...

  5. fisco bcos证书体系

    更多区块链技术与应用分类: 区块链应用    区块链开发 以太坊 | Fabric | BCOS | 密码技术 | 共识算法 | 比特币 | 其他链 通证经济 |  传统金融场景 | 去中心化金融 | ...

  6. 在阿里云centos7.4上配置nginx免费的https证书,支持泛解析

    在阿里云centos7.4上配置nginx免费的https证书,支持泛解析 一 原理说明: 使用acme.sh工具来生成证书,但为了方面采用的使用dns添加TXT记录验证方式,跟传统的webroot有 ...

  7. 证书体系: PFX 文件格式解析

    原文同时发布于本人个人博客: https://kutank.com/blog/cert-pfx/ 章节目录 PFX 简介 PFX 格式解析 2.1 最外层结构 2.2 AuthenticatedSaf ...

  8. 生成证书申请csr文件

    一.执行命令 openssl req -nodes -newkey rsa:2048 -keyout liexiulive.key -out liexiulive.csr 二.根据提示输入基本信息 G ...

  9. SSL证书生成CSR文件

    今天被同事发来一个邮件,说要生成一个CSR文件.这一下子懵掉,有种熟悉又陌生的感觉.后来百度,查了一些资料,大概了解了.但是后面还要再理解下.大概是这样的. CSR文件用来申请证书(提供给证书供应商) ...

最新文章

  1. su mysql bash 4.1_故障案例: 进入到心创建的用户中,系统会提示-bash-4.1$,请问如何解决?...
  2. 关于mtl_transactions_interface表序列
  3. C#: IntelliSense 貌似做错了一些事情。
  4. 浅谈ThreadPool 线程池(引用)
  5. 讨论UML概念和模型UML九种图。
  6. 个人创业做什么好?以下这几个值得考虑
  7. 苹果自动关机_零下二十度,登山表爆表,苹果冻关机,电霸手机好
  8. 全网首个OpenPrompt尝鲜报告:Prompt研究者必备实验利器
  9. C++模板的那丢丢事儿
  10. 幼儿园计算机教师论文,幼儿园中班教师论文
  11. flex java oracle_Flex使用Blazeds与Java交互及自定义对象转换详解-DATAGRID读取ORACLE数据...
  12. 思维导图 进阶(01)关键词提取,思维导图的灵魂
  13. .net core 中使用httpclient下载文件
  14. 项目管理里面的十大知识领域
  15. MASM32编写TcpStatC再进阶 显示PID和对应进程说明符
  16. zblog自动采集伪原创站群文章更新器
  17. python 办公常用一:从文本文件中提取手机号码
  18. Android列表视图(ListView--SimpleAdapter)学习
  19. phpExcel 正确读取excel表格时间
  20. 我理解的战争(程序员是需要有立场的)

热门文章

  1. 设计测试用例之正交法
  2. 星速配资:周期股调整大消费反弹 行情风格要切换?
  3. 解决Ubuntu 18.04 系统桌面鼠标光标消失的问题
  4. 【知识图谱】【 实践工具 】【Windows】- Protege - graphviz做图形可视化(三)
  5. 灰度图转热力图_热力图——实现从1到N的热用户转化
  6. Centos7安装Nessus教程
  7. 六个框架,一百多条检查项目,保证PCB设计不再出错
  8. 《鬼谷子本经阴符七术》2灵龟养志法 (原文)
  9. 2022年春华为机试
  10. 大带宽机房适用于视频等大流量业务