nginx開啟更為安全的tls1.3
本文為原創文章,轉載請註明出處
隨著網際網路安全越來越受到重視,越來越多的網站選擇啟用https來保證資料的加密傳輸,TLS1.2釋出於2008年8月,至今正好有10年,所以新協議TLS1.3呼之欲出。Google chrome在最近的版本更新中也開始逐步對TLS1.3進行支援,TLS1.3對於TLS1.2有重大改寫,提高了安全性並且提高了速度,所以升級還是很有必要的,本文嘗試在nginx中開啟TLS1.3.
關於TLS1.3的科普可以看下面的頁面
https://wiki.openssl.org/index.php/TLS1.3
https://zhuanlan.zhihu.com/p/28850798
我這裡用的系統是Debian 8
第一步:安裝依賴
$ apt-get install git gcc make build-essential zlib1g-dev libpcre3-dev
第二步:下載原始碼和補丁
$ mkdir -p /usr/src
$ cd /usr/src
$ git clone git://git.openssl.org/openssl.git openssl
$ git clone https://github.com/hakasenyang/openssl-patch.git openssl-patch
$ git clone https://github.com/kn007/patch.git nginx-patch
$ wget https://nginx.org/download/nginx-1.15.0.tar.gz
$ tar zxvf ./nginx-1.15.0.tar.gz
第三步:打補丁
1,給OpenSSL打補丁,補丁的意義在於使OpenSSL支援最新的TLS1.3.
補丁地址:https://github.com/hakasenyang/openssl-patch
$ cd /usr/src/openssl
$ patch -p1 < ../openssl-patch/openssl-equal-pre8_ciphers.patch
2,給Nginx打補丁,nginx 補丁新增SPDY支援,新增HTTP2 HPACK編碼支援,新增動態TLS記錄支援
補丁地址:https://github.com/kn007/patch
fix_nginx_hpack_push_error 補丁修復nginx的http2 push和http2 hpack相容性問題
nginx_auto_using_PRIORITIZE_CHACHA 補丁新增在使用OpenSSL1.1.1時SSL_OP_PRIORITIZE_CHACHA的支援。
$ cd /usr/src/nginx-1.15.0
$ patch -p1 < ../nginx-patch/nginx.patch
$ patch -p1 < ../nginx-patch/fix_nginx_hpack_push_error.patch
$ patch -p1 < ../nginx-patch/nginx_auto_using_PRIORITIZE_CHACHA.patch
第四步:編譯安裝
$ ./configure \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-openssl=../openssl \
--with-http_v2_module \
--with-http_v2_hpack_enc \
--with-http_spdy_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
$ make
$ make install
Nginx的可執行檔案安裝在/usr/sbin/,Nginx配置檔案在/etc/nginx/裡
第五步:配置
1,修改Nginx全域性配置:
將以下內容填入:/etc/nginx/nginx.conf
worker_processes auto;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
use epoll;
multi_accept on;
worker_connections 1024;
}
http {
charset utf-8;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 2;
gzip_disable "msie6";
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
include /etc/nginx/vhost/*.conf;
}
2,修改Nginx站點配置
我們已經在全域性配置裡設定了包含/etc/nginx/vhost/目錄下的conf檔案
$ mkdir -p /etc/nginx/vhost
在然後/etc/nginx/vhost/裡建立站點配置,這裡統一用“域名”文字代替真實域名
server {
listen 80;
server_name 域名;
root /wwwroot/域名;
location / {
index index.html;
}
}
這樣HTTP的站點配置就弄好了,不過還站點還沒頁面,我們可以先把Nginx的歡迎頁面給放進去
mkdir -p /wwwroot/域名
$ cp /usr/local/nginx/html/index.html /wwwroot/域名/
$ nginx
啟動Nginx後HTTP頁面就正常了,開啟就能看到歡迎頁面。
第六步:簽發證照
配置HTTPS首先要有證照,我這裡是使用acme.sh自動頒發讓我們加密的證照
1,安裝工具:
apt-get install cron socat
2,獲取acme.sh:
curl https://get.acme.sh | sh
3,生成證照:
使用http方式驗證域名,這是我們先搭建HTTP站點的原因,接下來指定域名,指定站點目錄,開始簽發
acme.sh --issue -d 域名 --webroot /wwwroot/域名/ --keylength ec-256 --nginx
4,複製證照:
證照已經簽發,儲存在~/.acme.sh/裡
$ acme.sh --ecc --installcert -d 域名 \
--key-file /etc/nginx/ssl/域名.key \
--fullchain-file /etc/nginx/ssl/域名.cer \
--reloadcmd "nginx -s reload"
指定域名,指定證照儲存目錄,我這裡設定在/etc/nginx/ssl/,指定Nginx過載命令,如果簽發的不是ECC證照,把--ecc引數去掉
這樣使用acme.sh就完成了證照的簽發,如果證照快要過期了,指令碼會自動更新證照
指令碼自動更新,可以使用以下命令
$ acme.sh --upgrade --auto-upgrade
第七步:HTTPS站點配置
我給OpenSSL打的是pre8_ciphers補丁,所以配置檔案如下:
server {
listen 80;
server_name 域名;
return 301 https://域名$request_uri;
}
server {
listen 443 ssl http2;
server_name 域名;
root /wwwroot/域名;
ssl_certificate /etc/nginx/ssl/域名.cer;
ssl_certificate_key /etc/nginx/ssl/域名.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers [TLS13+AESGCM+AES128|TLS13+AESGCM+AES256|TLS13+CHACHA20]:[EECDH+ECDSA+AESGCM+AES128|EECDH+ECDSA+CHACHA20]:EECDH+ECDSA+AESGCM+AES256:EECDH+ECDSA+AES128+SHA:EECDH+ECDSA+AES256+SHA:[EECDH+aRSA+AESGCM+AES128|EECDH+aRSA+CHACHA20]:EECDH+aRSA+AESGCM+AES256:EECDH+aRSA+AES128+SHA:EECDH+aRSA+AES256+SHA:RSA+AES128+SHA:RSA+AES256+SHA:RSA+3DES;
ssl_ecdh_curve X25519:P-256:P-384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
index index.html;
http2_push /style.css;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 15d;
}
location ~ /.git/ {
deny all;
}
}
以上就是完整的站點配置檔案,覆蓋/etc/nginx/vhost/域名.conf後,使用nginx -s reload過載Nginx再開啟站點就能看到HTTPS的頁面了
驗證一下:
在Chrome 65或更新的版本中,開啟開發者工具的安全選單,就能在裡面看到站點是否以TLS1.3連線。
後記:隨著網路技術的發展,網路安全已經變得和我們的生活息息相關,我們需要新的技術來保護我們的隱私,而網站的站長更應該及時更新以保證使用者資料的私密性,所以各位站長趕快升級吧。
鄭重說明:利用本文做任何違法事情,與本人和合天智匯無關,資料僅供參考與學習。
相關文章
- charles 在只支援 tls1.3 的 nginx 情況下如何抓包?TLSNginx
- 安全帽識別為智慧工地開啟安全之門
- 為什麼 HTTPS 比 HTTP 更安全?HTTP
- nginx 開啟、關閉、重啟常用操作Nginx
- Ubuntu 18 LTS 下為 Nginx 站點開啟 HTTPS (Lets-Encrypt)UbuntuNginxHTTP
- 配置Nginx/Redis開機自啟NginxRedis
- 為什麼Podman執行容器更安全?
- 開啟Mac的桌布自動更換功能Mac
- 安裝nginx並安全地配置和啟動Nginx
- Windows 10 更新助手中的安全漏洞為黑客開啟大門Windows黑客
- 為什麼使用 HTTP 爬蟲代理更安全?HTTP爬蟲
- nginx指定埠開啟gzip壓縮Nginx
- HTTP與HTTPS:為什麼HTTPS比HTTP更安全?HTTP
- 如果雲更安全 為什麼還是被入侵?
- 為什麼我們需要更注重原始碼安全?原始碼
- PM2,Nginx,Shadowsocks 開機重啟Nginx
- 使用 Nginx Proxy Manager反向代理開啟SSLNginx
- Linux下Nginx安裝並開啟SSLLinuxNginx
- 雲上安全更輕鬆,華為雲網站安全解決方案網站
- 在 CentOS 下為 nginx 啟用 SSL_sendfile 支援CentOSNginx
- 墨菲安全正式釋出 murphysec 開源專案!讓開發者更安全的使用開原始碼原始碼
- OpenSSL支援TLS1.3特性前瞻TLS
- 為 Node.js 應用建立一個更安全的沙箱環境Node.js
- Nginx安全配置研究Nginx
- Nginx安全基線Nginx
- 更安全的Web通訊HTTPSWebHTTP
- 更安全的隨機數生成隨機
- Nginx-01-為什麼使用 Nginx? nginx 的優缺點Nginx
- 利用WinSW將Nginx 作為可正常啟動/停止的windows服務NginxWindows
- 設定開機自啟動nginx和httpdNginxhttpd
- nginx快取配置及開啟gzip壓縮Nginx快取
- nginx 加入到開機自動啟動Nginx
- [譯] WebAssembly中的記憶體(為什麼它比你想象的更安全)Web記憶體
- 愛立信:更智慧、更快速、更安全的“員工”的崛起
- Nginx學習系列三Nginx的啟動、停止、修改配置檔案後重啟Nginx
- 綠盟智慧礦山安全解決方案,助力智慧開採更安全
- 騰訊API安全公測重磅開啟,你的API安全嗎?API
- 智慧城市:如何設計的更安全?