证书体系: 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,一经查实,立即删除!

相关文章

模拟网页行为之工具篇二

先说360浏览器,打开开发者选项,可以看到界面提供了几个功能选项,如图: 这个图片的第一个搜索图标点中过后,再去选中网页你感兴趣的部分就可以在Element选项中跳转到你感兴趣的代码。也可以直接ctrlF2搜寻你感兴趣网页元…

模拟网页行为之实践篇三

现在来谈下验证码图片的获取方式,带有验证码的地方都会附带有个刷新按钮,而刷新按钮的地方就是获取验证码网址代码。如果看过前面写的《模拟网页行为之工具篇》就会很容易定位到代码位置。定位到代码位置后看下图: 基本可以看到的是获取验证码…

SHA-256算法实现

SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生 的输出是一个256-bit 的报文摘要。该算法处理包括以下几步: STEP1:附加填充比特。对报文进行填充使报文长度与448 模512 同余(长度…

ecc算法入门介绍

一、从平行线谈起。 平行线,永不相交。没有人怀疑把:)不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了?事实上没有人见到过。所以“平行线,永不相交”只是假设(大家想想初中学习的平行…

Intel Hex概述

什么是Intel Hex文件 Intel HEX文件时遵循Intel HEX文件格式的ASCII文本文件。在Intel HEX文件的每一行都包含了 一个HEX记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成的。Intel HEX文件常用来传输要存储在ROM 或者 EPROM中的程序和数据。大部分的EPROM编程器…

AndroidStudio+ideasmali动态调试smali汇编

0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主,加上一点ida6.6的动态调试,但是ida的调试smali真的像鸡肋一样,各种不爽,遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态调试&a…

使用IDA Pro动态调试SO文件

(1)在IDA的安装路径中找到android_server文件。 (2)将android_server拷贝到手机的/data/local/tmp目录下面。 (3) 将手机插上电脑,打开命令提示符, 先输入”adb shell”,然后输入”…

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作(大数据处理)主要是.split和re.findall和glob.glob运用。 读取文件的路径(为了获得文件内容)和提取文件路径中感兴趣的东西(标签) 1,“glob.glob”用于读取文件路径 2,“.…

Android系统架构图

一、Aplications(应用层) 应用是用Java语言编写的云新在虚拟机上的程序。 二、Application Framework(应用框架层) 这一层是编写Google发布的核心应用时所使用的API框架,开发人员可以使用这些框架来开发自己的应用。 V…

AES算法重点详解和实现

可以看到,在原始数据长度为16的整数倍时,假如原始数据长度等于16*n,则使用NoPadding时加密后数据长度等于16*n,其它情况下加密数据长度等于16*(n1)。在不足16的整数倍的情况下,假如原始数据长度等于16*nm[其中m小于16]…

勒索病毒傀儡进程脱壳

样本是:wallet勒索病毒 环境:虚拟机VMWARE win7 32位 工具:OD,winhex 初次拿到样本,先用火绒剑工具监控下病毒样本的流程,可以看到有一个自创建进程的行为。 我们等找到OEP后,在CreateProcessA下…

arm32和arm64常用指令B BL BLX机器码计算

现在大部分手机cpu架构是ARM v7-A和ARMV8-A,,在ARM-v7A中常使用32位ARM指令集并且支持thumb指令集与arm的切换,而在ARMV8中使用的是64位ARM指令集且不再有thumb指令集状态的切换了。在调用函数时,会有常用的调用方式:BL和B&#x…

openssl c++实现bouncycastle中AES加解密

0x01 为什么要用bouncycastle 先说说JCE(Java Cryptography Extension)是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。 它提供对对称、不对称、块和流密码的加密…

win10用Eclipse+OpenJTag对S3C2440开发板进行动态调试

0 背景在S3C2400开发板裸板调试程序中,常用调试手段有三种:点灯法,串口打印,OpenOCD。OpenOCD又分命令行和图形界面(Eclipse)。点灯发和串口打印调试效率都很低,若能掌握第三种调试方法,会让开发过程变得高…

无源码情况下动态调试混淆的java程序

逆向工程JAVA通常是非常简单的,因为优秀的JAVA二进制反编译器已经存在多年。类似于jd-gui工具和恢复java二进制文件源代码功能也做的非常出色的。在这种情况下我们需要动态调试java反编译java程序的情况下,可以从反编译导出然后导入java IDE如Eclipse作为…

OpenJTAG调试S3C2440裸板程序

0x00 懵逼当你写好的初始化代码head.S和链接脚本uart.lds共同编译出来的*.bin,烧录到NandFlash中的时候,发现串口输出一片空白,这时你的想法是什么,砸电脑还是干点其他有用的事?还是老实的搭建调试环境吧,上…

APK逆向之静态分析篇

0x00 APK包结构0x01 APK反编译-apktool啰嗦一句,反编译之前配置好java环境,具体JDK安装过程,请参照之前的文章。下载最新版本的apktool.jar,并在当前目录下编辑脚本apktool.bat,内容如下: echo off set PAT…

S3C2440 lds链接脚本解析

1. SECTIONS到底意味着什么在一个裸版程序里面含有*.lds文件,而lds文件意味着如果你的程序烧录在nandflash,那在nandflash的内存将根据lds文件指定偏移来分布,下面从不同场景来解释SECTIONS的内容。2. 小于4K程序若程序小于4K,那…

安装qt5.9.5 windows环境

下载:用国外链接下载慢,还是乖乖用国内链接地址吧,我这里5.9.5http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.9/5.9.5/qt-opensource-windows-x86-5.9.5.exe。安装: 在安装的时候需要创建qt账号,然后根据你的vis…

qt在visual studio 2015下的使用

创建工程: 打开visual studio,按上一篇文章的方式创建新工程QtGuiApplication1,默认我们可以看到里面会出现QtGuiApplication1这个类是继承于QMainWindow这个类的。在创建过程中注意下图选项:有三个对象分别是QMainwindow&#xf…