1、需求
內網且不連接外網的情況下使系統平台滿足---安全傳輸(http-https協議)
2、生成證書
編寫腳本
vim gen-ssl.sh
將腳本內容粘貼,wq保存退出
#!/bin/sh
# create self-signed server certificate:
read -p "Enter your domain [www.example.com]: " DOMAIN
echo "Create server key..."
openssl genrsa -des3 -out $DOMAIN.key 2048
echo "Create server certificate signing request..."
SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"
openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr
echo "Remove password..."
mv $DOMAIN.key $DOMAIN.origin.key
openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key
echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt
注:
執行腳本gen-ssl.sh
chmod a+x gen-ssl.sh
./gen-ssl.sh
執行中會提示輸入輸入1次域名和4次密碼
執行完畢后會生成以域名為名稱且后綴為 crt、csr、key、origin.key 四個文件
3、拷貝證書到nginx中
將證書放在指定位置,記住證書的絕對路徑(之后要配置在nginx.conf中)
如果nginx是docker容器,可以使用命令將宿主機的文件拷貝到容器中,或者掛載容器的目錄到宿主機再進行操作
這里使用拷貝方式
先查出容器id
docker ps | grep nginx
從宿主機拷貝,需要將后綴為crt與key的文件拷貝到容器中的 /etc/nginx/ssl 中:
docker cp <域名>.crt <容器id>:/etc/nginx/ssl
docker cp <域名>.key <容器id>:/etc/nginx/ssl
4、修改配置文件
修改nginx.conf,這里以我的配置為例,要在監聽86端口的服務上改變成https:
server {
listen 86;
# 以下3行配置ssl,開啟並指定后綴為crt與key的絕對路徑
ssl on;
ssl_certificate /etc/nginx/ssl/<域名>.crt;
ssl_certificate_key /etc/nginx/ssl/<域名>.key;
location / {
...
}
}
# 重新加載nginx配置文件,檢查是否配置有誤
nginx -s reload
# 啟動nginx
./nginx
#如果是容器啟動
docker restat <容器id>
5、驗證
登錄服務驗證
以chrome訪問原來的http網址提示:
400 Bad Request
The plain HTTP request was sent to HTTPS port
以https訪問提示:
!您的連接不是安全連接
點擊高級,繼續訪問,大功告成!
不是安全連接的原因是因為瀏覽器並沒有信任我們新添加的自己生成的證書,但是已經實現了加密訪問。
6、其他
查看docker容器元數據命令
docker inspect <容器id>
結果往上翻可以查看以下標簽:
"Mounts": []
其中"Source"與"Destination"的內容分別是宿主機的路徑與對應掛載的容器內路徑
腳本中的以下命令:
openssl genrsa -des3 -out $DOMAIN.key 2048
des3:生成的密鑰使用des3方式進行加密
-out filename:將生成的私鑰保存至filename文件,若未指定輸出文件,則為標准輸出
2048:指定要生成的私鑰的長度,默認為1024,必須為命令行的最后一項參數。
注:測試長度為1024配置完nginx后reload加載配置文件會報以下錯誤:
nginx:SSL: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
意思是私鑰長度太短,所以從1024改成2048重新生成即可
