nginx上搭建https服务
參考鏈接:https://www.cnblogs.com/dreamingodd/p/7357029.html
Https、OpenSSL自建CA證書及簽發證書、nginx單向認證、雙向認證及使用Java訪問
0.環境
本文的相關源碼位于?https://github.com/dreamingodd/CA-generation-demo?
必須安裝nginx,必須安裝openssl,(用apt-get update, apt-get install來安裝比較簡單)
1.配置和腳本
先創建一個demo目錄(位置自己選擇,我選擇建在nginx的目錄下):
mkdir /etc/nginx/ca-demo
cd /etc/nginx/ca-demo
修改SSL配置openssl.cnf(也可能是openssl.conf,不知道在哪可以用find -name / openssl.cnf查找)
將dir屬性改成你上一步自建的目錄,不要用相對路徑,會踩坑,保存,如圖:
我喜歡自動化,所以寫了三個如下腳本,可以直接使用:
ca.sh
#!/bin/bash#Create directory hierarchy.創建目錄結構 touch index.txt serial chmod 666 index.txt serial echo 01 > serial mkdir -p newcerts private#生成RSA密鑰對 openssl genrsa -des3 -out ./private/cakey.pem 2048 #openssl req -new -days 365 -key ./private/cakey.pem -out ca.csr #openssl ca -selfsign -in ca.csr -out ca.crt # one step.一步生成csr,crt,直接10年使用期 openssl req -new -x509 -days 3650 -key ./private/cakey.pem -out ca.crtserver.sh
#!/bin/bash # 簽發服務器證書 mkdir server openssl genrsa -out ./server/server.key openssl req -new -key ./server/server.key -out ./server/server.csr openssl ca -in ./server/server.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./server/server.crt -days 3650client.sh:
#!/bin/bash # 簽發client證書 mkdir client openssl genrsa -des3 -out ./client/client.key 2048 openssl req -new -key ./client/client.key -out ./client/client.csr openssl ca -in ./client/client.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./client/client.crt -config "/etc/ssl/openssl.cnf" openssl pkcs12 -export -clcerts -in ./client/client.crt -inkey ./client/client.key -out ./client/client.p12以上三個腳本都可以在?https://github.com/dreamingodd/CA-generation-demo? 找到
將以上三個腳本復制到自建demo目錄中,如下所示:
加入運行權限:
chmod +x *.sh
結果如下:
2.自建CA證書
運行腳本ca.sh,效果如下:
a.輸入密碼短語:(隨便,記住就行,我填的是"demo",需要填3次)
b.生成證書需要填入一些信息:Country Name(國家),State or Province Name(省),Locality Name(市),Organizational Name(組織名,隨便填,我填的是Choosefine Ltd),Common Name(一般填域名),其他可以不填。
?這樣證書就生成并自簽名了:
其中,newcerts目錄用于存放CA簽署(頒發)過的數字證書(證書備份目錄)。private目錄用于存放CA的私鑰。?文件serial和index.txt分別用于存放下一個證書的序列號和證書信息數據庫。?文件serial填寫第一個證書序列號(如10000001),之后每前一張證書,序列號自動加1。
可以把ca.crt下載到你的windows系統的PC機上,后面會用到。?
3.簽發服務端證書
運行腳本server.sh,效果如下:
最后一句是Data Base Updated,就表示成功了,要填的東西跟上一步非常相似,需要注意的是:
a.國家和省份必須和上一步一樣。
b.Organizational Name必須和上一步一樣。
c.Common Name,如果你的測試服務器有域名的話,填入域名,沒有的話隨便填一個網址,windows訪問測試時配置一下hosts就好,我這里填的是ssl.demo.com。
d.challenge password隨便填,記住就行,我填的demo。
e.pass phrase密碼短語是CA證書的的,我生成的時候用的也是demo。
生成結果:
4.Nginx配置Https單向認證
?這一步我要使用上面我們生成的證書s來配置一個安全的Https單向訪問資源鏈接。
首先修改nginx配置文件,
vi /etc/nginx/nginx.conf
在http中加入以下內容:
server {
? ? server_name ssl.demo.com;
? ? listen 443;
? ? ssl on;
? ? ssl_certificate ca-demo/server/server.crt;
? ? ssl_certificate_key ca-demo/server/server.key;
? ? location / {
? ? ? ? root html;
? ? ? ? index index.html index.html;
? ? }
}
運行以下命令檢查和重啟nginx:
/usr/sbin/nginx -t service nginx restart使用IP訪問一下:
成功了,會顯示證書不安全。一般來說,如果花錢使用證書公司簽發的server.crt和server.key不會有這個問題。
這里想解決這個問題的話需要windows本地信任我們自己的CA證書。如果對這個問題不感興趣可以直接跳過。
首先,將我們第二步生成的CA證書下載到windows系統本地,雙擊打開
點擊安裝:
點擊下一步:
選擇自定義證書集合,點擊瀏覽:
選擇第二個,受信任的證書列表,一直下一步/完成/是的等,就可以了。
?成功后效果如圖:
一開始那個X已經沒有了。
Status顯示OK。
如果你想看到證書集合的情況,可以WIN+R ->?certmgr.msc查看
名字是CA證書的Common Name。
最后(如果沒有域名),修改以下hosts文件模擬一下域名:
使用域名訪問,風險提示就消失了:
5.簽發客戶端證書
簽發客戶端證書,用于服務端開啟了ssl的客戶端驗證時,要求客戶端對請求做加密。?
運行腳本client.sh
所有密碼處我填的全是demo。
結果如下:
到此為止,證書的生成已經全部講完了。
6.Nginx配置Https雙向認證
Https雙向認證不僅驗證服務端的證書,服務端也要驗證客戶端的證書;不僅對客戶端的請求進行了加密,并且服務端使用的加密方案也是使用客戶端公鑰加密后發送給客戶端的。比單項認證更加安全。
我個人的理解是,單項認證防止請求被篡改,雙向認證防止請求被模擬。
題外話,Https使用了對稱加密+非對稱加密,由于非對稱加密的效率低,不適合傳輸的數據量大的時候。所以Https的客戶端將對稱加密的密鑰用服務端的公鑰進行加密再發送給服務端,服務端用私鑰進行解密(非對稱加密),對傳輸數據本身的加密使用的密鑰是一樣的(對稱加密)。
進入正題,首先開啟服務端nginx的客戶端ssl認證,將之前加入的配置刪除,貼入新的一份:
server {server_name ssl.demo.com;listen 443;ssl on;ssl_certificate ca-demo/server/server.crt;ssl_certificate_key ca-demo/server/server.key;ssl_client_certificate ca-demo/ca.crt;ssl_verify_client on;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root html;index index.html index.htm;}}檢查并重啟,再次訪問:
顯示未發送客戶端證書。
下載client.p12文件到本地,雙擊安裝,這次安裝到個人:
關閉瀏覽器再次訪問,就有了證書選擇的界面,選擇后正常訪問。
?之前有不少網銀都是使用這種方式進行交易的。
在上述的操作之后,發現在ie8中訪問是ok的,但是在chrome中訪問還是不安全的提示。所以繼續參考下面鏈接:
https://blog.csdn.net/dotalee/article/details/78041691
OpenSSL創建帶SAN擴展的證書并進行CA自簽
什么是 SAN
SAN(Subject Alternative Name) 是 SSL 標準 x509 中定義的一個擴展。使用了 SAN 字段的 SSL 證書,可以擴展此證書支持的域名,使得一個證書可以支持多個不同域名的解析。
來看看百度的證書,百度證書的擴展域名有這么多,其中還有了*.hao123.com,那我們再看看www.hao123.com的證書
發現的確是用的前面的百度證書
所以SAN帶來的好處就可以看出來了,一個證書可以用在各種不同的域名下,不需要一個域名買一個證書了。
利用OpenSSL創建證書
因為是本地環境,直接用OpenSSL給自己頒發一個CA根證書用于后面給服務器做CA簽署。?
1. 生成CA密鑰
2.生成CA根證書
openssl req -sha256 -new -x509 -days 365 -key ca.key -out ca.crt \-subj "/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=testRoot"3.生成服務器密鑰
openssl genrsa -des3 -out server.key 20484.生成服務器證書請求文件
openssl req -new \-sha256 \-key server.key \-subj "/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=bdstatic.com" \-reqexts SAN \-config <(cat /etc/pki/tls/openssl.cnf \<(printf "[SAN]\nsubjectAltName=DNS:*.bdstatic.com,DNS:*.baidu.com")) \-out server.csr5.CA簽署服務器證書
openssl ca -in server.csr \-md sha256 \-keyfile ca.key \-cert ca.crt \-extensions SAN \-config <(cat /etc/pki/tls/openssl.cnf \<(printf "[SAN]\nsubjectAltName=DNS:*.bdstatic.com,DNS:*.baidu.com")) \-out server.crt之后把生成好的服務器證書和服務器密鑰在服務器(ngnix,tomcat)里配置好,并且把ca.crt證書導入到瀏覽器的受信任的根證書頒發機構里,在瀏覽器訪問就不會有紅叉叉了。
注意事項
1. 關于私鑰的加密格式,因為筆者是在netty里使用的ssl協議,而netty僅支持PKCS8格式的私鑰(見http://netty.io/wiki/sslcontextbuilder-and-private-key.html),需要對密鑰格式進行轉換
//私鑰轉成PKCS8格式 openssl pkcs8 -topk8 -nocrypt -in server.key -out server_pri.pem代碼如下
SslContext serverSslCtx = SslContextBuilder.forServer(new File("E:/server.crt"),new File("E:/server_pri.pem")).build();附錄
PKCS1與PKCS8格式互轉
//默認生成PKCS1格式PEM編碼私鑰 openssl genrsa -out ca.key 2048 //轉換成PKCS8 openssl pkcs8 -topk8 -nocrypt -in ca.key -out ca_private.pem //PKCS8轉換成PKCS1 openssl rsa -in ca_private.pem -out ca.keyPEM與DER互轉
//PEM轉DER openssl rsa -in ca.key -outform DER -out ca_private.der openssl pkcs8 -topk8 -nocrypt -inform PEM -outform DER -in ca.key -out ca_private.der //DER轉PEM openssl rsa -in ca_private.der -inform DER -outform PEM -out ca.keyPKCS7轉PKCS12(tomcat證書)
//需加密碼保護 openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -name tomcat -out server.p12//springboot SSL配置 server.port= 8443 //端口 server.ssl.key-store=classpath:server.p12 //證書路徑 server.ssl.key-store-password= 123456 //p12證書密碼參考
OpenSSL SAN 證書?
使用OpenSSL生成多域名自簽名證書進行HTTPS開發調試?
使用 openssl 生成證書
隨后,將兩個鏈接中的配置命令合并起來,也就是增加了SAN的選項,通過ssl.demo.com訪問就不會告警了。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的nginx上搭建https服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Nginx添加openssl模块编译
- 下一篇: ssl协议及开源实现openssl