当前位置:首页 > 科技 > 正文

ca88()

转载自: http://www.barretlee.com/blog/2016/04/24/detail-about-ca-and-certs/
作者: 小胡子哥

CA,Catificate Authority,其作用是提供证书(即服务器证书,由域名、公司信息、序列号、签名信息组成)加强服务器与客户端信息交互的安全性,以及证书运维相关服务。任何个人/组织都可以扮演CA的角色,但是很难得到客户的信任。浏览器默认可以信任的CA大厂很多,其中TOP5有Symantec,Comodo,Godaddy,GolbalSign,Digicert。

服务器证书分类

可以从两个维度来分类,一个是业务角度,一个是业务角度。

单域名多域名泛域名多泛域名DV支持不支持OV支持EV支持不支持举例www.barretlee.comwww.barretlee.com
www.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

推荐文章

与朋友分享文章是我们更好的欣赏!

0