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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章