們的客戶是在內網環境里面,所以就只能用自簽名證書來搞,我一想這還不容易,就迅速的百度了一下隨便找了個文章開始照貓畫虎,很快就弄完了,但是弄完后發現還是有問題,而且https 還是報不安全,
1、基于nginx版本
1、證書生成
生成密鑰,采用的是des3算法
openssl genrsa -des3 -out server.key 2048
根據密鑰簽發申請文件CSR
openssl req -new -key server.key -out server.csr
#這一步主要是去除密鑰的密碼,便于后續部署
openssl rsa -in server.key -out server.key
#生成自簽名根證書并設置證書的有效期,crt是發給客戶端的證書
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
#有的需要pem的證書,對證書做的轉換
openssl x509 -in server.crt -out server.pem -outform PEM
2、配置Nginx
server {listen 8080 ssl; #端口增加SSL支持server_name _;charset utf-8;# ssl on;ssl_certificate /data/app/nginx/nginx/cert/server.crt;# 證書文件ssl_certificate_key /data/app/nginx/nginx/cert/server.key; #私鑰文件# access_log ./logs/access_stream.log main;# error_log ./logs/error_stream.log;location / {root /home/nginx/knowledge2.0/;index index.html;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
3、瀏覽器訪問
使用https協議訪問8080端口,但是會提示證書不可信,后面我們會詳細講解怎樣解決這個問題。
對于瀏覽器提示證書不可信,由于采用的自簽名證書,瀏覽器是沒有我們的自簽名證書導致。
4、證書不可信解決方案
生成證書時候增加ext.ini
extendedKeyUsage = serverAuth, clientAuth
basicConstraints = CA:FALSE
keyUsage = nonRepudiation,digitalSignature,keyEncipherment
subjectAltName = @alt_names[alt_names]
IP.1=172.1.0.1
DNS.1=www.test.com
然后重新使用Openssl重新生成證書,上述配置說明該證書是IP或者域名所有的:
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt -extfile ext.ini
生成證書,然后導出crt證書,在windows下加入到信任的根證書下面,再次訪問瀏覽器,瀏覽器訪問不會報錯
二、基于域名的https
證書相關文件格式說明
.key: 私鑰文件
.pem: 根證書公鑰
.crt: 域名證書公鑰
自簽名文件的生成過程
這里用的工具是openssl,怎么安裝可以自行查一下
普通域名的自簽名
我們以域名 td.todocoder.com為例
創建證書目錄:/root/cert,進入/root/cert 創建 rootCA.key
$ openssl genrsa -des3 -out rootCA.key 2048
使用生成的密鑰(rootCA.key)來創建新的根SSL證書。并將其保存為rootCA.pem,證書有效期為10年
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem
輸入第一步設置的密碼
Enter pass phrase for rootCA.key:
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Zhengzhou
Locality Name (eg, city) []:Zhengzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:todocoderCA
Organizational Unit Name (eg, section) []:todocoderCA
Common Name (e.g. server FQDN or YOUR name) []:RootTodoCoder Cert
Email Address []:todocoder@github.com
這一行是把pem 轉換成 crt格式
$ openssl x509 -outform der -in rootCA.pem -out rootCA.crt
提示填寫的字段大多都可以直接回車過就行了,只要Common Name字段需要填寫內容,這是生成跟證書后導入到系統的證書名稱,我填的是RootTodoCoder Cert創建生成域名ssl證書的前置文件
在這里我生成一個 td.todocoder.com 的域名證書。創建一個td.ext文件,以創建一個X509 v3證書。注意我們指定了subjectAltName選項。cat >> td.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names[alt_names]
DNS.1 = td.todocoder.com
EOF
這里的 [alt_names] 域中即為我們需要指定的 subjectAltName,可以配置多個 IP,DNS 或其他值。生成域名ssl證書秘鑰(tdtodocoder.csr、tdtodocoder.key)
$ openssl req -new -sha256 -nodes -out tdtodocoder.csr -newkey rsa:2048 -keyout tdtodocoder.keyCountry Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Zhengzhou
Locality Name (eg, city) []:Zhengzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:todocoder
Organizational Unit Name (eg, section) []:todocoder
Common Name (e.g. server FQDN or YOUR name) []:td.todocoder.com
Email Address []:todocoder@github.com
A challenge password []:rootCA
An optional company name []:todocoder
這一步填寫域名證書密鑰需要的信息,會展示在瀏覽器的域名證書信息,其中最重要的是Common Name的內容,必須是對應需要https訪問的域名的。
通過我們之前創建的根SSL證書頒發,創建出一個 test.testcloudide.com 的域名證書。輸出是一個名為的證書文件ttestcloudide.crt(對應位置替換為自己的文件路徑)
$ openssl x509 -req -in tdtodocoder.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out tdtodocoder.crt -days 500 -sha256 -extfile td.ext
以上,我們把域名 td.todocoder.com的證書已經創建好了,文件目錄如下:.
├── rootCA.crt
├── rootCA.key
├── rootCA.pem
├── td.ext
├── tdtodocoder.crt
├── tdtodocoder.csr
└── tdtodocoder.key
接下來我們看一下,在nginx 和k8s中是如何用的。
nginx 配置域名td.todocoder.com的證書
我們拿到上面幾步生成的 td.todocoder.com域名的文件,tdtodocoder.key、tdtodocoder.crt
配置到nginx的配置中
server {listen 443 ssl;# 以td.todocoder.com域名訪問server_name td.todocoder.com;# 配置ssl域名證書ssl_certificate [ssl證書路徑]/tdtodocoder.crt;ssl_certificate_key [ssl證書路徑]/tdtodocoder.key;index index.html index.php;# 反向代理需要被訪問的本地服務location / {proxy_pass http://localhost:8080;}...}
自簽名的域名訪問需要配置host
vi /etc/hosts
192.168.111.37 td.todocoder.com
然后直接訪問 td.todocoder.com 在瀏覽器上應該可以看到證書的信息,注意此時瀏覽器還提示的是證書無效,不安全。后面需要在操作系統信任一下證書就可以了。
如果你用的是k8s ,可以在ingress中配置
ingress配置tls證書
創建secret
$ kubectl -n todocoder create secret tls tdtodocoder-certs --key tdtodocoder.key --cert tdtodocoder.crt
# 重啟ingress controller
$ kubectl rollout restart daemonset.apps/nginx-ingress-controller -n ingress-nginx
配置ingress yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-todocodernamespace: todocoderannotations:nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:tls:- hosts:- "td.todocoder.com"secretName: tdtodocoder-certsingressClassName: nginxrules:- host: "td.todocoder.com"http:paths:- backend:service:name: todocoder-frontport:number: 8080path: /?(.*)pathType: ImplementationSpecific
以上,我們把域名 td.todocoder.com的證書已經創建好了,如果不創建泛域名的證書可以直接跳過泛域名的創建過程。接下來我們看一下泛域名證書的簽名流程
泛域名的自簽名
泛域名是域名前面的字符不是固定的,可能會根據id生成,比如,我的 id是:fsd423dsf234dsfs, 我自己的泛域名就是 fsd423dsf234dsfs.todocoder.com ,每個用戶都可以有不同的域名。那么我們只需要配置 *.todocoder.com 這個域名就可以,具體操作流程如下:
從上面第3步開始,我們需要用同一個根證書簽名,所以rootCA 的證書就不用再新建了
創建生成域名ssl證書的前置文件
創建一個fanym.ext文件, 注意我們指定了subjectAltName選項。
cat >> fanym.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names[alt_names]
DNS.1 = *.todocoder.com
EOF
注意:這里的 域名配置的 *.todocoder.com
生成域名ssl證書秘鑰(fantodocoder.csr、fantodocoder.key)
$ openssl req -new -sha256 -nodes -out fantodocoder.csr -newkey rsa:2048 -keyout fantodocoder.keyCountry Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Zhengzhou
Locality Name (eg, city) []:Zhengzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:fantodocoder
Organizational Unit Name (eg, section) []:fantodocoder
Common Name (e.g. server FQDN or YOUR name) []:*.todocoder.com
Email Address []:todocoder@github.com
...
A challenge password []:rootCA
An optional company name []:fantodocoder
這一步填寫域名證書密鑰需要的信息,會展示在瀏覽器的域名證書信息,其中最重要的是Common Name的內容,必須是對應需要https訪問的域名的。
通過我們之前創建的根SSL證書rootCA.pem, rootCA.key頒發,創建出一個 *.todocoder.com 的域名證書。輸出是一個名為的證書文件fantodocoder.crt(對應位置替換為自己的文件路徑)
$ openssl x509 -req -in fantodocoder.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out fantodocoder.crt -days 500 -sha256 -extfile fanym.extCertificate request self-signature ok
subject=C = CN, ST = Zhengzhou, L = Zhengzhou, O = fantodocoder, OU = fantodocoder, CN = *.todocoder.com, emailAddress = todocoder@github.com
Enter pass phrase for rootCA.key:
當前的目錄結構:.
├── fantodocoder.crt
├── fantodocoder.csr
├── fantodocoder.key
├── fanym.ext
├── rootCA.crt
├── rootCA.key
├── rootCA.pem
├── td.ext
├── tdtodocoder.crt
├── tdtodocoder.csr
└── tdtodocoder.key
Nginx 配置
server {listen 443 ssl;server_name *.todocoder.com;
# 配置ssl域名證書
ssl_certificate [ssl證書路徑]/fantodocoder.crt;ssl_certificate_key [ssl證書路徑]/fantodocoder.key;index index.html index.php;# 反向代理需要被訪問的本地服務location / {proxy_pass http://localhost:8080;}...}
我們用泛域名 fsd423dsf234dsfs.todocoder.com訪問,訪問之前需要配置hosts
vi /etc/hosts
192.168.111.37 fsd423dsf234dsfs.todocoder.com
訪問 fsd423dsf234dsfs.todocoder.com 可以看到我們剛剛的泛域名證書信息。
截止到這一步,我們的域名在nginx或者k8s端已經配置完成,我們想要的效果是在https 訪問的時候,不報錯,并且提示證書安全有效,那么需要我們在我們的操作系統上配置信任證書
各個系統下證書的信任流程
mac 下證書的添加方式
mac系統只需要添加 域名證書就可以,不用添加rootCA 證書
在mac下我們拿到證書后,雙擊tdtodocoder.crt文件->打開鑰匙串->選擇信任
然后重啟瀏覽器再訪問 td.todocoder.com,可以看到顯示https 安全了
Windows下證書的添加方式
Windows 需要添加 rootCA 和域名的證書到系統里面
如果要訪問 td.todocodoer.com 需要安裝 rootCA.crt、tdtodocoder.crt 這兩個證書
雙擊CA根證書->存儲位置選擇本地->指定證書位置(受信任的根證書頒發機構)
ubuntu下證書的添加方式
我的系統是Ubuntu 桌面版 22.04 的版本, ubuntu需要添加 rootCA 和域名的證書到系統里面
拷貝證書到ca證書的目錄
$ sudo cp tdtodocoder.crt /usr/share/ca-certificates/mozilla/tdtodocoder.crt
$ sudo cp fantodocoder.crt /usr/share/ca-certificates/mozilla/fantodocoder.crt
$ sudo cp rootCA.crt /usr/share/ca-certifi
cates/mozilla/rootCA.crt
執行下面的命令按提示選中新添加的證書,確定(點回車) ,選中(點空格鍵)然后選 ”OK” 就行了
$ sudo dpkg-reconfigure ca-certificatesUpdating certificates in /etc/ssl/certs...
rehash: warning: skipping ca-certificates.crt,it does not contain exactly one certificate or CRL
rehash: warning: skipping rootCA.pem,it does not contain exactly one certificate or CRL
1 added, 0 removed; done.
正在處理用于 ca-certificates (20230311ubuntu0.22.04.1) 的觸發器 ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
點回車,點空格選中 -> 回車確定
就可以了.
火狐瀏覽器證書的添加方式
Chrome,safari,Edge等瀏覽器直接就可以訪問了,但是火狐瀏覽器(ubuntu桌面版火狐,其他系統的沒試)的話需要在設置里面添加跟證書。具體操作:
點擊設置-> 搜索證書,點擊查看證書 -> 證書頒發機構 -> 導入 -> rootCA.crt -> 編輯信任
可以看到,火狐瀏覽器已經顯示安全
參考
https://mp.weixin.qq.com/s/Qi2pDCBJYGymLJxBIvqvqg