数字证书认证机构-维基
HTTPS证书生成原理和部署细节
细说 CA 和证书
CA和证书那些事
OpenSSL生成根证书CA及签发子证书
OpenSSL Certificate Authority
PKI体系介绍、漏洞和方案
PKI(Public Key Infrastructure)公钥基础设施,是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系。
简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。PKI技术是信息安全技术的核心,也是电子商务的关键和基础技术。
PKI既不是协议,也不是软件,它是一个标准,着这个标准发展处的为了实现安全基础服务目的技术统称为PKI。
PKI体系的原理就是浏览器内置可信赖的RootCA的证书,所有由这些RootCA签发出来的证书都是受信任的。
虽然今天很多网站已经使用HTTPS,但是如果另外一家CA偷偷签发了同样域名的证书进行流量劫持或篡改,我们也是无法知道的。
为了应对这种问题,现在比较主流的两种方案是 HPKP 和 Certificate Transparency。
PKI主要由以下组件组成:
1. CA认证中心;
2. X.509目录服务器;
3. 具有高强度算法(SSL)的www服务器;
4. Web(安全通信平台);
5. 自开发安全应用系统;
CA(数字证书认证机构)
介绍
数字认证机构(Certificate Authority,CA),也称为认证授权机构,是负责发放和管理数字证书的权威,并作为受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。
CA是证书的签发机构,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁布证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。
CA也拥有一个证书(含公钥)和私钥,网上的公众用户通过验证CA签字从而信任CA,任何人都可以得到CA的证书(含公钥),用以验证它所签发的证书。
如果一个用户想得到一份属于自己的证书,他应先向CA提出申请。在CA判明申请者的身份后,便为他分配一个公钥,并且CA将该公钥与申请者的身份信息绑定在一起,并为之签字,便形成证书发给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用CA的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。
任何个体/组织都可以扮演CA的角色(可以自己给自己认证,自己充当CA),只不过难以得到客户端的信任。能够受浏览器信任的CA 大厂商有很多,其中TOP5是 Symantec、Comodo、Godaddy、GolbalSign、Digicert 。
证书
证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。
私钥和公钥相对应,私钥加密的东西只能公钥解密,公钥加密的东西只能私钥解密,并且不能由公钥推断出私钥,但是可以由私钥算出公钥。
所以这里有一件非常有意思的事情,你可以在公私钥不变的情况下换一张证书,因为证书其实包括其他信息,所以你换的是别的信息,这些信息的变化会导致证书签名也会变化,所以就变成了一张新的证书,但是公钥私钥是没有变化的。
CA也是由证书和私钥组成,它的证书和普通的证书长得差不多,只是其中的Basic Constraint字段里面的CA值为True而已,普通的服务器证书为False。因为这个字段为True,所以可以签发别的证书。
证书的内容包括:电子签证机关的信息,公钥用户信息,公钥、权威机构的签字和有效期等。
目前,证书的格式和验证方法普遍遵循 X.509 国际标准。
在密码学中,X.509是由 ITU-T 为了 公开密钥基础建设(PKI)与 授权管理基础建设(PMI) 提出的产业标准。
X.509标准,规范了 公开密钥认证、证书吊销列表、授权证书、证书路径验证算法等。
X.509假定所有的数字证书都是由一个层次结构化的数字证书认证机构(Certificate-Authority)发出。
如打算在电子文档上实现签名目的,可使用数字签名。RSA公钥体制可实现对数学信息的数字签名;
信息发送者用其私钥对从所传报文中提取出的特征数据(数字指纹) 进行 RSA算法操作,以保证发信人无法抵赖曾发过该信息(不可抵赖性),同时也确保信息报文在传递过程中未被篡改(完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
在数字签名中有重要作用的数字指纹是通过一类特殊的
散列函数(HASH)生成的。对这些HASH函数的特殊要求是:
1. 接收的输入报文数据没有长度限制;
2. 对任何输入报文数据生成固定长度的摘要输出;
3. 从报文能方便的算出摘要;
4. 难以对指定的摘要生成一个报文,而该报文可以算出该指定的摘要;
5. 两个不同的报文难以生成相同的摘要;
数字证书
数字证书为实现双方安全通信提供电子认证。
服务器证书分类
可以从两个角度去看证书的分类:
一种是商业角度,为了区分不同的用户级别,服务端证书可以分成 DV、OV和EV证书 ;
名称 | 展现 | 单域名 | 多域名 | 泛域名 | 多个泛域名 |
---|---|---|---|---|---|
DV | https | 支持 | 支持 | 不支持 | 不支持 |
OV | https://xxx.com | 支持 | 支持 | 支持 | 支持 |
EV | GitHub.Inc. [US] | 支持 | 支持 | 不支持 | 不支持 |
栗子 | www.zhang.com | www.zhang.com www.hahaha.com |
*.zhang.com | *.zhang.com *.hahaha.com |
不论是DV、OV还是EV证书,其加密效果都是一样的,它们区别在于:
- DV(Domain Validation):面向个体用户,安全系数相对较弱,验证方式就是向 whois 信息中的邮箱发送邮件,按照邮件内容进行验证即可通过;
- OV(Organization Validation):面向企业用户,证书在DV证书验证的基础上,还需要公司的授权,CA通过八大信息库中公司的电话来确认;
- EV(Extended Validation):打开GitHub的网页,你会看到URL地址栏展示了注册公司的信息,这会让用户产生更大的信任,这类证书的申请除了以上两个确认外,还需要公司提供金融机构的开户许可证,要求十分严格。
OV和EV证书相当昂贵,使用方可以为这些颁发出来的证书买保险,一旦CA提供的证书出现问题,一张证书赔偿金很高的。
自建CA证书
OpenSSL是一个免费开源的库,它提供了构建数字证书的命令行工具,可以用来自建Root CA。
很多网站都希望用户知道他们建立的网络通信是安全的,所以会向CA机构购买证书来验证domain,所以我们可以在很多HTTPS的网页地址栏看到一把小绿锁。
然而在一些情况下,我们没有必要去CA机构购买证书,比如在内网的测试环境中,为了验证HTTPS下的一些问题,我们不需要部署昂贵的证书,这个时候自建Root CA,给自己颁发证书就显得很有价值了。
HTTPS
HTTPS区别于HTTP,多了加密(encryption),认证(verification),鉴定(identification)。它的安全性源自非对称加密以及第三方的CA认证。
简述如下:
- 客户端生成一个随机数
random-client
,传到服务器端(Say Hello); - 服务器端生成一个随机数
random-server
,和公钥,一起回馈给客户端(I got it); - 客户端收到的东西原封不动,加上
premaster secret
(通过random-client
,random-server
经过一定算法生成的东西),再一次送给服务器端,这次传过去的东西会使用公钥加密; - 服务器端先使用私钥解密,拿到
premaster secret
,此时客户端和服务器端都拥有了三个要素:random-client
,random-server
,premaster secret
; - 此时安全通道已经建立,以后的交流都会检验上面的三个要素通过算法的
session key
。
生成密钥、证书
第一步,为服务器和客户端准备公钥、私钥:
openssl genrsa (-aes256) -out server.key 1024
#生成服务器端私钥
#genrsa, 使用RSA算法
#1024, 指定私钥长度
#-aes256, 使用256位密钥的AES算法对私钥进行加密
openssl rsa -in server.key -pubout -out server.pem
#生成服务器端公钥
openssl genrsa -out client.key 1024
#生成客户端私钥
openssl rsa -in client.key -pubout -out client.pem
#生成客户端公钥
第二步,生成CA证书:
openssl genrsa -out ca.key 1024
#生成CA私钥
openssl req -new -key ca.key -out ca.csr
#X.509 Certificate Signing Request(CSR)Management
openssl x509 -days 36500 -req -in ca.csr -signkey ca.key -out ca.crt
#X.509 Certificate Data Management
#x509, 生成x509格式证书
#-req, 输入csr文件
#-signkey, 签发证书的私钥
第三部,生成服务器端证书和客户端证书
openssl req -new -key server.key -out server.csr
#服务器在向CA申请签名证书之前要创建自己的csr文件
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
#向自己的CA机构申请证书,签名过程需要CA的证书和私钥参与,最终办法一个带有CA签名的证书
#-CA, 指定CA证书
#-CAkey, 指定CA证书的私钥
#-CAcreateserial, 表示创建证书序列号文件
openssl req -new -key client.key -out client.csr
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
在Nginx上部署
其实我们在认证网站的时候,可以把网站写成*.zhang.com
。
vim /etc/nginx/conf.d/zhang.conf
server {
listen 80;
listen 443;
server_name www.zhang.com;
ssl on;
ssl_certificate /dir/path/server.crt;
ssl_certificate_key /dir/path/server.key;
}
将CA根证书(ca.crt)安装到本地
如果未安装CA根证书,浏览器可能会有如下错误
将ca.crt安装到本地计算机:
之后访问就不会报此错误,但此方法只用于自己测试CA。