需求:管理後臺登錄限制,只允許在職人員登錄,離職人員無法登錄。
解決方案:nginx配置ssl雙向驗證
環境 : ubuntu 14.04 openssl位置 : /etc/ssl/openssl.conf nginx版本 : 1.8.0 nginx ssl目錄 : /etc/nginx/admin
1、使用openssl實現證書中心
(1)編輯證書中心配置文件(/etc/ssl/openssl.conf)
dir = /etc/ssl
(2)創建newcerts 目錄
mkdir -p /etc/ssl/newcerts
(3)創建證書私鑰
cd /etc/ssl ## 寫入初始證書序號,爲4個HEX字符 echo 12A8 > serial ## 生成證書數據庫 touch index.txt ## 生成crlnumber 爲了註銷用戶 ## echo 12A8 > crlnumber cd /etc/ssl/private openssl genrsa -out cakey.pem 2048
(4)生成自簽證書
cd /etc/ssl/ openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
2、創建服務器證書
mkdir -p /etc/nginx/admin cd /etc/nginx/admin openssl genrsa -out nginx.key 1024 openssl req -new -key nginx.key -out nginx.csr openssl ca -in nginx.csr -out nginx.crt -days 3650 openssl ca -gencrl -crldays 7 -out ca.crl # 產生crl文件,供吊銷證書使用
3、創建客戶端瀏覽器證書(例如創建用戶:李雷)
mkdir -p /etc/nginx/admin/user/lilei #創建李雷證書存放目錄 cd /etc/nginx/admin/user/lilei openssl genrsa -out lilei.key 1024 openssl req -new -key lilei.key -out lilei.csr openssl ca -in lilei.csr -out lilei.crt -days 3650 # 將文本格式的證書轉換成可以導入瀏覽器的證書 openssl pkcs12 -export -clcerts -in lilei.crt -inkey lilei.key -out lilei.p12
4、配置Nginx服務器驗證
ssl on; ssl_certificate /etc/nginx/admin/nginx.crt; ssl_certificate_key /etc/nginx/admin/nginx.key; ssl_client_certificate /etc/ssl/cacert.pem; ssl_session_timeout 5m; ssl_verify_client on; #開戶客戶端證書驗證 ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; ssl_crl /etc/nginx/admin/ca.crl; #啓用吊銷證書檢查
5、撤銷用戶證書
cd /etc/ssl/ grep "lilei" index.txt 類似如下 V 250817084430Z 12AC unknown /C=CN/ST=FUJIAN/O=xxx/OU=xxxx/CN=xxxxx/emailAddress=xxxxx 可得 值爲12AC cd /etc/ssl/newcerts openssl ca -revoke 12AC.pem ##完成註銷
然後查看index.txt 可以看到V變成R
必須注意的一點是,必須更新此文件,不然撤銷證書後依然能通過驗證。另外我們設置crl文件過期時間爲7天,如果7天后,我們未更新crl文件,nginx服務器將拒絕所有證書匹配。故我們還應開啓crontab,定期更新crl文件
定時任務腳本如下:
#!/bin/sh NGINX_SSL_PATH=/etc/nginx/admin cd $NGINX_SSL_PATH openssl ca -gencrl -crldays 7 -out ca.crl DATE_NOW1=$(/bin/date +%Y-%m-%d\ %H:%M:%S) echo "$DATE_NOW1 has success updata" >> /home/cron/updata_cakey.log /etc/init.d/nginx reload