一、加密算法
- 对称算法:有流式、分组两种,加密和解密都是使用的同一个密钥。
- 非对称加密:使用公私钥进行加密解密,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。
- 哈希算法:将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
- 数字签名:签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
二、HTTPS原理
1、HTTP访问过程
HTTP请求过程中,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,“裸奔”在互联网上,所以很容易遭到黑客的攻击。
HTTP传输面临的风险:
- 窃听风险:黑客可以获知通信内容。
- 篡改风险:黑客可以修改通信内容。
- 冒充风险:黑客可以冒充他人身份参与通信。
2、HTTPS访问过程
2.1 对称加密
1、优点
此方法属于对称加密,对方拥有相同的密钥,信息得到安全传输。
2、缺点
- 不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高。
- 因每个客户端、服务器的安全级别不同,密钥极易泄露。
2.2 非对称加密
客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但上述过程也存在缺点:公钥是公开的(也就是黑客也会有公钥),所以第 ④ 步私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容。
2.3 两者结合
如上图所示:
(1)第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器。
(2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密。
(3)后续两者之间信息的传输就可以使用对称加密的方式了。
遇到的问题:
(1)客户端如何获得公钥。
(2)如何确认服务器是真实的而不是黑客。
2.4 获取公钥与确认服务器身份
1、获取公钥
(1)提供一个下载公钥的地址,回话前让客户端去下载。(缺点:下载地址有可能是假的;客户端每次在回话前都先去下载公钥也很麻烦)
(2)回话开始时,服务器把公钥发给客户端(缺点:黑客冒充服务器,发送给客户端假的公钥)
2、那有木有一种方式既可以安全的获取公钥,又能防止黑客冒充呢?
如上图所示,在第 ② 步时服务器发送了一个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缺点
- SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐。
- HTTPS 降低用户访问速度(多次握手)。
- 网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)。
- 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
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