ca88()
- 科技
- 2022-10-18
- 39
作者: 小胡子哥
CA,Catificate Authority,其作用是提供证书(即服务器证书,由域名、公司信息、序列号、签名信息组成)加强服务器与客户端信息交互的安全性,以及证书运维相关服务。任何个人/组织都可以扮演CA的角色,但是很难得到客户的信任。浏览器默认可以信任的CA大厂很多,其中TOP5有Symantec,Comodo,Godaddy,GolbalSign,Digicert。
服务器证书分类
可以从两个维度来分类,一个是业务角度,一个是业务角度。
单域名多域名泛域名多泛域名DV支持不支持OV支持EV支持不支持举例www.barretlee.comwww.barretlee.comwww.xiaohuzige.com
www.barret.cc*.barretlee.com*.barretlee.com
*.xiaohuzige.com
*.barret.cc
需要强调的是,无论是DV、OV还是EV证书,加密效果都是一样的!它们之间的区别是:
DV(域验证)是针对个人用户的,其安全体系相对较弱。验证的方式是发送邮件到whois信息中的邮箱,可以根据邮件内容进行验证。
OV(组织验证),适用于企业用户。在DV证书验证的基础上,证书还需要公司的授权。CA通过调用信息库中的公司来确认它;
EV(扩展验证),打开Github的网页,会看到网址地址栏显示的是注册公司的信息,会让用户产生更大的信任感。除了以上两个确认外,这类证书的申请还需要公司提供金融机构的开户许可证,非常严格。
而且EV证挺贵的,用户可以给这些发的证买保险。一旦ca提供的证书出现问题,一个证书的赔偿可以达到100w以上。
CA的角色
如前所述,如果公钥/私钥对和相应的未认证证书是在本地生成的,如果使用的证书没有visa,或者如果CA visa在浏览器中不受信任,您将会看到以下问题:
net:ERR _ CERT _ AUTHORITY _ valid
图中错误为net:ERR_CERT_AUTHORITY_INVALID。我们生成证书和公/私钥对的过程是正确的,但是浏览器不识别这个证书,提示证书授权失败;如果通过不同于常用名的其他域名访问,比如我注册的时候用的localhost,但是访问的时候用的127.0.0.1,也会报错这样一个错误:
net:错误证书公共名称无效
错误代码为net:err _ cert _ Common _ Name _ invalid,表示常用名不匹配。具体验证过程可以在浏览器的DevTools中看到:
开发者工具
从上面的数字,我们可以大致了解CA和certificate会做什么。证书由域名、公司信息、序列号和签名信息组成。当我们通过HTTPS访问页面时,浏览器会主动验证证书信息是否匹配,也会验证证书是否有效。
CA有权向所有域名颁发证书。比如它可以私自给我的网站颁发www.barretlee.com的证书,它可以持有新的证书拦截web流量(当然前提是这个CA是浏览器认证的权威CA),那么我的网站可能就很不安全了。对于持有新证的人来说,我的网站相当于在HTTP下交流。
评估CA供应商
CA供应商有很多,提供服务的侧重点可能会有一些差异。比如很多CA不提供证书撤销服务,这对于安全性要求高的企业来说是完全不能接受的。那么CA供应商的评价需要注意什么呢?
1.内置根
所谓内置根,就是将CA的根证书内置到各种常见的系统/浏览器中。只有根证书的兼容性足够强,才会覆盖更多的浏览器。
2.安全系统
两个指标可以判断CA供应商是否可靠。一是看价格,价格高自然有它的道理,必然会提供一套完整的保障体系;二是看黑历史。该CA供应商是否暴露过任何漏洞?比如之前的DigiNotar被伊朗入侵,发了500多张未经授权的证书。结果它的root直接被各种系统/浏览器列入黑名单,毫无疑问公司直接破产了。
3.核心功能和扩展功能
这需要从商业的角度来考虑。不同规模、不同业务的企业对证书的要求是不一样的,比如证书没有SNI支持是否会考虑浏览器问题,补发时是否支持添加域名,是否支持CAA,是否支持短周期证书等等。
4.价格
企业完全没有必要像Github那样购买EV证,太贵了,一般企业也不一定能申请到这样的证。供应商很大,价格可以很好的评估。不一定要最贵的,只要最合适的就行。
自建根CA
OpenSSL是一个免费的开源库,它提供了用于构建数字证书的命令行工具,其中一些工具可用于构建根CA。
很多网站都想让用户知道自己建立的 *** 通道是安全的,所以会购买CA机构的证书来验证域,所以我们也可以在很多HTTPS网页的地址栏看到一个小小的绿锁。
但是,在某些情况下,我们不需要去CA机构买证书。比如在内网的测试环境中,我们不需要为了验证HTTPS下的一些问题而部署昂贵的证书。这个时候,建立自己的根CA,给自己颁发证书,就非常有价值了。
本节内容很多,主要是代码演示了证书生成和验证的过程。你可以跳过下一节,直接看这里[1]:
git克隆https://github.com/barretlee/autocreate-ca.git
依次执行install-rootCA.sh、install-intermediateCA.sh和install-websiteConfig.sh。
首先找一个放置证书的文件夹,比如/root/ca,下面的测试也在目录变化下。如果要更改其他目录,记得替换下面的目录地址。
创建根对
扮演CA的角色意味着要管理大量的对,原始对称为根对,包含根密钥(ca.key.pen)和根证书(ca.cert.pem)。通常,根CA不会直接向服务器或客户端颁发签证。相反,它们首先为自己生成几个中间ca。这些中间CA作为根CA的代表,向服务器和客户端颁发签证。
注意:确保在绝对安全的环境中创建根对。你可以断开 *** ,拔掉网线和网卡。当然,如果是测试的话,你也不用这么认真。
设置文件夹结构并配置openssl设置:
# cd /root/ca
# mkdir证书crl新证书私有
# chmod 700私人
#触摸index.txt
# echo 1000 & gt连续的
# wget -O /root/ca/openssl.cnf \
https://raw . githubusercontent . com/barretlee/auto create-ca/master/CNF/root-ca
使用空的密码创建根密钥,并将权限设置为只读:
# cd /root/ca
# OpenSSL gen RSA-AES 256-out private/ca . key . PEM 4096
输入ca.key.pem的密码短语:secretpassword
验证-输入ca.key.pem的密码:secretpassword
# chmod 400 private/ca.key.pem
创建权限设置为可读的根证书:
# cd /root/ca
# openssl req -config openssl.cnf \
-key private/ca.key.pem \
-new-x509-days 7300-sha 256-扩展v3_ca \
-out certs/ca.cert.pem
输入ca.key.pem的密码短语:secretpassword
您将被要求输入将被合并的信息
到您的证书申请中。
-
国家名称(2个字母的代码)[XX]:CN
州或省名:浙江
地点名称:
组织名称:Barret Lee
组织单位名称:Barret Lee认证机构
俗名:巴雷特李根CA
电子邮件地址:
# chmod 444 certs/ca.cert.pem
认证证书:
# OpenSSL x509-no out-text-in certs/ca . cert . PEM
正确的输出应该如下所示:
证书:
数据:
版本:3 (0x2)
序列号:
87:e8:c0:a0:4b:e2:12:5d
签名算法:sha256WithRSAEncryption
颁发者:C=CN,ST =浙江,O=Barret Lee,OU=Barret Lee证书颁发机构,CN=Barret Lee根CA
有效期
不早于:格林威治时间2016年4月23日05时46分36秒
不晚于:格林威治时间2036年4月18日05时46分36秒
主题:C=CN,ST =浙江,O=Barret Lee,OU=Barret Lee证书颁发机构,CN=Barret Lee根CA
主题公钥信息:
公钥算法:rsaEncryption
RSA公钥:(4096位)
模数(4096位):
// ...
指数:65537 (0x10001)
X509v3扩展:
X509v3主题密钥标识符:
E5:2D:B8:2B:DC:88:FE:CE:DA:93:D8:6F:2E:74:04:D2:39:E7:C8:03
X509v3授权密钥标识符:
keyid:E5:2D:B8:2B:DC:88:FE:CE:DA:93:D8:6F:2E:74:04:D2:39:E7:C8:03
X509v3基本约束:关键
克里斯·安德森:没错
X509v3密钥用法:关键
数字签名、证书签名、CRL签名
签名算法:sha256WithRSAEncryption
// ...
包括:
数字签名(签名算法)
有效性(有效性)
主题(发行人)
公共密钥(公共密钥)
X509v3扩展,v3_ca是在openssl config中配置的,所以会生成此项。
创建一个中间对
目前,我们已经有了根对,它实际上可以用于颁发证书。但是由于根证书是干净的,特别容易被污染,所以我们需要创建一个中间对作为根对的 *** 。生成过程同上,只是细节略有不同。
生成openssl的目录结构和配置,其中配置用于中间对:
# mkdir/根/ca/中间
# CD/根目录/ca/中间
# mkdir证书crl csr新证书私有
# chmod 700私人
#触摸index.txt
# echo 1000 & gt连续的
# echo 1000 & gt/root/ca/intermediate/CRL number
# wget -O /root/ca/openssl.cnf \
https://raw . githubusercontent . com/barretlee/auto create-ca/master/CNF/intermediate-ca
创建一个密码为空的中间密钥,并将权限设置为只读:
# cd /root/ca
# openssl genrsa -aes256 \
-out intermediate/private/intermediate . key . PEM 4096
输入intermediate . key . PEM:secret password的密码
验证-输入intermediate . key . PEM:secret password的密码
# chmod 400 intermediate/private/intermediate . key . PEM
创建中间证书,并将权限设置为只读。这里需要特别注意的一点是,通用名不能和根对的通用名相同:
# cd /root/ca
# OpenSSL req-config intermediate/OpenSSL . CNF-new-sha 256 \
-key intermediate/private/intermediate . key . PEM \
-out intermediate/CSR/intermediate . CSR . PEM
输入intermediate . key . PEM:secret password的密码
您将被要求输入将被合并的信息
到您的证书申请中。
-
国家名称(2个字母的代码)[XX]:CN
州或省名:浙江
地点名称:
组织名称:Barret Lee
组织单位名称:Barret Lee认证机构
通用名:Barret Lee中级CA
电子邮件地址:
使用v3_intermediate_ca扩展签名,密码可以是空,中间对的有效时间必须是根对的子集:
# cd /root/ca
# OpenSSL ca-config OpenSSL . cn f-extensions v3 _ intermediate _ ca \
-第3650天-注意文本-md sha256 \
-in intermediate/CSR/intermediate . CSR . PEM \
-out intermediate/certs/intermediate . cert . PEM
输入ca.key.pem的密码短语:secretpassword
签证书?[是/否]:是
# chmod 444 intermediate/certs/intermediate . cert . PEM
此时,root的index.txt中将多一条记录:
V 260421055318Z 1000未知.../CN=Barret Lee中级CA
验证中间一对的正确性:
# openssl x509 -noout -text \
-in intermediate/certs/intermediate . cert . PEM
# OpenSSL verify-ca file certs/ca . cert . PEM \
intermediate/certs/intermediate . cert . PEM
intermediate.cert.pem:好
浏览器在验证中间证书时,也会验证其上级证书是否可靠。通过创建证书链,浏览器可以一起验证根证书和中间证书:
# cat intermediate/certs/intermediate . cert . PEM \
certs/ca . cert . PEM & gt;intermediate/certs/ca-chain . cert . PEM
# chmod 444 intermediate/certs/ca-chain . cert . PEM
创建服务器/客户端证书
最后,我们已经到了生成需要在我们的服务器上部署的内容的这一步。我们需要创建中间证书的原因已经在上面解释过了。根对和中间对都使用4096位加密。一般服务器/客户端证书的有效期为一年,所以2048位加密可以放心使用。
# cd /root/ca
# openssl genrsa -aes256 \
-out intermediate/private/www . barre tlee . com . key . PEM 2048
# chmod 400 intermediate/private/www . barre tlee . com . key . PEM
为www.barretlee.com创建证书:
# cd /root/ca
# OpenSSL req-config intermediate/OpenSSL . CNF \
-key intermediate/private/www . barre tlee . com . key . PEM \
-new-sha 256-out intermediate/CSR/www . barre tlee . com . CSR . PEM
输入www . barre tlee . com . key . PEM:secret password的密码
您将被要求输入将被合并的信息
到您的证书申请中。
-
国家名称(2个字母的代码)[XX]:CN
州或省名:浙江
地名:杭州
组织名称:Barret Lee
组织单位名称:Barret Lee的个人网站
俗名:www.barretlee.com
电子邮件地址:barret.china@gmail.com
使用中间对签证上面的证书:
# cd /root/ca
# OpenSSL ca-config intermediate/OpenSSL . CNF \
-extensions server _ cert-days 375-notext-MD sha 256 \
-在intermediate/CSR/www . barre tlee . com . CSR . PEM \
-out intermediate/certs/www . barre tlee . com . cert . PEM
# chmod 444 intermediate/certs/www . barre tlee . com . cert . PEM
可以看到/root/ca/intermediate/index . txt中多了一条记录:
V 170503055941Z 1000未知.../emailAddress=barret.china@gmail.com
认证证书:
# openssl x509 -noout -text \
-in intermediate/certs/www . barre tlee . com . cert . PEM
# OpenSSL verify-ca file intermediate/certs/ca-chain . cert . PEM \
intermediate/certs/www . barre tlee . com . cert . PEM
www.barretlee.com.cert.pem:好的
此时,我们已经有了几个要部署的文件:
ca-chain.cert.pem
www.barretlee.com.key.pem
www.barretlee.com.cert.pem
添加可信CA和证书的调试
双击/root/CA/intermediate/certs/CA-chain . cert . PEM将证书安装到系统中。目的是让这台计算机信任这个CA,并将其视为权威CA。可以安装根pem或中间链pem,两者都具有身份验证功能。如果不执行这一步,浏览器还是会提示net:ERR_CERT_AUTHORITY_INVALID。
在申请上面的测试证书时,我设置的常用名是www.barretlee.com,因为不在线测试,所以可以添加到主机中:
127 . 0 . 0 . 1 www.barretlee.com
执行以下测试代码:
// https-server.js
var https = require(' https ');
var fs = require(' fs ');
var选项= {
key:fs . read file sync('/root/ca/intermediate/private/www . Barrett lee . com . key . PEM '),
cert:fs . read file sync('/root/ca/intermediate/certs/www . Barret lee . com . cert . PEM '),
Passphrase: 'passoword' //如果在生成证书时设置了密码,请添加更改参数和密码。
};
https.createServer(options,function(req,res) {
RES . write head(200);
RES . end(' hello world ');
}).听(8000,函数{
console.log('打开网址:https://www . Barret lee . com:8000 ');
});
你可以看到这样的效果:
绿色的小锁被打开了。
查看证书的详细信息:
证书的详细信息
回到最初的问题:
但是,在某些情况下,我们不需要去CA机构买证书。比如在内网的测试环境中,我们不需要为了验证HTTPS下的一些问题而部署昂贵的证书。这个时候,建立自己的根CA,给自己颁发证书,就非常有价值了。
一般会在公司内网的电脑上强制安装一些安全证书。这时,我们可以将自签名证书导入/引导到用户的电脑中~
不存在SNI支持问题。
很多公司都有大量的企业和域名。为了方便运维,很多域名会指向同一个ip,然后流量/请求会分发到后端。这时就会出现一个问题:由于TLS/SSL在HTTP层之下,客户端和服务器握手时无法获取origin字段,所以服务器不知道这个请求来自哪个域名,服务器端的每个域名对应一个证书,所以服务器不知道返回哪个证书。
SNI就是用来解决这个问题的。官方的解释是
SNI(Server Name Indication)就是利用多个域名和证书来解决一个服务器的SSL/TLS扩展。总之,它的工作原理是在连接到服务器建立SSL链接之前,发送要访问的站点的域名(主机名),让服务器根据这个域名返回一个合适的证书。
那么近25%的浏览器不支持这一领域的拓展。这个问题有两种通用的解决方案:
使用Vip服务器,每个域名对应一个VIP,然后Vip连接统一接入服务,通过IP分发证书。但是运维成本非常高,可能需要大量的VIP服务器。
采用多泛域名,将多个泛域名证书打包进一个证书,可以看看 *** 页面的证书它的缺点是每次添加域名都需要更新证书。采用多域名,将域名的多个证书打包成一个证书。可以在 *** 页面看看证书。它的缺点是每次添加域名都需要更新证书。
几个细节。
1.证书选择
证书的加密方式有几种,不同的加密方式对CPU计算的损失不同,安全级别也不同。TLS之一次握手的时候,客户端会跟服务器打招呼。这时候它会告诉服务器它支持哪些算法。此时,服务器可以将最合适的证书发送给客户端。
2.证书的撤销
有两种撤销CA证书的机制。一种是在线检查,客户端向CA机构发送请求,检查服务器公钥的可靠性。第二种是客户端存储一个由CA提供的证书撤销列表,并定期更新。前者要求查询服务器有良好的性能,后者要求每次更新提供下一次更新的时间,通常有几天的时间差。安全要求高的网站建议采用之一种方案。
大多数ca不提供撤销机制(CRL/OCSP)。可靠的解决方案是为根证书提供一个中间证书。一旦中间证书的私钥泄露或者证书过期,可以直接撤销中间证书,给用户颁发新的证书。中级证书的签证原则和上一条提到的一样。中间证书还可以生成下一个中间证书,多级证书可以减轻根证书的管理负担。
CA的很多OCSP服务器都在国外,在线验证需要很长时间。如果能联系CA供应商把服务器转移到国内,效率可以提高10倍左右。
3.PKI系统
两个主流方案是HPKP和证书透明性:
HPKP是指用户之一次访问时记下标志信息,之后如果不匹配就拒绝访问。存在很大的隐患,比如服务器更新证书,或者用户之一次访问就被黑。
证书透明就是让CA供应商透明CA服务日志,防止CA供应商偷偷签签证。
总结
看了很多文章,对CA和证书相关的知识做了一些总结,可能不全,也可能有表述或知识上的错误。欢迎来拿砖!
进一步阅读
[1]:https://github.com/barretlee/autocreate-ca/README.md
推荐文章
与朋友分享文章是我们更好的欣赏!
本文由admin于2022-10-18发表在大金留学,如有疑问,请联系我们。
本文链接:https://www.rzrc.com.cn/post/32097.html