证书体系: CSR 解析

原文同时发布于本人个人博客: 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!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

胡思乱想

学了一段时间的OGRE,才知道什么才称得上"建筑师",而我们只不过是"砌墙匠" 他们在算法算法,我们在Coding Coding,怎样才能有所改观呢~~~想当初还不如选数学专业再来学计算机可能好些, 但是既然选择了先学计算机这条路,那就先Coding,边Coding边提高数学能力…

关于数据库备份的问题

首先我们来看数据库帮助上面的sql语句: BACKUP DATABASE Northwind TO DISK c:/Northwind.bakRESTORE FILELISTONLY FROM DISK c:/Northwind.bakRESTORE DATABASE TestDB FROM DISK c:/Northwind.bak WITH MOVE Northwind TO c:/test/testdb.mdf, MOVE N…

关于函数指针调用C++非静态成员

当在类里面定义函数指针,而函数指针会指向类里面的成员的时候,这个时候成员需要定义为静态成员。实例代码如下: //.h#define SCMD_REGISTER 0class CCallFuctionList{public:CCallFuctionList();virtual ~CCallFuctionList(void);typedef…

重构心得

重构入手: 1. 找到牵连最广模块。 2. 找到上述模块中需要重构的相关的子类。 3. 原来代码不删除,保证编译运行。 4. 陆续重构其他模块 再列出我觉得可以借鉴的重构方法。【摘自代码大全】 1.保存初始代码。用你的版本控制系统保存一个初始版本&#x…

跨模块中的分配内存问题

现在有dll模块A,dll模块B以及静态库C, C中有个全局Create()函数负责创建对象M,当第二次调用Create()的时候会增加引用计数,并返回原来创建的对象M。Relase()会减少引用计数。当引用计数为0时,销毁对象M。现在在模块A中创建的初始化对象M,模块…

CListControl的OnMouseMove和OnNcHitTest

实际案例如下: 将CListCtrl做成菜单样式。需要处理当鼠标移到ClistCtrl上的事件。 处理逻辑这样:当鼠标移动到CListCtrl区域时候,将CListCtrl上所有ITem置为非选中状态,然后调用HitTest得到行数再将所选行置为选中状态。当鼠标移…

关于函数指针续

前面有提到过关于函数指针调用C非静态成员&#xff0c;解决了在类内调用函数指针的问题。 class CCallFuctionList { public: CCallFuctionList(); virtual ~CCallFuctionList(void); typedef void (CCallFuctionList::*FUNCPTR)(); typedef std::multimap<unsi…

关于函数指针续二

前篇文章解决了关于函数指针的不同类成员函数传递的问题。不知道细心的朋友看见我上篇文章后&#xff0c;是否发现参数必须被限制为特定的参数。 原来改进的代码如下&#xff1a; class CCallFuctionList { public:CCallFuctionList(); virtual ~CCallFuctionL…

HGE2D引擎按键消息分析

我们自己先动手来模仿HGE其键盘特殊按键消息响应&#xff0c;其中所涉及到的数据操作含义稍后再介绍。 首先创建基于对话框CGetKeyBoardTestDlg的程序&#xff0c;创建一个STATIC控件ID为IDC_STATIC_CONTENT在对话框上面。添加成员 unsigned char kbstate[256]; 和int flag; 在…

HGE引擎适用于MFC的修改

打开hge181/src/core/system.cpp 找到System_Initiate()函数&#xff0c;可以看见里面有段代码是用于创建窗口。 // Register window classwinclass.style CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;winclass.lpfnWndProc WindowProc;winclass.cbClsExtra 0;wincl…

关于CString

昨天重构代码的时候&#xff0c;这样一段代码&#xff1a; CString str _T("bbbbbbbb");LVITEM item GetItem(str);LVITEM CLVIItemTestDlg::GetItem(CString text){LVITEM item;item.iItem 0;item.iSubItem 0;item.mask LVIF_TEXT;item.pszText text.GetBuffer…

HGE2D引擎按键消息分析(续)

继续上一章对其按键消息处理抽丝剥茧。看BuildEvent()函数里面 我们先来分析其这段代码 if(typeINPUT_KEYDOWN){if((flags & HGEINP_REPEAT) 0) keyz[key] | 1;ToAscii(key, scan, kbstate, (unsigned short *)&eptr->event.chr, 0);}if(typeINPUT_KEYUP){keyz[key…

动态链接MFC引发的血案

首先简单描述下程序运行的步骤&#xff0c; 我们要去加载两个DLL&#xff0c;先加载的称为A,后加载的称为B&#xff0c;加载A在里面做的事情是动态创建一个全局对象&#xff0c;加载B在里面做的事情是取得这个全局对象&#xff0c;然后干其他事情。 我们机子上运行的非常完美。…

规避软件架构风险之反模式

在QCON大会上&#xff0c;Michael Nygard&#xff0c;以及 李伟专家都提到了一个概念&#xff0c;容错能力。 衡量软件架构最佳的一个很重要的因素就是看软件的容错能力。没有容错能力的软件&#xff0c;哪怕你QA都非常优秀&#xff0c;但一发生故障就出现集联失效&#xff0c;…

使用DC

timer里面尽量避免使用DC&#xff0c;不然会非常慢

wxPython做界面的适用性

wxpython 优点&#xff1a; 1. 提高了程序的可维护性 2. 界面布局可由专业人员设计 3. 更好的支持GUI布局设计工具 4. 作为wxWidgets的规范&#xff0c;XRC资源可通用于C、Python等语言 5. PYTHON脚本语言上手很快。 6. 分离界面布局和程序逻辑 7. 跨平台 缺点&…

ODBG常用快捷键总结

CtrlN 输入表查看。一般在没加壳的程序中能够解析出来。实践过程中&#xff0c;可快速定位到一些常用API&#xff0c;然后将其作为突破口。 AltM 内存查看。能快速定位不同模块的区段&#xff0c;能够设置某个模块的访问断点。 Alt<- 看见高手操作&#xff0c;能直接恢…

wPython环境安装

http://laochake.javaeye.com/blog/438667 关于版本问题&#xff0c;还是用最新最稳定就行。

__declspec(naked)和__asm编写实践总结

__cdecl 和 __stdcall 压栈参数顺序是一致的&#xff0c;但平衡堆栈方式不一样。 __cdecl调用函数方式是调用者&#xff0c;即函数外部平衡堆栈&#xff0c;一般是在函数外部调用add esp, xxxx&#xff0c;函数内部只需要ret返回就行 __stdcall调用函数方式是被调用&#xff…

逆向调试雷电思路总结

1.首先根据内存变化&#xff0c;能迅速找到飞机的生命&#xff0c;炸弹&#xff0c;分数&#xff0c;能够基本确认飞机结构。 2.找飞机位置有点困难&#xff0c;但可以查找飞机结构属性周围的内存变化找到飞机变化的坐标&#xff0c;这里有个小技巧&#xff0c;可以将内存十六进…