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

猜你喜欢

转载自blog.csdn.net/u011893782/article/details/106465136