檢查OpenSSL
檢查是否已經安裝openssl:
openssl version
一般在CentOS7上,openssl已經默認安裝好了。
生成自簽名的SSL證書和私鑰
第一步:生成私鑰
新建/etc/ssl/certs/www.ffcc.com目錄並進入,后執行命令:
openssl genrsa -des3 -out server.key 2048
輸入一個4位以上的密碼。
第二步:生成CSR(證書簽名請求)
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=mofei/OU=mofei/CN=www.ffcc.com"
subj參數說明如下:
字段 | 字段含義 | 示例 |
/C= | Country 國家 | CN |
/ST= | State or Province 省 | Zhejiang |
/L= | Location or City 城市 | Hangzhou |
/O= | Organization 組織或企業 | mofei |
/OU= | Organization Unit 部門 | mofei |
/CN= | Common Name 域名或IP | www.ffcc.com |
第三步:去除私鑰中的密碼
在第1步創建私鑰的過程中,由於必須要指定一個密碼。而這個密碼會帶來一個副作用,那就是在每次啟動Web服務器時,都會要求輸入密碼,
這顯然非常不方便。要刪除私鑰中的密碼,操作如下:
openssl rsa -in server.key -out server.key
第四步:生成自簽名SSL證書
# -days 證書有效期-天 openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
需要用到的證書文件為:server.crt 和 server.key
X.509證書包含三個文件:key,csr,crt。
key是服務器上的私鑰文件,用於對發送給客戶端數據的加密,以及對從客戶端接收到數據的解密
csr是證書簽名請求文件,用於提交給證書頒發機構(CA)對證書簽名
crt是由證書頒發機構(CA)簽名后的證書,或者是開發者自簽名的證書,包含證書持有人的信息,持有人的公鑰,以及簽署者的簽名等信息
備注:在密碼學中,X.509是一個標准,規范了公開秘鑰認證、證書吊銷列表、授權憑證、憑證路徑驗證算法等。
第五步:在nginx配置文件中配置使用ssl證書
user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; gzip on; server { listen 80; server_name www.ffcc.com; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443 ssl; keepalive_timeout 70; server_name www.ffcc.com; location / { proxy_pass http://127.0.0.1:65432/v2ui; proxy_redirect default; client_max_body_size 10m; #表示最大上傳10M,需要多大設置多大。 #設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Scheme $scheme; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } ssl_certificate /etc/ssl/certs/www.ffcc.com/server.crt; ssl_certificate_key /etc/ssl/certs/www.ffcc.com/server.key; #減少點擊劫持 add_header X-Frame-Options DENY; #禁止服務器自動解析資源類型 add_header X-Content-Type-Options nosniff; #防XSS攻擊 add_header X-Xss-Protection 1; #優先采取服務器算法 ssl_prefer_server_ciphers on; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; } }
但是這么做並不安全,默認是 SHA-1 形式,而現在主流的方案應該都避免 SHA-1,為了確保更強的安全性,我們可以采取迪菲-赫爾曼密鑰交換
首先,進入/etc/ssl/certs/www.ffcc.com目錄並生成一個dhparam.pem
openssl dhparam -out dhparam.pem 2048 # 如果你的機器性能足夠強大,可以用 4096 位加密
所以最終的配置如下:
user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name www.ffcc.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
keepalive_timeout 70;
server_name www.ffcc.com;
location / {
proxy_pass http://127.0.0.1:65432/v2ui;
proxy_redirect default;
client_max_body_size 10m; #表示最大上傳10M,需要多大設置多大。
#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Scheme $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
ssl_certificate /etc/ssl/certs/www.ffcc.com/server.crt;
ssl_certificate_key /etc/ssl/certs/www.ffcc.com/server.key;
#減少點擊劫持
add_header X-Frame-Options DENY;
#禁止服務器自動解析資源類型
add_header X-Content-Type-Options nosniff;
#防XSS攻擊
add_header X-Xss-Protection 1;
#優先采取服務器算法
ssl_prefer_server_ciphers on;
#使用DH文件
ssl_dhparam /etc/ssl/certs/www.ffcc.ml/dhparam.pem;
#協議
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#加密方式
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+a
RSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
}
注意
自簽名的SSL證書存在安全隱患,在生產環境上需要購買和使用經權威機構認證和辦法的證書。