本文摘自码农翻身,希望能更进一步的讲解证书以及网络安全。
之前在网络上的通信都是明文,中间的交换机都可以截取、篡改数据包,于是加密算法便诞生了,
当然这其中少不了数学家的智慧。

从对称加密说起

在开始之前,我们来虚构两个人物, 一个是位于中国的张大胖(怎么又是你?!),
还有一个是位于米国的Bill

这俩哥们隔着千山万水,通过网络联系上了, 两个人臭味相投,聊得火热。

有一天, Bill 突然意识到: 坏了, 我们的通信是明文的, 这简直就是网络上裸奔啊,
任何一个不怀好意的家伙都可以监听我们通信,打开我们发送的数据包,窥探我们的隐私啊。


最容易想到也就是上面的方案,既然明文不行,那我就做一次加密,用密文发送。
重点在于

加密和解密算法是公开的,那个密钥是保密的,也就是对称加密算法

但是怎么保证密钥不被截取?仿佛回到了鸡生蛋蛋生鸡的问题上。

用非对称加密解决?

Bill 和 张大胖的通信无法加密,说话谨慎了不少, 直到有一天, 他们听说了一个叫做RSA的非对称加密算法,一下子来了灵感。

这个RSA算法非常有意思,它不是像之前的算法, 双方必须协商一个保密的密钥, 而是有一对儿钥匙, 一个是保密的,称为私钥,另外一个是公开的,称为公钥。

当然RSA的特性在于公钥加密过的数据,只能用私钥来解密。

所以说上述的聊天过程应该变成这样

非对称加密+对称加密

因为RSA算法比之前的对称密钥算法要慢上百倍,这样为了安全都不能愉快的聊天了。

但是可以把两者结合起来

(1) 我生成一个对称加密算法的密钥, 用RSA的方式安全发给你

(2) 我们随后就不用RSA了, 只用这个密钥,利用对称加密算法来通信


下面开始正式介绍证书

证书分类

根据秘钥对的产生方式,可将证书分为两类:签名证书和加密证书。

根据证书的用途,通常将证书分为SSL服务器证书、SSL客户端证书、代码签名证书、Email证书,时间戳服务器证书、OCSP服务器证书等。

根据文件格式,以下为Windows支持的证书格式

下图大致描述了SSL服务端证书的使用流程

Openssl

SSL(Secure Socket Layer) 安全协议是由 Netscape 公司首先提出,最初用在保护 Navigator 浏览器和 Web 服务器之间的 HTTP 通信 ( 即 HTTPS) 。后来 SSL 协议成为传输层安全通信事实上的标准,并被 IETF 吸收改进为 TLS(Transport Layer Security) 协议。 SSL/TLS 协议位于 TCP 协议和应用层协议之间,为传输双方提供认证、加密和完整性保护等安全服务。 SSL 作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、 MAC 算法等密码算法实现安全服务。

OpenSSL 是著名的 SSL 的开源实现,是用 C 语言实现的。

Openssl包括三大类命令,,分别是是常用命令、消息摘要和密码命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand req
rsa rsautl s_client s_server
s_time sess_id smime speed
spkac srp ts verify
version x509
Message Digest commands (see the `dgst' command for more details)
md4 md5 rmd160 sha
sha1
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx rc2
rc2-40-cbc rc2-64-cbc rc2-cbc rc2-cfb
rc2-ecb rc2-ofb rc4 rc4-40
seed seed-cbc seed-cfb seed-ecb
seed-ofb

接下来就让我们来用openssl自建CA实现SSL服务的证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -key rootCA.key -days 3650 -out rootCA.pem \
-subj '/C=AA/ST=AA/L=AA/O=AA Ltd/OU=AA/CN=AA/emailAddress=aa@aa.com'
openssl genrsa -out client1.key 2048
openssl req -new -key client1.key -out client1.csr \
-subj '/C=BB/ST=BB/L=BB/O=BB Ltd/OU=BB/CN=BB/emailAddress=bb@bb.com'
openssl x509 -req -days 365 -CA rootCA.pem -CAkey rootCA.key \
-CAcreateserial -CAserial serial -in client1.csr -out client1.pem
openssl verify -verbose -CAfile rootCA.pem client1.pem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mkdir private
openssl genrsa -out private/cakey.pem 2048
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
touch index.txt serial crlnumber
echo 01 > serial
openssl genrsa -out httpd.key 2048
openssl req -new -key httpd.key -out httpd.csr
openssl ca -in httpd.csr -out httpd.crt -days 365
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
openssl pkcs12 -export -in admin.pem -inkey admin-key.pem -certfile ca.pem -out kube-admin.p12
openssl x509 -req -in haimaxy.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key
-CAcreateserial -out haimaxy.crt -days 500
openssl genrsa -out root-ca.key 2048
openssl req -new -key root-ca.key -out root-ca.req
openssl x509 -req -days 365 -signkey root-ca.key -in root-ca.req -out root-ca.cer
---
openssl x509 -noout -text -in root-ca.cer
----
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.req
openssl ca -config ./openssl.cnf -in server.req -out server.cer


openssl x509 -noout -text -in kubernetes.pem

openssl rsa -noout -text -in myserver.key

openssl req -noout -text -in myserver.csr

openssl x509 -noout -text -in ca.crt

openssl verify selfsign.crt

openssl verify -CAfile ca.crt myserver.crt

参考
http://seanlook.com/2015/01/18/openssl-self-sign-ca/
https://www.barretlee.com/blog/2016/04/24/detail-about-ca-and-certs/
http://qimingyu.com/2017/04/28/%E8%87%AA%E5%BB%BACA%E5%AE%9E%E7%8E%B0HTTPS%E6%95%99%E7%A8%8B/
http://blog.51cto.com/xxrenzhe/1370114
https://razeen.me/post/what-ct-is-and-how-it-works.html
https://access.redhat.com/documentation/en-US/Red_Hat_Certificate_System/8.0/html/Admin_Guide/Standard_X.509_v3_Certificate_Extensions.html