openssl定义国产数字证书主题项

2024-06-19 10:48

本文主要是介绍openssl定义国产数字证书主题项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根据国密标准《GM/T 0015 基于SM2密码算法的数字证书格式规范》规定了我国国密数字证书的格式规范。

对比国际标准,国内的标准定义了新算法sm2、sm3、sm4,也定义新的对象标识符OID。

本文要介绍主题项的含义,对象标识符的使用,和基于开源openssl的国密改造。

证书主题项

常见的证书主题项subject是一串文字,例如CN=李四,OU=网络安全部,O=sic,L=北京市,S=北京市,C=CN,主题subject唯一确定一个对象。

右图结构是一个目录结构,C代表国家,下一级是S代表省,L代表市,O代表部门,OU子部门,CN代表用户名。数字证书采用目录服务进行存储,目录服务可以提供路径创建,和节点存储和读取。

为什么要提供证书信息的读取?

保密通信。Alice从LDAP服务器上获得了Bob的证书,提取证书中的公钥,采用Bob公钥加密信息,发送给Bob。Bob拥有自己的私钥,解密加密文件获得原始信息。

数字签名。Bob与Alice签订了一份合同,合同中写明Bob应付给Alice 100万元,Bob应用自己的私钥对合同进行数字签名,发送给Alice,Alice可以通过LDAP获取Bob的证书,提取Bob公钥,验证合同的签名。

在上述2个事件中,Alice都要依赖Bob的数字证书(可信数字证书,参考资料1)。如果没有LDAP服务,Bob也可以直接发送给Alice。但在一些情况下,Bob可能并不知道潜在发信方。在签名场景中,也必须实现可公开的签名验证。

保存了用户信息和公钥的数字证书,被称作公钥证书。除公钥证书外,还有也保存私钥的证书格式,这种数字证书中的私钥采用对称算法加密保护,用户调用时要输入口令。通常用户的私钥要保存在硬件介质中,不会存放在LDAP服务上。

除公钥证书之外,还有一些种类的证书,如属性证书、电子证照、事件证书等。这些证书中没有公钥,只有信息数据和权威机构的对信息的数字签名。这种证书不适宜用目录结构存储。

数字证书目录服务结构

目录服务可以很容易组成集群方式,将其他目录服务作为连接到本目录服务的路径下,如下图所示

在实际工作中,目录也是可以采用分级结构,如CA采用多级结构,RA可以写入本地区的LDAP目录中。如下图所示。

多个CA可以共享一个目录服务集群,如下图所示

无论CA/RA采用什么分级方式写入到LDAP,以及LDAP集群的架构采用哪种方式,CA签发数字证书写入到LDAP集群,都遵循主题项的规制,才能实现采用同样的规则读取。

数字证书的文件格式

证书主题项CN=李四,OU=网络安全部,O=sic,L=北京市,S=北京市,C=CN的含义。C,S,L,O,OU,CN都是在X509标准中预定义的主题项,这些主题项也成了全球通用的标准。

OID(Object Identifier 对象标识符)是由ISO/IEC、ITU共同提出的标识机制,OID标识方案为分层、树状结构,不同层次之间用“.”分隔,层数无限制。用于对任何类型的对象进行全球无歧义、唯一命名。国际OID注册管理由ITU-T SG17和ISO/IEC JTC1/SC6共同负责,已在202个国家中采用,各个国家自我管理。

为了防止文字的歧义,数字证书采用了OID。用OID表示C,S,L,O,OU,CN等主题项。查看openssl的源码,在crypto/objects/objects.txt中定义OID。关于X509证书内容如下。从文档的定义,用层级方式定义x500,x509,以及各主题项。

根据国密标准,参考guanzhi/Gmssl的整理,OID可以参看http://gmssl.org/docs/oid.html。部分定义如下

1.2.156.10197 oscca
1.2.156.10197.1 sm-scheme
1.2.156.10197.1.101.1 SM6-ECB
1.2.156.10197.1.101.2 SM6-CBC
1.2.156.10197.1.101.3 SM6-OFB
1.2.156.10197.1.101.4 SM6-CFB
1.2.156.10197.1.102.1 SM1-ECB
1.2.156.10197.1.102.2 SM1-CBC

......

OID在证书格式中存储

使用openssl在生成证书时,通常采用交互方式,要求用户输入信息,如下图:

用windows查看生成的证书,通常如下:

在openssl中的Country Name,对应证书查看的C项,但是在证书文件的存储中只保留了Oid,CountryName/C都是在软件上为了友好显示进行转化的。

采用ASNIviewer等查看工具查看证书文件,如下所示。在证书中SEQUENCE对象保存key,value数据结构。key中保存OID 2.5.4.8,value保存了UTF8'BJ'的值。

Openssl中定义主题项 和国密算法OID

在使用Openssl中,修改源码中的crypto/objects/objects.txt文件,make update编译时会调用PERL重新生成obj_mac.h 等头文件,支持新的OID。红字部分重新编译了头文件。

rm -f rm -f rm -f libcrypto.a libssl.a rm -f *.map rm -f apps/gmssl fuzz/asn1-test fuzz/asn1parse-test fuzz/bignum-test fuzz/bndiv-test fuzz/cms-test fuzz/conf-test fuzz/crl-test fuzz/ct-test fuzz/server-test fuzz/x509-test apps/CA.pl apps/tsget tools/c_rehash util/shlib_wrap.sh rm -f crypto/bn/x86_64-mont5.s crypto/bn/x86_64-gf2m.s crypto/rc4/rc4-x86_64.s crypto/sha/sha1-mb-x86_64.s crypto/aes/aes-x86_64.s crypto/bn/rsaz-avx2.s crypto/modes/ghash-x86_64.s crypto/bn/rsaz-x86_64.s crypto/aes/vpaes-x86_64.s crypto/chacha/chacha-x86_64.s crypto/bn/x86_64-mont.s crypto/sha/sha512-x86_64.s engines/e_padlock-x86_64.s crypto/camellia/cmll-x86_64.s crypto/aes/aesni-mb-x86_64.s crypto/sha/sha256-mb-x86_64.s crypto/md5/md5-x86_64.s crypto/modes/aesni-gcm-x86_64.s crypto/aes/aesni-sha256-x86_64.s crypto/x86_64cpuid.s crypto/aes/aesni-sha1-x86_64.s crypto/poly1305/poly1305-x86_64.s crypto/aes/bsaes-x86_64.s crypto/ec/ecp_nistz256-x86_64.s crypto/sha/sha1-x86_64.s crypto/rc4/rc4-md5-x86_64.s crypto/aes/aesni-x86_64.s crypto/whrlpool/wp-x86_64.s crypto/sha/sha256-x86_64.s crypto/buildinf.h include/openssl/opensslconf.h crypto/include/internal/dso_conf.h crypto/include/internal/bn_conf.h rm -ffind . -name '.d' -a ! -path "./.git/"rm -ffind . -name '.o' -a ! -path "./.git/"rm -f core rm -f tags TAGS rm -f openssl.pc libcrypto.pc libssl.pc rm -ffind . -type l -a ! -path "./.git/*" rm -f ../openssl-1.1.0d.tar haitao@linx:~/linx-gmssl/src/gmssl$ make update ( cd .; /usr/bin/perl VMS/VMSify-conf.pl \ < apps/openssl.cnf > apps/openssl-vms.cnf ) ( b=pwd; cd .; /usr/bin/perl -I$b apps/progs.pl \ apps/app_rand.c apps/apps.c apps/asn1pars.c apps/ca.c apps/ciphers.c apps/cms.c apps/cpk.c apps/crl.c apps/crl2p7.c apps/dgst.c apps/dhparam.c apps/dsa.c apps/dsaparam.c apps/ec.c apps/ecparam.c apps/enc.c apps/engine.c apps/errstr.c apps/gendsa.c apps/genpkey.c apps/genrsa.c apps/gmssl.c apps/nseq.c apps/ocsp.c apps/opt.c apps/otp.c apps/passwd.c apps/pkcs12.c apps/pkcs7.c apps/pkcs8.c apps/pkey.c apps/pkeyparam.c apps/pkeyutl.c apps/prime.c apps/rand.c apps/rehash.c apps/req.c apps/rsa.c apps/rsautl.c apps/s_cb.c apps/s_client.c apps/s_server.c apps/s_socket.c apps/s_time.c apps/sess_id.c apps/sm9.c apps/smime.c apps/speed.c apps/spkac.c apps/srp.c apps/ts.c apps/verify.c apps/version.c apps/x509.c \ > apps/progs.h ) ( cd .; /usr/bin/perl crypto/bn/bn_prime.pl > crypto/bn/bn_prime.h ) ( cd .; /usr/bin/perl crypto/objects/objects.pl \ crypto/objects/objects.txt \ crypto/objects/obj_mac.num \ include/openssl/obj_mac.h ) ( cd .; /usr/bin/perl crypto/objects/obj_dat.pl \ include/openssl/obj_mac.h \ crypto/objects/obj_dat.h ) ( cd .; /usr/bin/perl crypto/objects/objxref.pl \ crypto/objects/obj_mac.num \ crypto/objects/obj_xref.txt \ > crypto/objects/obj_xref.h ) ( cd .; /usr/bin/perl crypto/conf/keysets.pl \ > crypto/conf/conf_def.h ) ( cd .; /usr/bin/perl crypto/asn1/charmap.pl \ > crypto/asn1/charmap.h ) ( cd .; /usr/bin/perl util/ck_errf.pl -strict */*.c */*/*.c ) ( cd .; /usr/bin/perl util/mkerr.pl -recurse -write ) ( cd ./engines; \ for e in *.ec; do \ /usr/bin/perl ../util/mkerr.pl -conf $e \ -nostatic -staticloader -write *.c; \ done ) ( b=pwd; cd .; /usr/bin/perl -I$b util/mkdef.pl crypto update ) unable to open

参考资料:

1. 数字证书的可信 https://blog.csdn.net/u011893782/article/details/106453282

2.GMSSL http://gmssl.org

这篇关于openssl定义国产数字证书主题项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074819

相关文章

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

c++ 定义二位数组

在 C++ 中,定义二维数组有几种常见的方式。以下是几个示例: 1. 静态二维数组 定义: int array[3][4]; 这里,array 是一个 3 行 4 列的整数二维数组。 初始化: int array[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; 2. 动态二维数组 使用指针和动态内存分配: 定义:

java类中定义接口的有哪些好处

第一步:首先是是定义一个类,同时里面定义接口 public class Util { public interface Worker { void work(int a); } } 第二步:定义一个类去实现第一步类中定义的接口 public class Demo implements Worker { @Override public void work(int a) { System

vue3 为组件的 emits 标注类型,defineEmits基于类型的定义的简单理解

1)在 <script setup> 中,emit 函数的类型标注也可以通过运行时声明或是类型声明进行。 2)基于类型的: const emit = defineEmits<{ (e: 'change', id: number): void (e: 'update', value: string): void }>() 说明:e: 指定了方法名,id:数字型的参数,这个就是限定了方法名及

VitePress 自定义主题:打造专属文档网站

VitePress 是一个基于 Vite 和 Vue 3 的静态网站生成器,特别适用于撰写文档。它不仅提供了默认的主题,还允许开发者创建和使用自定义主题,以满足特定的设计和功能需求。本文将详细介绍如何创建、使用及分发 VitePress 自定义主题,并通过实例代码进行演示。 一、创建自定义主题 1. 主题文件结构 要启用自定义主题,你需要在项目根目录下的 .vitepress 文件夹中创建一