数字证书(Certificate)

原文链接:http://www.cnblogs.com/piyeyong/archive/2010/06/11/1755837.html

Security的基础就是加解密算法,算法是公开的,任何人都可以得到,而使用算法的核心就是key,主要有private key和public key,而数字证书作为key的载体,在Security体系中自然起到关键的作用。本文将从证书的发放,回收,保存,使用方面对数字证书进行详细的介绍。

1.证书的发放与回收

能否发放Certificate的机构称为CA,CA可以后多级,每一份certificate都含有发放该certificate的CA信息,每个CA也会有一张certificate,称之为CA certificate,是由它上一级CA发放给它的,顺着这条路径可以一直找到一个CA,它的certificate是自己发放给自己的,即issued byissued to都是它自己,该cert称之为Root certificate,即根证书。从叶子cert到root cert这条Path里所有的cert,就构成了一个certificate chain

证书的发放可以使用SCEP协议(Simple Certificate Enrollment Protocol),参照:http://tools.ietf.org/html/draft-nourse-scep-18.证书含有有效期,必须在有效期内使用,不过在验证证书时,可以忽略证书的有效期。

Windows server 2003和2008都含有CA service,安装完后,会自带一个asp的website用于证书的发放,如果想在程序中实现自动获取证书,又不想实现SCEP协议,可以利用该asp的site,抓包分析使用的html协议,使用web通信来从CA获取证书,我将在后面用专门的文章详细分析如何实现。 

CA可以回收不再有效的证书,使用OCSP协议可以查询证书的状态。

 

2.证书保存

存储在本机的证书可以通过MMC查看:

MMC->AddStandalone Snap-in->Add...->Certificates->My user account|Computer account,如下图所示:

证书存储的Location分Local Computer和Current User,分别存放的是本机所有用户使用的和当前登录用户的证书,在每个Location下再分多个Logical store,如MY(Personal),ROOT(Trusted Root CertificationAuthorities),CA(Intermediate Certification Authorities)等,用户也可以创建自己的Logical store,如图中的test,需要使用CAPI。系统默认的Logical store如My,ROOT等又称System store。.net提供的API对store进行操作比较有限,只是CAPI的子集,通过查看.net源代码可以看到,.net通过P/Invoke对CAPI进行封装,并且将大量参数固定,只暴露一部分功能出来,例如对In memory store的创建,cert显示时的extra certs,删除Logical store等。后面我将用专门的文章讲解当发现.net提供的manage code不够用时,如何使用P/Invoke调用CAPI。

证书的实际存储位置:

当前用户的Personal和Request证书:%PROFILE%\Application Data\Microsoft\SystemCertificates

Current User的其它证书:HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates

Local Machine的证书:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates

每个Store含有Certificates,CRLs,CTLs,Keys4个子目录(子键),其中Certificates存放的就是证书,cert的thumbprint做文件名(20B),CRLs(certificate revocation lists)是被吊销的证书列表,CTLs(Certificate trust list)是信任的证书列表,Keys存放的内容不确定,希望哪位高手指点,其文件名(键名)是证书的subject key identifier(20B)。

Current User证书的private key实际是存在:%PROFILE%\Application Data\Microsoft\Crypto\RSA\[SID string]

Local Machine的证书的private key实际是存在:%ALLUSERS%\Application Data\Microsoft\Crypto\RSA\MachineKeys

文件名含有GUID后缀,该GUID存储在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid,关于前缀更详细的可以参照http://www.stevestechspot.com/default,month,2005-11.aspx

关于证书的public key,如下图所示,该public是ASN.1编码存储,对其使用SHA1计算,就得到了20B的Subject Key Identifier



证书可以导出到文件,在多个workstation间交互,常用的格式有*.cer, *.p7b, *.pfx。其中只有pfx可以含有private key,还可以指定密码对private key进行保护,可以指定空密码,可以将cert chain中所有证书都一并导出。*.p7b是PKCS7格式的,可以存储多张cert,PKCS7(Cryptography Message Syntax)定义了对文本加密和签名的规范和文件格式,使用ASN.1各式描述,参照http://tools.ietf.org/html/rfc2315。在.net中有两个类实现该协议:EnvelopedCms和SignedCms,分别实现加密和签名。在这里解释几个常用的重要的属于:

ASN.1(Abstract Syntax Notation)是对抽象语法的描述,实际就是一些网络上传输协议的数据结构的描述,

BER(Basic Encoding Rules)基本编码规则,定义了如何将ASN.1描述的数据结构进行编码成二进制字节流,方便在网络中传输

DER(Distinguished Encoding Rules)唯一编码规则,实现了BER的子集,在实际中使用的编码规则。

PKCS10(Certificate Request Syntax Specification)描述了进行证书申请时的格式,申请者需要发送CSR(Certificate signing request)给CA来申请证书,该CSR的数据结构就在PKCS10中描述的,参照http://tools.ietf.org/html/rfc2986#ref-3http://en.wikipedia.org/wiki/Certificate_signing_request

BASE64 一种编码方式,将ASCII转为可打印字符,源码中6bit放入编码后的一个Byte,这样长度会增加1/3

PKCS12描述了PFX证书的格式


3.证书的使用

证书是private/public key的载体,也是身份的象征,凡是需要用到加解密,身份验证的场合都需要用到证书。主要用途:数据加解密,签名,SSL

参照http://msdn.microsoft.com/en-us/magazine/cc163454.aspx,非常详细,我就不翻译了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值