HTTPS基本原理及构建CA

一、加密算法

  1. 对称算法:有流式、分组两种,加密和解密都是使用的同一个密钥。
  2. 非对称加密:使用公私钥进行加密解密,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
  3. 哈希算法:将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
  4. 数字签名:签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。

二、HTTPS原理

1、HTTP访问过程

HTTP请求过程中,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,“裸奔”在互联网上,所以很容易遭到黑客的攻击。
HTTP传输面临的风险:

  • 窃听风险:黑客可以获知通信内容。
  • 篡改风险:黑客可以修改通信内容。
  • 冒充风险:黑客可以冒充他人身份参与通信。
2、HTTPS访问过程

2.1 对称加密

image.png

1、优点
此方法属于对称加密,对方拥有相同的密钥,信息得到安全传输。
2、缺点

  • 不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高。
  • 因每个客户端、服务器的安全级别不同,密钥极易泄露。

2.2 非对称加密

image.png

客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但上述过程也存在缺点:公钥是公开的(也就是黑客也会有公钥),所以第 ④ 步私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容。

2.3 两者结合

image.png

如上图所示:
(1)第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器。
(2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密。
(3)后续两者之间信息的传输就可以使用对称加密的方式了。

遇到的问题:
(1)客户端如何获得公钥。
(2)如何确认服务器是真实的而不是黑客。

2.4 获取公钥与确认服务器身份

image.png

1、获取公钥
(1)提供一个下载公钥的地址,回话前让客户端去下载。(缺点:下载地址有可能是假的;客户端每次在回话前都先去下载公钥也很麻烦)
(2)回话开始时,服务器把公钥发给客户端(缺点:黑客冒充服务器,发送给客户端假的公钥)

2、那有木有一种方式既可以安全的获取公钥,又能防止黑客冒充呢?

那就需要用到终极武器了:SSL 证书(申购)
image.png

如上图所示,在第 ② 步时服务器发送了一个SSL证书给客户端,SSL 证书中包含的具体内容有:

(1)证书的发布机构CA
(2)证书的有效期
(3)公钥
(4)证书所有者
(5)签名
………

3、客户端收到服务端发来的SSL证书时,会对证书的真伪进行校验。

以浏览器说明为例:
(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验
(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
(4)如果找到,那么浏览器就会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密
(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比
(6)对比结果一致,则证明服务器发来的证书合法,没有被冒充
(7)此时浏览器就可以读取证书中的公钥,用于后续加密了

2.5 HTTPS传输更加安全
(1) 所有信息都是加密传播,黑客无法窃听。
(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。
(3) 配备身份证书,防止身份被冒充。

三、HTTPS总结

相比 HTTP 协议,HTTPS 协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全。

1、HTTPS缺点

  1. SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐。
  2. HTTPS 降低用户访问速度(多次握手)。
  3. 网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)。
  4. HTTPS 涉及到的安全算法会消耗 CPU 资源,需要增加大量机器(https访问过程需要加解密)。

四、构建私有的CA机构

1、CA介绍

CA(Certificate Authority)证书颁发机构主要负责证书的颁发、管理以及归档和吊销。证书内包含了拥有证书者的姓名、地址、电子邮件帐号、公钥、证书有效期、发放证书的CA、CA的数字签名等信息。
证书主要有三大功能:加密、签名、身份验证。

2、构建私有CA

2.1 检查安装openssl

[root@https-ca ~]# rpm -qa openssl
如若没有安装
[root@https-ca ~]# yum install openssl openssl-devel

2.2 查看配置文件

[root@https-ca ~]# vim /etc/pki/tls/openssl.cnf
[ ca ]
default_ca           = CA_default        # 默认的CA配置;CA_default指向下面配置块

[ CA_default ]
dir                  = /etc/pki/CA           # CA的默认工作目录
certs                = $dir/certs            # 认证证书的目录
crl_dir              = $dir/crl              # 证书吊销列表的路径
database             = $dir/index.txt        # 数据库的索引文件
new_certs_dir   = $dir/newcerts         # 新颁发证书的默认路径
certificate     = $dir/cacert.pem       # 此服务认证证书,如果此服务器为根CA那么这里为自颁发证书
serial          = $dir/serial           # 下一个证书的证书编号
crlnumber       = $dir/crlnumber        # 下一个吊销的证书编号                                      
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# CA的私钥
RANDFILE        = $dir/private/.rand    # 随机数文件
x509_extensions = usr_cert              # The extentions to add to the cert
name_opt        = ca_default            # 命名方式,以ca_default定义为准
cert_opt        = ca_default            # 证书参数,以ca_default定义为准
default_days    = 365                   # 证书默认有效期
default_crl_days= 30                    # CRl的有效期
default_md      = sha256                # 加密算法
preserve        = no                    # keep passed DN ordering
policy          = policy_match          #policy_match策略生效
# For the CA policy
[ policy_match ]
countryName             = match         #国家;match表示申请者的申请信息必须与此一致
stateOrProvinceName     = match         #州、省
organizationName        = match         #组织名、公司名
organizationalUnitName  = optional      #部门名称;optional表示申请者可以的信息与此可以不一致
commonName              = supplied
emailAddress            = optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]                     #由于定义了policy_match策略生效,所以此策略暂未生效
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

2.3 根证书服务器目录

1、根CA服务器:因为只有 CA 服务器的角色,所以用到的目录只有/etc/pki/CA
2、网站服务器:只是证书申请者的角色,所以用到的目录只有/etc/pki/tls

2.4 创建所需文件

[root@https-ca ~]# cd /etc/pki/CA/
[root@https-ca CA]# ls
certs  crl  newcerts  private
[root@https-ca CA]# touch index.txt   #创建生成证书索引数据库文件
[root@https-ca CA]# ls
certs  crl  index.txt  newcerts  private
[root@https-ca CA]# echo 01 > serial   #指定第一个颁发证书的序列号
[root@https-ca CA]# ls
certs  crl  index.txt  newcerts  private  serial

2.5 创建密钥

在根CA服务器上创建密钥,密钥的位置必须为/etc/pki/CA/private/cakey.pem,这个是openssl.cnf中指定的路径,只要与配置文件中指定的匹配即可。

[root@https-ca CA]# (umask 066; openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...........+++
...............+++
e is 65537 (0x10001)

2.6 生成自签名证书

根CA自签名证书,根CA是最顶级的认证机构,没有人能够认证他,所以只能自己认证自己生成自签名证书。

[root@https-ca ~]# cd /etc/pki/CA/
[root@https-ca CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem -days 7300
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) [XX]:CN
State or Province Name (full name) []:BEIJING
Locality Name (eg, city) [Default City]:BEIJING
Organization Name (eg, company) [Default Company Ltd]:CA
Organizational Unit Name (eg, section) []:OPT
Common Name (eg, your name or your server's hostname) []:ca.qf.com
Email Address []:
[root@https-ca CA]# ls
cacert.pem  certs  crl  index.txt  newcerts  private  serial

-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书
-key: 生成请求时用到的私钥文件
-days n: 证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径

2.7 下载安装证书

/etc/pki/CA/cacert.pem就是生成的自签名证书文件,使用 SZ/xftp工具将他导出到窗口机器中。然后双击安装此证书到受信任的根证书颁发机构。

[root@https-ca CA]# yum install -y lrzsz
[root@https-ca CA]# sz cacert.pem
image.png
image.png
image.png
image.png
3、客户端CA证书申请及签名

3.1 检查安装openssl

[root@nginx-server ~]# rpm -qa openssl
如果未安装,安装 openssl
[root@nginx-server ~]# yum install openssl openssl-devel

3.2 客户端生成私钥文件

[root@nginx-server ~]# (umask 066; openssl genrsa -out /etc/pki/tls/private/www.llf.com.key 2048)
Generating RSA private key, 2048 bit long modulus
..............................+++
..........+++
e is 65537 (0x10001)
[root@nginx-server ~]# cd /etc/pki/tls/private/
[root@nginx-server private]# ls
www.llf.com.key

3.3 客户端私钥加密生成证书请求

[root@nginx-server private]# ls ../
cert.pem  certs  misc  openssl.cnf  private
[root@nginx-server private]# openssl req -new -key /etc/pki/tls/private/www.llf.com.key -days 365 -out /etc/pki/tls/www.llf.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) [XX]:CN
State or Province Name (full name) []:BEIJING
Locality Name (eg, city) [Default City]:BEIJING
Organization Name (eg, company) [Default Company Ltd]:QF
Organizational Unit Name (eg, section) []:OPT
Common Name (eg, your name or your server's hostname) []:www.llf.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@nginx-server private]# ls ../
cert.pem  certs  misc  openssl.cnf  private  www.llf.com.csr

csr包含了公钥和名字信息。通常以.csr为后缀,是网站向CA发起认证请求的文件,是中间文件。
最后把生成的请求文件/etc/pki/tls/www.llf.com.csr传输给CA,这里使用scp命令,通过ssh协议将文件传输到CA下的/etc/pki/CA/private/目录。

[root@nginx-server ~]# cd /etc/pki/tls/
[root@nginx-server tls]# scp www.llf.com.csr 10.0.105.181:/etc/pki/CA/private
[email protected]'s password: 
www.llf.com.csr                                                           100%  997   331.9KB/s   00:00 

3.4 CA签署证书

[root@https-ca ~]# openssl ca -in /etc/pki/CA/private/www.llf.com.csr -out /etc/pki/CA/certs/www.llf.com.ctr -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jul  3 10:12:23 2019 GMT
            Not After : Jul  2 10:12:23 2020 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = BEIJING
            organizationName          = QF
            organizationalUnitName    = OPT
            commonName                = www.qf.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                E3:AC:1A:55:2B:28:B9:80:DC:9C:C2:13:70:53:27:AD:3D:44:8F:D3
            X509v3 Authority Key Identifier: 
                keyid:5D:2A:81:B2:E7:8D:D8:88:E5:7B:94:CA:75:65:9C:82:2B:A9:B2:3C

Certificate is to be certified until Jul  2 10:12:23 2020 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

证书通常以.crt为后缀,表示证书文件。

3.5 查看生成的证书的信息

[root@https-ca ~]# openssl x509 -in /etc/pki/CA/certs/www.llf.com.ctr -noout -subject
subject= /C=CN/ST=BEIJING/O=QF/OU=OPT/CN=www.llf.com

3.6 将生成的证书发放给请求客户端

[root@https-ca ~]# cd /etc/pki/CA/certs/
[root@https-ca certs]# scp www.llf.com.ctr 10.0.105.199:/etc/pki/CA/certs/
[email protected]'s password: 
www.llf.com.ctr                                                           100% 4422   998.3KB/s   00:00 
4、CA吊销证书

4.1 知道客户端吊销的证书serisal

[root@https-ca ~]# openssl x509 -in /etc/pki/tls/cert.pem  -noout -serial -subject
serial=5EC3B7A6437FA4E0
subject= /CN=ACCVRAIZ1/OU=PKIACCV/O=ACCV/C=ES

4.2 吊销证书

先根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致.

[root@https-ca ~]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem

4.3 生成吊销证书的编号
第一次吊销一个证书才需要执行

[root@https-ca ~]# echo 01 > /etc/pki/CA/crlnumber

4.4 更新证书吊销列表

[root@https-ca ~]# openssl ca -gencrl -out thisca.crl

4.5 查看证书吊销列表

[root@https-ca ~]# openssl crl -in /root/thisca.crl -noout -text

你可能感兴趣的:(HTTPS基本原理及构建CA)