证书-双证书请求文件

news/2024/11/18 7:47:39/文章来源:https://www.cnblogs.com/yang37/p/18293043

1.背景

关于数字证书、数字信封、OID等基本知识,此文不做赘述。

在传统的数字信封体系中,我们的流程大概这样的。

image-20240708163439802

这里有个值得注意的点是:

节点1用于加密对称密钥的公钥和节点3用于签名的私钥,它们是否可以是同一对。

基于这个思想,我们有了单证书体系和双证书体系。

其原因之一就是,从功能角度隔离开我们的加密秘钥对和签名密钥对。

根据“中国金融认证中心标准-SM2 双证书申请及下载规范”,我们可以看到一个双证书的基本流程。

  1. 产生签名密钥对和交互密钥对。

  2. 生成 Base64 编码的 SM2 双证书请求。

  3. 向服务器端提交 SM2 双证书请求。

  4. 解析服务器端返回的报文数据,并解密加密证书私钥。

  5. 导入签名公钥证书、加密公钥证书、加密证书私钥。

2.双证书

以国密SM2为例

上面我们知道,所谓的双证书,即。

  • 专门用于签名验签
  • 专门用于加密解密

注意,在中国金融认证中心标准-SM2 双证书申请及下载规范中,此处的加密秘钥不是由我们的本地生成的,而是由CA生成。

整个逻辑大致交互逻辑如下:

  • 本地生成签名公私钥对
  • 本地生成临时公私钥对(注意,非加密秘钥对,仅仅在生成请求证书阶段使用)
  • 结合签名公钥、临时公钥,生成双证书请求文件。
  • CA签发签名证书
  • CA生成加密公私钥对(并使用刚才我们的临时公钥加密加密秘钥对中的私钥)
  • 下载CA签发的签名证书、加密证书、加密私钥
  • 使用临时私钥解密加密过的私钥,得到最终的加密私钥。

image-20240710004147113

3.双证请求文件

请求文件、CSR、P10,不严格的场景下,你可以当做是同一个东西。

3.1 格式描述

3.1.1 整体格式

image-20240710010041063

SM2 双证书请求的 ASN.1 数据格式。

CertificationRequest ::= SEQUENCE {certificationRequestInfo CertificationRequestInfo,signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},signature BIT STRING
}
  • ccertificationRequestInfo: SM2 双证书请求信息。
  • signatureAlgorithm:签名算法 ID,文档中OID取值为:1.2.156.10197.1.501。
  • signature:使用签名私钥,对 certificationRequestInfo 节点的签名结果。

这里提到了oid,可以在这里查询。

国家OID注册中心

GmSSL

然后,这里的{{ SignatureAlgorithms }}是什么意思呢?

  • AlgorithmIdentifier:这是一个ASN.1的标准类型,用于标识算法。它通常包含两个字段:算法OID(对象标识符)和可选的参数。

  • {{ SignatureAlgorithms }}:表示AlgorithmIdentifier的值必须来自SignatureAlgorithms的集合。

嗯,就是下面这个。

image-20240710011413875

3.1.2 CertificationRequestInfo

image-20240710010353721

CertificationRequestInfo ::= SEQUENCE {version INTEGER,subject Name,subjectPKInfo SubjectPublicKeyInfo,attributes [0] Attributes
}
  • version:版本号,本文档中取值为 0x00。

  • subject:公钥证书 DN。详细介绍,请参考 PKCS#10。

  • subjectPKInfo:签名公钥信息。

  • attributes:属性信息。

3.1.3 SubjectPublicKeyInfo

image-20240710011520142

SubjectPublicKeyInfo ::= SEQUENCE {algorithm AlgorithmIdentifer,subjectPublicKey BIT STRING
}AlgorithmIdentifer::= SEQUENCE {algorithm OBJECT IDENTIFIER,parameters ANY DEFINED BY algorithm OPTIONAL
}
  • algorithm:ECC 公钥算法 OID,在本文档中,取值为:1.2.840.10045.2.1。

  • parameters:SM2 公钥算法 OID,在本文档中,取值为:1.2.156.10197.1.301。

  • subjectPublicKey:SM2 公钥数据,结构如下。

    0x04||签名公钥 X 分量||签名公钥 Y 分量。
    

3.1.4 attributes

Attributes ::= Context[0] {chanllegPassword ChanllegPassword,tempPublicKeyInfo TempPulicKeyInfo
}
ChanllegPassword ::= SEQUENCE {chanllegPasswordOID OBJECTIDENTIFIER,password PrintableString
}
TempPulicKeyInfo ::= SEQUENCE {tempPublicKeyOID OBJECTIDENTIFIER,tempPublicKey OCTECT STRING
}
  • password:默认取值:111111。
  • tempPublicKeyOID:交互公钥标识 OID,本文档中取值为:1.2.840.113549.1.9.63。
  • tempPublicKey:交互公钥 TempPulicKey 的 OCTECT STRING 编码。

image-20240710011645538

3.1.5 交互公钥

image-20240710011658192

TempPulicKey ::= SEQUENCE {version INTEGER,tempPublicKeyData OCTET STRING
}
  • version:版本号,本文档中取值为:0x01。

  • tempPublicKeyData:交互公钥数据,结构如下。

    0x00 0xB4 0x00 0x00||0x00 0x01 0x00 0x00 ||交互公钥 X 分量||32 字节 0x00 扩展空间||交互公钥 Y 分 量||32 字节 0x00 扩展空间
    

3.2 示例文件

首先,给出文档中的demo双证请求文件。

MIIB0TCCAXUCAQAwWzENMAsGA1UEBh4EAEMATjEhMB8GA1UECh4YAEMARgBDAEEAIABUAEUAUwBU
ACAAQwBBMScwJQYDVQQDHh4AYwBlAHIAdABSAGUAcQB1AGkAcwBpAHQAaQBvAG4wWTATBgcqhkjO
PQIBBggqgRzPVQGCLQNCAAQv93JF1oROzBImU6Plgleu+HI659cECfKn+gajy7JWGAEoSyw+9rsB
WoRA+kqA7FmgO8NcNcm3fRBWS+yLBMLUoIG3MBMGCSqGSIb3DQEJBxMGMTExMTExMIGfBgkqhkiG
9w0BCT8EgZEwgY4CAQEEgYgAtAAAAAEAAGmQSyS20/zQ4tHJQKA5EYPgdLuPE568SYcKlqmwWGjW
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACokwM02BfEmqVM+qPPlx2I4v38pc1N4WgC
xVb2QmgSygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAwGCCqBHM9VAYN1BQADSAAw
RQIgfm4txwd5pHMPPtsHEfN+4Y8iMKmKCxy1T3eIMwkYS0kCIQCu6nbbBxVF99qaX1h1/qksk9u9
fs6qkzlkrFbkPkvMjw==

我们使用ASN.1在线解析工具,可以看到大体结构,上文中对细节处已经做了框选,此处不赘述。

image-20240710005900697

看起来复杂,实际也很复杂,哈哈。

但是别慌,跟咱们前面的格式描述那里对应上就好了。

就像咱们Java的实体类一样,没啥特别的,只不过走了ASN1编码而已。

3.3 代码

本文基于Java构建

4.结果文件解析

4.1 分析

根据规范,将会收到3个结果文件。

image-20240710012307258

  • SignCert.cer:签名对应的公钥证书
  • EncCert.cer:加密对应的公钥证书
  • PrivateKey.key:加密过的公私钥文件(使用我们的临时公钥加密)

由规范指引,我们可以得到解密的具体逻辑。

image-20240710012558519

image-20240710012539475

image-20240710012656444

  • 根据,分隔,提取密文数据。
  • 解析密文数据,得到实际密文。
  • 使用临时公钥解密密文,得到秘钥值。

注意,直接移除,后得到的数据并不是直接的SM2解密源文,它是具有如下结构的(回顾3.1.5节)。

TempPulicKey ::= SEQUENCE {version INTEGER,tempPublicKeyData OCTET STRING
}

4.2 代码

注意点如下:

  • 返回的数据里面会解析出version和encryptedKeyData两个部分的数据,encryptedKeyData才是我们实际解密的源数据。
  • 使用BC库解密的时候,私钥前加00/密文前加04/公钥前加04。
  • 经过验证,模式使用C1C3C2

关于为啥咱们BC库里密文前要加04,你可以参考这个issue:hutool-SM2私钥解密文件报错Invalid point encoding 0x30

当然,咱们此处没有用hutool,不过原因你可以研究下。

具体代码参考:easy-cryptography

image-20240710022210297

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

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

相关文章

[数据结构] 二叉搜索树基本操作

这篇文章记录了二叉搜索树的基本操作定义 二叉搜索树是一种特殊的二叉树,其定义如下:空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二…

014 批处理系统

写在前面 本随笔是非常菜的菜鸡写的。如有问题请及时提出。 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 本章目的保障系统安全 多应用支持本章需要实现的新功能构造包含操作系统内核和多个应用程序的单一执行程序 通过批处理支持多个程…

DOM属性

常用 DOM 属性innerHTML:用于获取或设置元素的 HTML 内容。 可以直接插入 HTML 代码,适合处理复杂的 HTML 结构。element.innerHTML = <p>New content</p>; console.log(element.innerHTML);innerText:用于获取或设置元素的文本内容,只包括可见的文本。 会触发重…

【一天一点.NET小知识】运用向量VectorT加速求和计算

随着 .NET 版本的演进,从 .NET Standard 2.0 版本开始,支持 Vector<T> 类型。 Vector<T> 类型:表示指定数值类型(适用于并行算法的低级别优化)的单个向量。 假如我们有一个求和函数接受一个int数组入参,当它的长度大于等于8及其倍数以上时,那么我们就可以考…

实战篇——CSRF漏洞pikachu靶场实战

实战篇——CSRF漏洞pikachu靶场实战 CSRF的原理 攻击者利用用户在某个网站上的已登录状态,诱使用户点击恶意链接,恶意页面会向服务器自动发送预先准备好的恶意请求。由于请求中自动包含了用户的认证凭证,服务器会误以为是合法的用户操作,从而执行恶意请求。 CSRF的分类 (1)…

Bulldog_2 靶机提权

一、目标环境 攻击者(kali)、目标服务器(ubuntu) 二、信息收集 1、探测靶机 使用fscan进行探测 ./fscan -h ip 段发现目标地址,并且还发现对方开启了80端口 三、目标站点的访问以及检测然后发现两个接口,分别是登陆和注册的然后就是在登陆接口这边尝试一下弱口令发现并不…

PySimpleGUI笔记

本博客详细介绍了 PySimpleGUI 的基本用法和高级功能,并通过实际案例演示了如何使用 PySimpleGUI 开发图形用户界面 (GUI) 应用。主要内容包括:基本用法:介绍了 PySimpleGUI 的基本组件和窗口创建方法,通过简单示例展示了如何创建和管理窗口。 事件处理:讲解了如何处理用户…

忆 2015 硅谷之行

2015 硅谷之行 ,是我脑海里一段充满海蓝色的记忆。 有点像刘姥姥进大观园,也有点像进入另外一个我不曾幻想过的世界。 郊区很美 我们住在郊区,人很少,景色很美。每次去吃饭,还得驱车 15 分钟左右去附近最近的餐厅。Google 总部 Google 对于每个程序员来讲,都是一个梦幻的…

py并发编程

并发编程(并发,并行,同步,异步) 通俗理解并发编程中的相关核心概念 核心概念:进程、线程CPU的作用计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 CPU的核数(多核计算机多个CPU,大部分情况下也只是用了一核CPU)假定工厂的电力有限,一次只…

Android studio导出apk文件

在Android studio中打开项目 选择build——》 build bundle(s)/apk(s)——》build apk(s) 加载完成后点击右下角弹窗的local(或者在  项目地址\app\build\outputs\apk\debug  中找到apk文件) 将apk文件复制到对应设备上就可以啦(最好别用qq)

JDK、JRE、JVM

JDK:Java Development Kit JRE: Java Runtime Environment JVM: Java Virtual Machine

[CINTA] 具体数论与代数阅读笔记——第一章 整数和二进制(含加、乘、除)

这里是王立斌老师的《具体数论与代数》(CINTA)的阅读笔记前言 这本书说自己是计算机专业数学入门之入门,成为读者攻读其他经典著作的垫脚石,但个人以为足矣替换掉本校内不知所云的、抽象的、让学生考完后马上全忘的那些课程。本书的 GitHub 仓库在这里。 该笔记并非单纯的整…