Security的基础就是加解密算法,算法是公开的,任何人都可以得到,而使用算法的核心就是key,主要有private key和public key,而数字证书作为key的载体,在Security体系中自然起到关键的作用。本文将从证书的发放,回收,保存,使用方面对数字证书进行详细的介绍。
1.证书的发放与回收
能否发放Certificate的机构称为CA,CA可以后多级,每一份certificate都含有发放该certificate的CA信息,每个CA也会有一张certificate,称之为CA certificate,是由它上一级CA发放给它的,顺着这条路径可以一直找到一个CA,它的certificate是自己发放给自己的,即issued by和issued 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-3和http://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,非常详细,我就不翻译了。