本文非原創(chuàng),系瀏覽各博客后結(jié)合自身使用的一個(gè)總結(jié)皱碘,方便回顧。
前情提要
通俗理解SSL/TLS協(xié)議區(qū)別與原理
數(shù)字簽名是什么
什么是x509證書鏈
- x509證書一般會(huì)用到三類文件,key鲸阻,csr玄呛,crt阅懦。
- key是私用密鑰,openssl格式徘铝,通常是rsa算法耳胎。
- csr是證書請(qǐng)求文件惯吕,用于申請(qǐng)證書。在制作csr文件的時(shí)候怕午,必須使用自己的私鑰來簽署申請(qǐng)混埠,還可以設(shè)定一個(gè)密鑰。
- crt是CA認(rèn)證后的證書文件(windows下面的csr诗轻,其實(shí)是crt)钳宪,簽署人用自己的key給你簽署的憑證。
概念
- 根證書 生成服務(wù)器證書扳炬,客戶端證書的基礎(chǔ)吏颖。自簽名。
- 服務(wù)器證書 由根證書簽發(fā)恨樟。配置在服務(wù)器上半醉。
- 客戶端證書 由根證書簽發(fā)。配置在服務(wù)器上劝术,并發(fā)送給客戶缩多,讓客戶安裝在瀏覽器里。
(把根證書安裝到瀏覽器的受信CA中养晋,訪問服務(wù)器時(shí)就不會(huì)出警告了衬吆。)
首先要有一個(gè)CA根證書,然后用CA根證書來簽發(fā)用戶證書绳泉。用戶進(jìn)行證書申請(qǐng):一般先生成一個(gè)私鑰逊抡,然后用私鑰生成證書請(qǐng)求(證書請(qǐng)求里應(yīng)含有公鑰信息),再利用證書服務(wù)器的CA根證書來簽發(fā)證書零酪。
步驟
自簽名CA根證書
1冒嫡、/root/ca目錄下創(chuàng)建4個(gè)子目錄:
- newcerts:存放CA簽署過的數(shù)字證書。
- private:存放CA的私鑰四苇。
- conf:存放一些簡化參數(shù)用的配置文件孝凌。
- server:存放服務(wù)器證書文件。
2月腋、制作ca.key 私鑰
openssl genrsa -out /root/ca/private/ca.key 2048
3蟀架、生成pem格式的根證書
openssl req -x509 -new -nodes \
-key /root/ca/private/ca.key \
-sha256 -days 1024 \
-out /root/ca/private/ca.pem
接下來提示將如下顯示:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GuangDong
Locality Name (eg, city) [Default City]:ShenZhen
Organization Name (eg, company) [Default Company Ltd]:Fatri
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:*.fatri.cn
Email Address []:a@fatri.cn
4、.pem轉(zhuǎn)化為.crt(用于瀏覽器信任)
openssl x509 -outform der -in /root/ca/private/ca.pem -out /root/ca/private/ca.crt
簽發(fā)服務(wù)器證書(客戶端證書同理)
1罗售、創(chuàng)建文件ca.conf
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C = CN
ST = GuangDong
L = ShenZhen
O = Fatri
OU = Test
emailAddress = a@fatri.cn
CN = *.fatri.cn
2辜窑、創(chuàng)建文件v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.fatri.cn
DNS.2 = localhost
IP.1 = 172.28.2.105
IP.2 = 172.28.2.107
3、生成服務(wù)端證書簽名請(qǐng)求寨躁,同時(shí)生成服務(wù)端私鑰(nginx用)
openssl req -new -sha256 -nodes \
-out /root/ca/server/server.csr \
-newkey rsa:2048 -keyout /root/ca/server/server.key \
-config /root/ca/conf/ca.cnf
4穆碎、用ca私鑰以ca的名義(ca.pem)給網(wǎng)站證書簽名,加上v3.ext中的配置
openssl x509 -req -in /root/ca/server/server.csr \
-CA /root/ca/private/ca.pem \
-CAkey /root/ca/private/ca.key \
-CAcreateserial -out /root/ca/server/server.crt -days 1800 -sha256 -extfile /root/ca/conf/v3.ext
至此證書生成完畢职恳!
接下來是使用流程所禀。
服務(wù)端Nginx配置SSL
1方面、啟動(dòng)Nginx容器
docker run -d --name nginx-test --restart always\
-p 81:8080 -p 444:443 \
-v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /root/ca:/root/ca \
nginx:1.17.3
解釋:
-d:后臺(tái)運(yùn)行 --name:容器名 --restart:重啟設(shè)置
-p:端口映射(宿主機(jī)端口:容器內(nèi)端口)
-v:數(shù)據(jù)掛載(容器內(nèi)目錄掛載到宿主機(jī), ro將容器內(nèi)配置文件設(shè)為只讀模式, 只能在宿主機(jī)修改nginx配置)
2、打開防火墻端口81色徘、444
firewall-cmd --add-port 81/tcp --permanent --zone=public
firewall-cmd --add-port 444/tcp --permanent --zone=public
firewal-cmd --reload
3恭金、配置nginx.conf, 為了開發(fā)方便同時(shí)開啟了http和https的訪問,如果局域網(wǎng)統(tǒng)一配置了域名褂策,不需要更改主機(jī)host就可以關(guān)閉8080端口或者將其重定向至443横腿。
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
# 請(qǐng)求主機(jī)頭字段,否則為服務(wù)器名稱
proxy_set_header Host $host;
# 客戶端ip地址
proxy_set_header X-Real-IP $remote_addr;
# 包含請(qǐng)求參數(shù)的原始URI斤寂,不包含主機(jī)名
proxy_set_header Request-Url $request_uri;
# 配置共享會(huì)話緩存大小耿焊,視站點(diǎn)訪問情況設(shè)定
ssl_session_cache shared:SSL:10m;
# 配置會(huì)話超時(shí)時(shí)間
ssl_session_timeout 10m;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream shadow {
server 172.20.0.104:8080 weight=1;
}
upstream web {
server 172.20.0.109:8080 weight=1;
}
server {
listen 8080;
listen 443 ssl;
server_name *.fatri.cn;
ssl_certificate /root/ca/server/server.crt;
ssl_certificate_key /root/ca/server/server.key;
# 設(shè)置長連接
keepalive_timeout 70;
# 以下兩項(xiàng)不建議顯示設(shè)定
# ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
# 定義算法
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# 優(yōu)先采取服務(wù)器算法
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://web;
}
location /api/v1/ws {
proxy_pass http://shadow;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
nginx重定向http請(qǐng)求配置(未測試)
server {
listen 80;
server_name *.fatri.cn;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.org;
root /etc/nginx/wwwroot/;
charset utf-8;
ssl_certificate /etc/nginx/ssl/example.org.bundle.crt;
ssl_certificate_key /etc/nginx/ssl/example.org.key;
# ...
}
4、修改Nginx配置文件nginx.conf, 修改后重啟容器使配置生效
docker restart nginx-test
由于不是買的官方CA證書遍搞,所以需要讓瀏覽器信任CA罗侯。
客戶端添加信任證書
雙擊根ca.crt
導(dǎo)入證書(也可從控制面板搜索管理系統(tǒng)證書導(dǎo)入)
選擇受信任的根證書頒發(fā)機(jī)構(gòu)
配置主機(jī)映射
# 1、修改host
win10到C:\Windows\System32\drivers\etc目錄下修改host(可先用文本編輯保存到桌面溪猿,在修改后綴名拖回文件夾覆蓋原文件)
mac直接命令行`sodo vi /etc/hosts`
# 2钩杰、添加映射
172.28.2.105 dev.fatri.cn
# 3、刷新配置
win10還需進(jìn)入終端輸入`ipconfig/flushdns`刷新配置
mac應(yīng)該直接修改后就生效