X509数字证书格式

X509C

X.509 协议:V3/V4版证书(建议改进版记作X.509C)

       证书格式

       (1)待签名部分

       1、版本号 V3                                                Version

       2、序列号                                                      Serial Number

       3、签名算法OID*                                          Signature Algorithm Identifier

       4、签发者                                                      Issuer(各项名字的集合)

       5、有效期                                                      Validity

                     生效期                                                NotBefore

                     失效期                                                 NotAfter

       6、申请者                                                      Subject (各项名字的集合)

       7、申请者公钥信息                                        Subject Public Key Info

                     算法*                                                  Algorithm

                     公钥PK                                               Subject Public Key

       8、签发者唯一ID                                    Unique ID of CA

       9、申请者唯一ID                                    Unique ID of Subject

       10、扩展项                                                 Extension

                     标准扩展项

                     自定义扩展项

       (2)签名算法部分

              签名算法OID*                                   Signature Algorithm Identifier

       (3)签名部分

              签名体

几点说明

(1)签名算法OID(一、(1)中带*的地方)

目前主要有:

md2WithRSAEncryption = { 9, "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x02"};

md5WithRSAEncryption = { 9, "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04"};

shaWithRSAEncryption = { 5, "\x2B\x0E\x03\x02\x0F"};

sha1WithRSAEncryption ={ 9, "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05"};

dsaWithSHA ={ 5, "\x2B\x0E\x03\x02\x0D"};

dsaWithSHA1 ={ 7, "\x2A\x86\x48\xCE\x38\x04\x03"};

dsaWithSHA1_2 ={ 5, "\x2B\x0E\x03\x02\x1B"};

申请增加:

schWithRSAEncryption ={ 6, "\x2A\x56\x0B\x05x05\x03 "}; (1,2,86, 11,5,5,3)

schWithECCAEncryption ={ 6,"\x2A\x56\x0B\ x05\x05\x04"}; (1,2,86, 11,5,5,4)

(2)签发者和申请者

              目前主要有:

                     countryName                       //国名(二字节)

                     organizationName                 //组织名

                     organizationalUnitName    //部门名

                     stateOrProvinceName           //省名

                     commanName                      //通用名

                     localityName                       //所在地名

                     email                               //email地址

                     postalAddress                       //通信地址    

                     postalCode                           //邮政编码

                     postalOfficeBox                   //邮箱

                     telephoneNumber                 //电话号码

                     telexNumber                        //传真号码

                     title                                     //职务头衔

                     surName                              //姓0x550404

                     givenName                       //名

                     initials                     //

(3)有效期    

当时间采用UTCTime时,年份采用二字节(YY),当YY大于等于50,年将被认为是19YY;当YY不到50,年将被认为是20YY。而当时间采用GeneralizedTime时,年份采用四字节(YYYY)。

(4)签名体

              D=HashOID+(Hash结果),对D进行DER编码,再采用PKCS1标准进行私钥加密即签名。HashOID目前有:

                     md2 ={ 8, "\x2A\x86\x48\x86\xF7\x0D\x02\x02"};

                     md5 ={ 8, "\x2A\x86\x48\x86\xF7\x0D\x02\x05"};

                     sha ={ 5, "\x2B\x0E\x03\x02\x12"};

       sha1 ={ 5, "\x2B\x0E\x03\x02\x1A"};

申请增加:sch ={ 5, "\x2A\x56\x0B\ x05\x05"};  (1,2,86, 11,5,5)

(5)在KeyUsage类型中位(Bits)使用如下:

                     定义              比特位                       中文定义

              -------------------------------------------------------           

              digitalSignature        0x8000                     数字签名证书

              nonRepudiation        0x4000                     非抵赖证书

              keyEncipherment     0x2000                     密钥加密证书

              dataEncipherment   0x1000                      数据加密证书

              keyAgreement      0x0800                      密钥交换

              keyCertSign        0x0400                     签发证书

              crlSign            0x0200                      签发CRL文件

              encipherOnly       0x0100                     仅用于加密

       decipherOnly       0x0080                     仅用于解密

(6)标准扩展项

X.509C使用的标准扩展域如下:

权威密钥标识符(AuthorityKeyID)

主体密钥标识符(SubjiectKeyID)

密钥用法(KeyUsage)

私有密钥使用周期(PrivateKeyUsagePeriod)

证书策略(CertificatePolicies)

策略映射(PolicyMappings)

主体可替换名字(SubjectAlternativeName)

个人身份证号码

个人社会保险号

企业工商注册号

企业组织机构代码号

企业税号

发颁发者可替换名字(IssuerAlternativeName)

主体目录属性(SubjectDirectoryAttributes)

基本约束(BasicConstraints)

名字约束(NameConstraints)

策略约束扩大(PolicyConstraints)

扩大密钥使用领域(ExtendedKeyUsage)

CRL发布点(CRLDistributionPoints)

目前主要有:

         权威密钥标识符  

        主题密钥标识符  

 密钥使用 

 私有密钥使用周期

 证书策略 

 策略映射 

 主题可替换名字  

 发行者可替换名字

 主题目录服务系统属性   

 基本约束 

 名字约束 

 策略约束 

 扩大密钥使用领域

 CRL发布点

其中“权威密钥标识符”即AuthorityKeyIdentifier为必选项,且其结构中的可选项keyIdentifier 、authorityCertSerialNumber为必选。

    AuthorityKeyIdentifier ::= SEQUENCE {

      keyIdentifier           [0] KeyIdentifier            OPTIONAL,

      authorityCertIssuer      [1] GeneralNames            OPTIONAL,

      authorityCertSerialNumber[2]CertificateSerialNumber OPTIONAL  }

   KeyIdentifier ::= OCTET STRING,由两种从公开密钥产生密钥标识符的通用方法如下:

A: keyIdentifier由BIT STRING subjectPublicKey的值的160位SHA1哈希值组成(排除标签,长度和不在使用的bits数目)。

B: keyIdentifier 4 bit类型字段值为0100以及随后的由BIT STRING  subjectPublicKey的值SHA 1哈希的值中最后60 bits连接组成。

  

   统一采用A形式。

   

(7)自定义扩展项(扩展扩展项)

    自定义扩展项只要满足以下结构即可

    Extension  ::=  SEQUENCE  {

              extnID      OBJECT IDENTIFIER,       //OID

              critical      BOOLEAN DEFAULT FALSE, //是否是关键项

              extnValue   OCTET STRING              //扩展值

    }

    另外,Netscape证书、SET证书还有LDAP的一些自定义扩展可以直接引

8)CRL作废链

       为适应安全EMAIL等SSL应用的证书链频繁下载需要,建议链文件在4K之内。把每100或200个证书放在一条链中,在每份证书中指明它所在的链名、URL。

4.3.3.2证书撤消表结构

版本号version

签名算法标识signature

颁发者名称issuer

本次更新(日期/时间)thisUpdate

下次更新(日期/时间)nextUpdate

注销证书链

用户证书序列号 userCertificate

注销日期revocationDate

CRL条目扩展项crlEntryExtentions

    ……

CRL链长200个证书)

CRL扩展域crlExtentions

签名算法SignatureAlgorithm

签名signatureValue

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SM2是一种国密算法,用于椭圆曲线加密和数字签名。x509数字证书是一种常见的公钥证书格式,用于证明数字证书的合法性和身份认证。在Python中,可以使用第三方库pycryptodome来实现SM2算法和x509数字证书的生成。 下面是一个使用pycryptodome库生成SM2密钥对和x509数字证书的示例代码: ```python from Crypto.PublicKey import ECC from Crypto.Util.asn1 import DerSequence, DerOctetString, DerBitString, DerObjectId from Crypto.Util.number import long_to_bytes from Crypto.Signature import DSS from Crypto.Hash import SHA256 from datetime import datetime, timedelta import base64 # 生成SM2密钥对 key = ECC.generate(curve='sm2') private_key = key.export_key(format='DER') public_key = key.public_key().export_key(format='DER') # 生成x509数字证书 version = 2 # x509版本号,2表示v3 serial_number = 1 # 证书序列号 signature_algorithm = DerSequence([DerObjectId('1.2.156.10197.1.501')]) # 签名算法,SM2的OID为1.2.156.10197.1.501 issuer = DerSequence([DerObjectId('2.5.4.6'), DerOctetString('CN=CA')]) # 颁发者信息,这里假设颁发者为CN=CA validity_not_before = datetime.utcnow() # 证书有效期开始时间 validity_not_after = validity_not_before + timedelta(days=365) # 证书有效期结束时间,这里假设为一年 subject = DerSequence([DerObjectId('2.5.4.6'), DerOctetString('CN=Test')]) # 证书主题信息,这里假设证书主题为CN=Test subject_public_key_info = DerSequence([DerObjectId('1.2.840.10045.2.1'), DerObjectId('1.2.156.10197.1.301'), DerBitString(public_key)]) # 证书主题公钥信息,第一个OID表示ECC公钥,第二个OID表示SM2算法,第三个参数为公钥的DER编码 extensions = None # 扩展信息,这里不设置扩展信息 tbs_certificate = DerSequence([version, serial_number, signature_algorithm, issuer, validity_not_before, validity_not_after, subject, subject_public_key_info, extensions]) # 待签名的证书信息 hash_obj = SHA256.new(tbs_certificate.dump()) # 计算待签名证书信息的哈希值 signer = DSS.new(key, 'fips-186-3') # 使用SM2私钥创建签名器 signature = signer.sign(hash_obj) # 对待签名证书信息的哈希值进行签名 certificate = DerSequence([tbs_certificate, signature_algorithm, DerBitString(signature)]) # 构造完整的x509数字证书 certificate_der = certificate.dump() # 将数字证书编码为DER格式 certificate_base64 = base64.b64encode(certificate_der).decode() # 将DER格式数字证书进行Base64编码 print('SM2私钥:', base64.b64encode(private_key).decode()) print('SM2公钥:', base64.b64encode(public_key).decode()) print('x509数字证书:', certificate_base64) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值