术语:
SSL (Secure Socket Layer)安全套接字层协议
TLS (Transport Layer Security)传输层安全协议

TLS协议

第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。
第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。
第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成”对话密钥”(session key),用来加密接下来的整个对话过程。

Tip:
1,生成对话密钥一共需要三个随机数,第三个发出的随机数是用服务端公钥加密的,除了客户端知道和服务端能解密出来外其他人不知道。
2,握手之后的对话使用”对话密钥”加密(对称加密),服务器的公钥和私钥只用于加密和解密”premaster secret”(非对称加密),无其他作用。
3,服务器公钥放在服务器的数字证书之中。

Diffie-Hellman

curl -k https://www.baidu.com/img/baidu_jgylogo3.gif

Wireshark

192.168.1.5 180.97.33.107 SSL Client Hello
180.97.33.107 192.168.1.5 TLSv1.2 Server Hello
180.97.33.107 192.168.1.5 TLSv1.2 Certificate, Server Key Exchange(服务端DH参数), Server Hello Done
192.168.1.5 180.97.33.107 TLSv1.2 Client Key Exchange(客户端DH参数), Change Cipher Spec, Encrypted Handshake Message
180.97.33.107 192.168.1.5 TLSv1.2 Change Cipher Spec, Encrypted Handshake Message

Curl -v 显示交互过程

* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* NPN, negotiated HTTP1.1
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Unknown (67):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256

证书生成

openssl参数解析

-new:创建一个证书请求文件
-config
-extfile
-subj

1,自签名证书

生成私钥
openssl genrsa -des3 -out server.key 4096

去除key口令
openssl rsa -in server.key -out nokey_server.key

生成CSR
openssl req -new -key server.key -out server.csr -config openssl.cfg -subj "/C=CN/ST=SC/L=CD/O=CerTest/OU=CerTest/CN=www.mytest.com"

CN = baidu.com 通用名称
O = BeiJing Baidu Netcom Science Technology Co., Ltd 组织单位
OU = service operation department. 部门
L = beijing 城市
ST = beijing 省/州名
C = CN 国家/地区

生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

openssl生成私钥,通过私钥生成证书请求csr。权威证书机构通过证书请求文件给你生成cer证书。但自建CA可为自己的请求签发证书,当然这是不可信的。当将CA导入本地计算机“受信任的根证书颁发机构”后便认为该证书是可信的了。

2,自建CA签发证书

Step1:生成根CA

a) 生成私钥ca.key
openssl genrsa -aes256 -passout pass:123456 -out ca.key 4096

b) 生成证书签名请求文件ca.csr
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=SC/O=CerTest/OU=Test Certificate Authority/CN=Test Root CA"

openssl ca 伪命令会自动去找环境变量中的openssl.cfg配置文件

c) 使用CA私钥自签发根证书
openssl x509 -req -days 3650 -sha256 -signkey ca.key -in ca.csr -extfile ca.cnf -extensions v3_ca -out ca.cer

ca.cnf配置文件

1
2
3
4
5
6
[ v3_ca ]
# Extensions for a typical CA
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
keyUsage = cRLSign, keyCertSign

Step2:生成中间证书

a) 生成私钥inter.key
openssl genrsa -aes256 -passout pass:123456 -out inter.key 4096

b) 生成中级证书请求文件inter.csr
openssl req -new -key inter.key -out inter.csr -subj "/C=CN/ST=SC/O=CerTest/OU=Test Certificate Authority/CN=Test Intermedia CA"

c) 使用CA根证书签发中间证书inter.cer,该证书可以继续签发服务器证书。
openssl x509 -req -days 3650 -CAkey ca.key -CA ca.cer -in inter.csr -CAcreateserial -extfile inter.cnf -extensions v3_ca -out inter.cer

inter.cnf配置文件

1
2
3
4
5
6
7
8
[ v3_ca ]
# Extensions for a typical CA
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
# 中间证书需添加,pathlen:0
basicConstraints = CA:true,pathlen:0
keyUsage = cRLSign, keyCertSign

Step3:生成服务端证书请求文件

1
2
openssl genrsa -aes256 -passout pass:123456 -out server.key 4096
openssl req -new -key server.key -out server.csr -subj "/O=CerTest/OU=Test Certificate Authority/CN=*.mytestx.com"

Step3:用中间证书签发服务器证书

1
openssl x509 -req -days 365 -sha256 -CA inter.cer -CAkey inter.key -extfile server.cnf -extensions v3_req -CAcreateserial -in server.csr -out server.cer

server.cnf配置文件

1
2
3
4
5
6
7
8
9
10
11
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
nsCertType = server
subjectAltName = @alt_names
[ alt_names ]
# 解决浏览器报错 NET::ERR_CERT_COMMON_NAME_INVALID
DNS.1 = *.mytestx.com
DNS.2 = mytestx.com

分别将ca.cer、inter.cer导入本地受信任的根证书颁发机构和中间证书颁发机构中。导入ca.cer后查看inter.cer显示是受信任了,再次导入中间证书server.cer才能被计算机信任。

OPENSSL 证书验证

查看证书
openssl s_client -showcerts -connect aa.mytestx.com:443

证书链验证

1
2
3
4
openssl verify ca.cer
openssl verify -CAfile ca.cer inter.cer
cat ca.cer inter.cer > ca_bundle.cer
openssl verify -CAfile ca_bundle.cer server.cer

Nginx配置HTTPS证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 443 ssl;
server_name aa.mytestx.com;
ssl_certificate /demoCA/server.cer;
ssl_certificate_key /demoCA/nokey_server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /nginx-1.14.0/html;
index index.html index.htm;
}
}

ssl_certificate参数也可以配置bundle.cer,服务器将推送中间证书,防止某些客户端无法验证证书链。这里合并时需要注意前后顺序,服务器证书公钥在前,中间证书公钥在后。

cat server.cer inter.cer > bundle.cer

客户端验证服务器证书时,首先检查该证书的颁发者,如中级颁发者,如果该中级证书文件不存在本地计算机内且无法联网下载时,则证书验证失败NET::ERR_CERT_AUTHORITY_INVALID;本地无中间证书或者推送的中间证书错误时,浏览器将尝试通过服务器证书中的“授权访问信息”属性去联网下载,但是安卓客户端和接口调用则无法自动下载将导致连接失败。如果服务器推送了中间证书,本地计算机内只含有根CA,也可通过验证。所以在某些SSL网关设备上,尽量根CA、中间证书和服务器证书都配置上。

代理

转换成PKCS12格式供Burp使用
openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx

将CA导入受信任的根证书颁发机构后若火狐仍不信任则在火狐证书管理器中对其编辑信任。

Chrome https代理死活出错解决办法

Chrome -> Fiddler -> Burp

配置Fiddler Gateway指向Burp

Manual Proxy Configuration:
http://127.0.01:8080

IOS导入并信任burp证书