最近在做微信H5支付,服务器端要使用HTTPS协议,因此接触到了证书这个概念。原来在做ios的发布的时候,已经接触过证书,但一直没有去研究这个东西,毕竟只要能用就可以了,这东西没必要深入研究。但是这次做H5,因为我们的服务器并没有使用什么webserver框架,而是完全自己开发(游戏服务器),所以对于证书的使用必须完全靠自己手动从头开始一步步来,所以只好花一点时间来研究了。
这篇只是想介绍一下关于数字证书的一些概念,网上相关的资料挺多,但都解释的不清,或是直接翻译而来的,所以对于初次接触的人,可能其概念并不是很清晰,所以这篇文章算抛砖引玉吧
数字证书
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。
综上所述,数字证书简单来说是一个证明凭证,其中包含了三大部分,公钥,私钥,相关身份信息
CA
CA机构,又称为证书授证(Certificate Authority)中心。一般权威的,公正的,可信赖的第三方都可以看作是CA机构。
可信任的证书和自签名证书
CA发布的证书,都是可信任的证书,在浏览器中,对于一般的CA机构,已经默认其证书是可信的,所以可以建立连接。而如果这时,网站服务器使用的是自签名证书,而不是来自权威的CA机构,那么浏览器就会认为该证书是不可信的,因为会弹出提示。
所谓的自签名证书,是指证书主体(证书持有人)和证书颁发机构一致。
根证书
根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。其他证书都是使用根证书对自己进行签名,来生成的子证书
公钥,私钥
每个用户都有一对私钥和公钥。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。私钥用来进行解密和签名,是给自己用的。公钥由本人公开,用于加密和验证签名,是给别人用的。
每个证书必定包含了一个公钥,另外对应一个私钥。私钥可以保存在密钥容器,证书,或是单独的pvk文件中。如果证书中包含了私钥,那么其格式为pfx。单独的pvk私钥文件可以用来签名子证书,或是生成证书用。从证书当中导出私钥时,是导出成pfx格式,其中包含证书信息,和私钥信息
每个CSP有一个密钥库,密钥库用于存储密钥。而每个密钥库包括一个或多个密钥容器(Key Containers)。每个密钥容器中包含属于一个特定用户的所有密钥对。每个密钥容器被赋予一个唯一的名字,和对应私钥。密钥容器中的私钥是不可导出的。但尽管无法导出,却可以用它来签名。这个过程是在系统函数内部完成的。我们无法通过任何接口获得导出的私钥用于加密。
签名密钥,交换密钥
签名密钥就是签名密钥对,是公钥体制下的一对公钥和私钥,这对密钥是用来做签名验证用的。交换密钥是加密密钥对,也是一对公钥和私钥,它是用来做为数据加密时使用的。
spc证书
这是微软特有的双证书文件,也叫做软件发行证书,其有一个spc文件,和一个pvk文件组成,这两个文件可以生成一个带有私钥的pfx证书。
以上就是证书的相关概念理解心得,对于具体的实现,我会在微信H5支付完成后,结合代码写一片简单的教程。