亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > Nginx > 正文

詳解Nginx SSL快速雙向認證配置(腳本)

2024-08-30 12:29:42
字體:
來源:轉載
供稿:網友

目前遇到一個項目有安全性要求,要求只有個別用戶有權限訪問。本著能用配置解決就絕不用代碼解決的原則,在Nginx上做一下限制和修改即可。

這種需求其實實現方式很多,經過綜合評估考慮,覺得SSL雙向認證方案對用戶使用最簡單,遂決定用此方案。

注: 本方案在Ubuntu Server 16.04 LTS實施,其他操作系統請酌情修改

SSL雙向認證

絕大多數SSL應用都以單向認證為主,即客戶端只要信任服務端,就可以使用服務端的公鑰加密后向服務端發起請求,由服務端的私鑰解密之后獲得請求數據。

如果這個過程反過來,讓服務端信任客戶端,服務端使用客戶端的公鑰加密之后將數據返回給客戶端,其實也是可以做到的,原理和實現跟單向認證都差不多。

服務端信任客戶端的操作往往也會伴隨著客戶端認證服務端的過程,所以讓服務端信任客戶端的SSL認證方式往往也被稱為SSL雙向認證,并且要配置SSL雙向認證必須先開啟服務端SSL,先配置客戶端信任服務端。

Nginx的SSL雙向認證配置

第一步 開啟https訪問

根據理論知識,我們必須先開啟Nginx的SSL配置,即啟用https。這個過程較為簡單,目前有let's encrypt這種免費的證書方案,再也不用發愁自己搭建CA自簽了。申請免費證書的過程略過,直接貼啟用https的配置:

server { listen 80; listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 只有Nginx >= 1.13.0 版本才支持TLSv1.3協議 # ssl_protocols TLSv1.3; # Nginx低于1.13.0版本用這個配置 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on;  ssl_dhparam dhparam.pem; # openssl dhparam -out /etc/nginx/dhparam.pem 4096 ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0 ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # Requires nginx >= 1.5.9 ssl_stapling on; # Requires nginx >= 1.3.7 ssl_stapling_verify on; # Requires nginx => 1.3.7 resolver 223.5.5.5 114.114.114.114 valid=300s; resolver_timeout 5s;  # 啟用HSTS的配置,如果你的域名下還有非標準端口訪問的http應用,請勿啟用HSTS # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; # 下面這個配置會拒絕Frame標簽內容,請確認你的網站沒有frame / iframe add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; # 為了let's encrypt續期用,不用let's encrypt不需要這個location location /.well-known {  root /usr/share/nginx/html; }  ... SNIP ... # 強制http跳轉為https if ($scheme != "https") {  return 301 https://$http_host$request_uri; }}

以上那一大堆ssl的配置參考來自于: https://cipherli.st/ 加強SSL的安全性配置

特別注意最后的強制https跳轉,我們的目的是SSL雙向認證,不走https無任何意義,所以必須強制跳轉https。

第二步 生成客戶端證書并簽證(腳本)

這個過程詳細描述的文章太多了,這里就不啰嗦介紹openssl和簽證過程了,本篇內容是快速生成雙向認證配置的證書,所以直接貼腳本就行了,命令都是參考互聯網上各種openssl雙向配置文檔,在此基礎之上進行了命令上的簡化與非交互式的支持。

整個目錄結構如圖:

# tree /etc/nginx/ssl_certs//etc/nginx/ssl_certs/├── create_ca_cert.sh├── create_client_cert.sh├── revoke_cert.sh0 directories, 3 files

自行創建/etc/nginx/ssl_certs/,放入三個腳本,分別用于生成CA證書以及CA目錄(create_ca_cert.sh腳本的作用,只有第一次需要運行),創建客戶端證書,并用CA證書簽證(create_client_cert.sh腳本的作用,必須先生成CA證書),revoke_cert.sh腳本用于吊銷證書,需要收回權限的時候可以使用。

每個腳本內容如下:

create_ca_cert.sh

#!/bin/bash -e# 創建CA根證書# 非交互式方式創建以下內容:# 國家名(2個字母的代號)C=CN# 省ST=Shannxi# 市L=Xian# 公司名O=My Company# 組織或部門名OU=技術部# 服務器FQDN或頒發者名CN=www.example.com# 郵箱地址emailAddress=admin@example.commkdir -p ./demoCA/{private,newcerts}touch ./demoCA/index.txt[ ! -f ./demoCA/seria ] && echo 01 > ./demoCA/serial[ ! -f ./demoCA/crlnumber ] && echo 01 > ./demoCA/crlnumber[ ! -f ./demoCA/cacert.pem ] && openssl req -utf8 -new -x509 -days 36500 -newkey rsa:2048 -nodes -keyout ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem -subj "/C=${C}/ST=${ST}/L=${L}/O=${O}/OU=${OU}/CN=${CN}/emailAddress=${emailAddress}"[ ! -f ./demoCA/private/ca.crl ] && openssl ca -crldays 36500 -gencrl -out "./demoCA/private/ca.crl"

create_client_cert.sh

#!/bin/bash -eshow_help() {  echo "$0 [-h|-?|--help] [--ou ou] [--cn cn] [--email email]"  echo "-h|-?|--help  顯示幫助"  echo "--ou      設置組織或部門名,如: 技術部"  echo "--cn      設置FQDN或所有者名,如: 馮宇"  echo "--email     設置FQDN或所有者郵件,如: fengyu@example.com"}while [[ $# -gt 0 ]]do  case $1 in    -h|-/?|--help)      show_help      exit 0      ;;    --ou)      OU="${2}"      shift      ;;        --cn)      CN="${2}"            shift      ;;    --email)      emailAddress="${2}"            shift      ;;    --)      shift      break    ;;    *)      echo -e "Error: $0 invalid option '$1'/nTry '$0 --help' for more information./n" >&2      exit 1    ;;  esacshiftdone# 創建客戶端證書# 非交互式方式創建以下內容:# 國家名(2個字母的代號)C=CN# 省ST=Shannxi# 市L=Xian# 公司名O=My Company# 組織或部門名OU=${OU:-測試部門}# 服務器FQDN或授予者名CN=${CN:-demo}# 郵箱地址emailAddress=${emailAddress:-demo@example.com}mkdir -p "${CN}"[ ! -f "${CN}/${CN}.key" ] && openssl req -utf8 -nodes -newkey rsa:2048 -keyout "${CN}/${CN}.key" -new -days 36500 -out "${CN}/${CN}.csr" -subj "/C=${C}/ST=${ST}/L=${L}/O=${O}/OU=${OU}/CN=${CN}/emailAddress=${emailAddress}"[ ! -f "${CN}/${CN}.crt" ] && openssl ca -utf8 -batch -days 36500 -in "${CN}/${CN}.csr" -out "${CN}/${CN}.crt"[ ! -f "${CN}/${CN}.p12" ] && openssl pkcs12 -export -clcerts -CApath ./demoCA/ -inkey "${CN}/${CN}.key" -in "${CN}/${CN}.crt" -certfile "./demoCA/cacert.pem" -passout pass: -out "${CN}/${CN}.p12"

revoke_cert.sh

#!/bin/bash -e# 吊銷一個簽證過的證書openssl ca -revoke "${1}/${1}.crt"openssl ca -gencrl -out "./demoCA/private/ca.crl"

簡單分析一波腳本,首先是創建CA,對于Ubuntu系統來說,/etc/ssl/openssl.cnf配置中默認的CA路徑就是./demoCA,為了不改動默認配置,直接按照默認配置的內容創建這些目錄和文件即可。還有就是openssl子命令非常多,但是也和git一樣,可以合并命令,比如用一條命令同時生成私鑰和簽證請求openssl req -nodes -newkey rsa:2048 -keyout client.key -new -out client.csr,在req的同時就做了genrsa。由于創建CA腳本只是第一次運行需要,因此把證書配置直接寫死在腳本中就完事了。

接下來是創建客戶端證書,為了簡化用戶的使用,在服務端幫助用戶生成證書并簽證,把簽證過的證書下發給用戶就可以了。由于用戶可能是不同部門,不同姓名,不同郵件地址,因此將這三個參數外部化,做一下參數解析,加上友好的命令行提示防止遺忘。這個腳本特別注意最后一行,會生成一個PKCS12格式的證書。openssl默認產生的證書格式都是PEM的,會將公鑰和私鑰分開,但是瀏覽器導入的時候需要將這些內容合并起來形成證書鏈,所以需要將簽證過的證書和私鑰文件合并成一個PKCS12格式的證書,直接將這個.p12格式的證書交給用戶就可以了。

最后是吊銷證書了,當希望收回某個用戶的訪問權限時,直接運行這個腳本跟上目錄名就可以了。

接下來運行創建CA的腳本:

./create_ca_cert.sh

Generating a 2048 bit RSA private key.......................+++........................................................................................................+++writing new private key to './demoCA/private/cakey.pem'-----Using configuration from /usr/ssl/openssl.cnf

此時產生的./demoCA目錄結構如下:

demoCA/├── cacert.pem├── crlnumber├── crlnumber.old├── index.txt├── newcerts├── private│  ├── ca.crl│  └── cakey.pem└── serial2 directories, 7 files

此時就可以配置nginx了,在上面單向ssl的配置中,追加以下配置:

 ssl_client_certificate ssl_certs/demoCA/cacert.pem; ssl_crl ssl_certs/demoCA/private/ca.crl; ssl_verify_client on;

ssl_client_certificate就是客戶端證書的CA證書了,代表此CA簽發的證書都是可信的,ssl_verify_client on;代表強制啟用客戶端認證,非法客戶端(無證書,證書不可信)都會返回400錯。

特別注意ssl_crl這個配置,代表Nginx會讀取一個CRL(Certificate Revoke List)文件,之前說過,可能會有收回用戶權限的需求,因此我們必須有吊銷證書的功能,產生一個CRL文件讓Nginx知道哪些證書被吊銷了即可。

注意: Nginx配置都是靜態的,讀取配置文件之后都會加載到內存中,即使文件內容變化也不會重新讀取。因此當CRL文件發生變更之后,Nginx并不能意識到有新的證書被吊銷了,所以必須使用reload指令讓Nginx重新讀取配置文件: service nginx reloadnginx -s reload

此時重啟Nginx服務,就可以完成SSL雙向認證配置了。

我們簽發一個證書看看:

 ./create_client_cert.sh --ou 財務部 --cn 財務經理 --email cy@example.comGenerating a 2048 bit RSA private key................................+++.............................................................................+++writing new private key to '財務經理/財務經理.key'-----Using configuration from /usr/ssl/openssl.cnfCheck that the request matches the signatureSignature okCertificate Details:    Serial Number: 1 (0x1)    Validity      Not Before: Jun 14 16:03:46 2018 GMT      Not After : May 21 16:03:46 2118 GMT    Subject:      countryName        = CN      stateOrProvinceName    = Shannxi      organizationName     = My Company      organizationalUnitName  = /U8D22/U52A1/U90E8      commonName        = /U8D22/U52A1/U7ECF/U7406      emailAddress       = cy@example.com    X509v3 extensions:      X509v3 Basic Constraints:        CA:FALSE      Netscape Comment:        OpenSSL Generated Certificate      X509v3 Subject Key Identifier:        B5:91:0B:1F:FC:25:3B:2A:F9:EF:39:39:51:E3:1F:64:78:8A:C3:75      X509v3 Authority Key Identifier:        keyid:86:55:76:15:A3:F5:58:CB:8F:39:A3:56:8E:FF:18:97:AE:27:60:0FCertificate is to be certified until May 21 16:03:46 2118 GMT (36500 days)Write out database with 1 new entriesData Base Updatedtree 財務經理/財務經理/├── 財務經理.crt├── 財務經理.csr├── 財務經理.key└── 財務經理.p120 directories, 4 files

這個腳本生成了私鑰文件key,簽證請求文件csr,經過CA簽證后的證書文件crt(里面沒有私鑰),以及將crt文件和key進行bundle之后的PKCS12格式的證書文件p12,將p12文件下載到本地,雙擊一路Next導入證書即可。

注: 由于CA的證書文件不會發生變化,因此簽證新的客戶端證書不需要restart或reload nginx

這次打開我們的網站https://www.example.com,瀏覽器就會提示我們選擇一個已有的客戶端證書進行認證了,沒問題就可以看到網站內容了

注: 每次導入新的證書之后,必須重啟瀏覽器才能提示使用新的證書文件

按照這種方式,有多少人需要授權,就可以用這個腳本簽發多少個這樣的證書,用戶將p12證書導入本地就可以正常訪問網站了。

當我們需要收回某人的權限的時候(比如離職了),我們需要吊銷他的證書:

 ./revoke_cert.sh 財務經理

Using configuration from /usr/ssl/openssl.cnfRevoking Certificate 01.Data Base UpdatedUsing configuration from /usr/ssl/openssl.cnfservice nginx reload

這個腳本會自動吊銷他的簽證文件crt,并且自動更新CRL文件。特別注意需要reload或restart nginx才能讓nginx重新加載CRL。這樣被吊銷的證書將無法訪問網站了。

小結

本文我們通過Nginx配置SSL雙向認證實現對客戶端的加密認證,我們使用了簡易的腳本幫助我們快速生成各種證書與簽證,免除記憶繁瑣openssl命令行,簡化使用。

當然這只是一個最小可用集,當規模比較大的時候可能需要做很多改進,比如加入CA的web ui,直接可以操作簽證和吊銷證書,并且可以自動重啟nginx。

再比如CRL這種靜態配置文件不適合你的場景,希望的動態更新吊銷證書列表,那么可以考慮OCSP方案,這個Nginx也是支持的,通過ssl_stapling_responder配置指定一個OCSP地址,這樣將不需要每次吊銷證書的時候都去重啟nginx了,openssl也提供了ocsp服務端的功能,這里就不贅述了,可以自行查找相關資料。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久这里只有精品视频首页| 91免费人成网站在线观看18| 久久久精品视频成人| 国产成人欧美在线观看| 国产成人小视频在线观看| 日韩中文字幕久久| 日韩欧美在线视频观看| 成人羞羞国产免费| 欧美激情欧美狂野欧美精品| 欧美极品少妇xxxxⅹ免费视频| 亚洲精品自产拍| 欧美日韩一区二区三区| 久久全国免费视频| 麻豆国产va免费精品高清在线| 久久亚洲私人国产精品va| 国产精品日韩欧美大师| 欧美成人合集magnet| 国产精品综合久久久| 欧美巨猛xxxx猛交黑人97人| 福利视频第一区| 2021久久精品国产99国产精品| 国产午夜精品麻豆| 亚洲美女av网站| 国产精品视频1区| 成人久久精品视频| 午夜精品在线观看| 777精品视频| 国产精品免费一区二区三区都可以| 国产亚洲美女久久| 亚洲最大福利视频| 国产欧美最新羞羞视频在线观看| 欧美日韩中文在线观看| 久久久精品一区二区三区| 日韩视频在线观看免费| 日韩中文字幕免费| 国产免费一区二区三区香蕉精| 国产香蕉一区二区三区在线视频| 日韩免费不卡av| 91av国产在线| 91精品久久久久久久久中文字幕| 8050国产精品久久久久久| 懂色av中文一区二区三区天美| 国产一区二区成人| 国模私拍一区二区三区| 在线观看欧美视频| 成人免费直播live| 国产一区二区三区丝袜| 欧美激情精品久久久久久大尺度| 欧美高清在线视频观看不卡| 久久免费在线观看| 性色av一区二区三区免费| 色伦专区97中文字幕| 亚洲第一区在线观看| 亚洲成年人在线| 91久久中文字幕| 国产在线98福利播放视频| 91av在线不卡| 亚洲欧洲美洲在线综合| 亚洲二区在线播放视频| 国产精品久久久久免费a∨| 992tv在线成人免费观看| 中文字幕在线国产精品| 欧美俄罗斯性视频| 亚洲综合第一页| 尤物精品国产第一福利三区| 色悠久久久久综合先锋影音下载| 国产成+人+综合+亚洲欧洲| 日韩精品在线免费观看| 91精品在线影院| 一区二区三区四区精品| 伊人精品在线观看| 日韩av快播网址| 日韩在线小视频| 中文字幕精品www乱入免费视频| 久久激情视频久久| 国产精品美女免费看| 中文字幕欧美日韩va免费视频| 亚洲999一在线观看www| 亚洲丝袜在线视频| 国产精品第七十二页| 日韩一区二区久久久| 国产精品亚发布| 亚州成人av在线| 久久99久久亚洲国产| 国产日韩在线亚洲字幕中文| 亚洲日本欧美中文幕| 欧美精品性视频| 国产精品久久久久久久久影视| 91香蕉嫩草神马影院在线观看| 韩国视频理论视频久久| 91免费视频国产| 亚洲激情中文字幕| 国产在线播放不卡| 2018中文字幕一区二区三区| 超薄丝袜一区二区| 国产一区二区三区中文| 热久久免费国产视频| 红桃视频成人在线观看| 精品一区二区三区四区| 国产精品电影一区| www.亚洲人.com| 亚洲第一免费网站| 欧美裸体男粗大视频在线观看| 狠狠躁天天躁日日躁欧美| 国产mv久久久| 久久久久久国产精品三级玉女聊斋| 亚洲三级 欧美三级| 亚洲欧美国内爽妇网| 日韩极品精品视频免费观看| 亚洲精品美女久久久| 国产精品视频免费观看www| 操日韩av在线电影| 亚洲欧美日韩一区二区三区在线| 国产精品99一区| 精品国内产的精品视频在线观看| 亚洲欧美日韩久久久久久| 午夜精品久久久久久久99热| 国产精品久久久久影院日本| 欧美中文字幕在线播放| 久热99视频在线观看| 亚洲人成电影网| 91禁国产网站| 日韩欧美国产免费播放| 午夜免费久久久久| 国产精品久久久久久av福利软件| 成人黄色免费看| 欧美限制级电影在线观看| 久久影视电视剧凤归四时歌| 亚洲国产精品大全| 亚洲国产小视频| 日韩av在线不卡| 国产亚洲欧美日韩一区二区| 日韩精品久久久久久久玫瑰园| 亚洲三级黄色在线观看| 久久久999国产| 国产精品h片在线播放| 日韩国产欧美区| 亚洲成人网在线观看| 久久琪琪电影院| 国产成人av网| 伊人av综合网| 国产精品一区二区av影院萌芽| 亚洲午夜久久久久久久| 91综合免费在线| 97在线视频免费播放| 2020久久国产精品| 久久久久久久久久av| 国产精品久久久久7777婷婷| 日韩激情av在线播放| 久久国产精品久久国产精品| 国产精品福利在线观看| 欧美电影免费播放| 久久久久久亚洲精品中文字幕| 欧美精品videosex性欧美| 日本一区二区三区四区视频| 欧美黄色www| 992tv在线成人免费观看| 亚洲精品福利视频| 91在线高清免费观看| 中文字幕日韩av电影| 欧美日韩中文字幕| 国产69精品久久久久9| 日韩电视剧在线观看免费网站| 欧美区在线播放|