SSL/TLS链证书及其验证如何工作?
互联网上实施SSL的数量,即:的HTTPS版本每天都在增长,就安全性而言,这是一件好事。
这项索赔并非没有任何证据。
在线发布的所有主要网络浏览器统计数据均表明了这一事实。
在Google发布的ssl上查看chrome statics,并从Mozilla查看Firefox的统计信息。
我们大多数人都知道获取SSL证书所涉及的步骤。
这实际上是一个简单的过程,仅涉及两个步骤。
第一步是向证书颁发机构提供有关域/的详细信息(通常称为CSR证书签名请求)。
第二步是证明我们确实拥有域/。
有多种证明所有权的方法。
例如,添加TXT DNS记录(如果我们可以更改域的DNS记录,证明我们是该域的所有者),则在该域的指定位置添加HTML文件等。
向证书颁发机构提供所有权证明确实非常重要。
否则,几乎任何人都可以请求任何域/URL的证书并进行签名。
证书颁发机构确认并满意我们提供的证明后,他们将提供已签名的证书。
当我们大多数人(证书颁发机构)将签名的证书连同其他称为“中间证书”的证书(通常称为证书链)一起交还时,会感到困惑。
本文的唯一目的是深入研究此证书链内容并了解其需求。
让我们想象一下,我们渴望成为证书颁发机构。
是的,这是一项有利可图的业务,我们可以在这里为所签署的每张证书付费。
我们需要对此进行规划。
我们可以使用的最好的工具是openssl,它在所有Linux发行版中都可用。
我们需要做的第一件事是为我们的CA生成一个私钥。
我们将其称为rootca.key(我们很快就会知道为什么我在“ ca”前加上“ root”)。
可以使用openssl命令完成此操作,如下所示。
openssl genrsa -out rootca.key 4096
4096是密钥的长度(以位为单位)(如果我们多dig一点,在数学计算中,它是模数的长度)。
请记住,数字越大,查找因素变得越困难(用于公钥/私钥加密的RSA算法所基于的基础)。
4096对于大多数用例来说已经足够了。
现在,让我们使用创建的私钥为我们的CA创建证书。
但是在执行此操作之前,我们需要一个openssl配置文件,我们可以在触发命令时将其指向。
因此,使用以下内容创建一个名为“ openssl.cnf”的文件。
[ req ] default_bits = 4096 default_md = sha384 prompt = yes distinguished_name = req_distinguished_name x509_extensions = v3_ca [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address countryName_default = IN stateOrProvinceName_default = TELANGANA localityName_default = Hyderabad 0.organizationName_default = ExampleCA, Inc. organizationalUnitName_default = ExampleCA Root emailAddress_default = [email protected] [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign
在上面的配置文件中,我们分配了几个默认值(例如国家/地区,组织等)。
以_default结 tail的属性是默认值。
在触发命令时可以覆盖此默认值,但是为了简化起见,我们已经分配了该默认值几个默认值)。
现在,让我们为我们的CA创建一个自签名证书。
我们将把openssl配置文件作为参数传递给命令。
见下文。
root@ip-10-12-2-55:~# openssl req -config openssl.cnf -new -x509 -days 3650 -sha384 -extensions v3_ca -key rootca.key -out rootca.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ---- Country Name (2 letter code) [IN]: State or Province Name [TELANGANA]: Locality Name [Hyderabad]: Organization Name [ExampleCA, Inc.]: Organizational Unit Name [ExampleCA Root]: Common Name []:ExampleCA Root Certificate Authority Email Address [[email protected]]:
x509是创建SSL证书的标准。
我们的ca证书将存储在文件“ rootca.crt”中。
该证书还包含公钥。
除公用密钥外,证书还将包含我们的CA签名(要在证书上签名,请使用私钥,这就是我们提供了先前创建的私钥的原因。
)。
上面的命令将提示我们输入有关此证书的一些信息,这些信息也将是证书的一部分。
该证书的有效期为10年(由-days 3650指定)
在我们的案例中,我们将CA命名为“ ExampleCA,Inc”,用于标识我们的CA证书的名称是“ ExampleCA根证书颁发机构”。
请记住,该证书是自签名证书(即:没有其他人在签名它。
我们正在成为CA,这是开始信任的地方,因此没有人可以签名:))。
我们是否注意到我们的openssl.cnf文件中有一个名为v3_ca的部分(在命令中称为-extensions)?
这实际上是重要的部分。
如果该部分中的参数具有关键字critical,则将其视为关键。
参数basicConstraints使我们可以指定证书是否为CA证书。
CA设置为“ TRUE”的basicConstraints字段对于CA证书很重要。
下一个参数是keyUsage,我们也将其设置为critical。
这表明证书有效的用例类型。
现在,我们拥有成为CA所需的两个基本条件。
我们有专用密钥和用于CA的证书。
使用这两个,我们现在可以为其他人签署SSL证书。
现在,我们可以要求其他人生成CSR并从我们这里获得签名证书,而相关费用却很少(听起来很简单吧?
)。
让我们想象一下,有人已经生成了CSR,并期待由我们的新CA对其进行签名。
让我们通过创建第一个CSR并签署我们的CA来测试我们的CA,然后再签署任何实际客户。
为此,我们生成一个私钥,然后为一个名为www.example.com的生成CSR。
见下文。
openssl genrsa -out example.com.key 2048
尽管较长的密钥长度被认为是安全的,但对于最终用户而言2048就足够了(请记住,我们正在为www.example.com创建新的私钥。
我们的CA私钥和证书已经创建,仅用于签名)
现在,让我们使用刚才为example.com创建的密钥(即example.com.key)生成一个csr。
见下文。
root@ip-10-12-2-55:~# openssl req -new -days 365 -key example.com.key -out example.com.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ---- Country Name (2 letter code) [AU]:IN State or Province Name (full name) [Some-State]:TELANGANA Locality Name (eg, city) []:Hyderabad Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example, Inc. Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:www.example.com Email Address []:[email protected]
现在,我们准备签署我们的第一个假想客户(适用于www.example.com)。
这可以通过使用我们先前创建的CA证书和密钥来完成。
理想情况下,客户将上传CSR,我们要求证明其对www.example.com的所有权。
因为这是我们的假想客户,所以让我们继续进行签名。
可以通过以下命令进行签名。
root@localhost:~# openssl x509 -req -days 365 -in example.com.csr -CA rootca.crt -CAkey rootca.key -set_serial 100 -out example.com.crt Signature ok subject=/C=IN/ST=TELANGANA/L=Hyderabad/O=Example, Inc./OU=IT/CN=www.example.com/[email protected] Getting CA Private Key
请注意,我们同时使用了rootca.key(我们的CA密钥文件)和rootca.crt(我们的CA证书)来签署客户CSR。
该证书的有效期为1年(365天)。
现在,我们可以在标准Web服务器(如nginx)中尝试example.com.crt和example.com.key。
让我们做到这一点。
以下是用于测试新创建的证书的Nginx代码段。
server { listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl on; ssl_certificate /etc/nginx/example.com.crt; ssl_certificate_key /etc/nginx/example.com.key; root /var/www/html; server_name _; location/{ try_files $uri $uri/=404; } }
相关:如何在Nginx中将HTTP永久重定向到HTTPS
上面显示的代码片段来自默认的nginx配置,仅添加了SSL位(即:/etc/nginx/sites-enabled/default)。
不要忘记在系统的/etc/hosts文件中添加一个条目,从该条目我们将在该文件中访问该Web服务器(即:指向www.example.com的条目指向我们安装的Nginx Web服务器的IP地址)新签署的SSL证书)
我将使用野生动物园网络浏览器访问www.example.com,并查看我们的SSL证书是否有效。
一旦我从野生动物园访问https://www.example.com,我就会得到以下信息。
无论使用哪种浏览器/操作系统,我们都肯定会遇到以下错误。
将我们的根证书添加到信任库后,浏览器应该能够对其进行验证。
在访问https://www.example.com时,请从Firefox查看我们经过验证的证书
还要签出我们的根ca证书的主题字段,该字段应与我们的中间证书的颁发者字段相同。
2.与当前日期和时间(我们已经知道,这是基本的验证组件)相比,该证书应该有效,并且不应过期。
3.验证了我们前面看到的策略约束,例如keyUsage字段。
4.pathlen字段也经过验证,以确认中间证书的数量是否符合允许的数量。
5.证书吊销状态也使用CRL进行了验证(我未包含在我们的openssl配置中,因为这需要其专门的教程 文章)。
链中可以有多个中间证书颁发机构(尽管以示例为例,此处仅显示了一个)。
但最终,验证还将检查证书中的pathlen字段。