• 数字证书(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,非常详细,我就不翻译了。

  • 相关阅读:
    Linux 线程池的简单实现
    m3u8(HLS) 抓包
    一个面试问题的思考
    简单实现无需密码 sudo
    转: NAT 穿透
    一个平均分配算法
    raft 算法扫盲
    20210615 JVM 优化
    20210614. 并发编程
    20210606 Java 并发编程之美
  • 原文地址:https://www.cnblogs.com/langqi250/p/2704380.html
Copyright © 2020-2023  润新知