SSL/TLS链证书及其验证如何工作?

时间:2020-03-21 11:44:04  来源:igfitidea点击:

互联网上实施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字段。