centos使用openssl生成自簽名SSL證書並配置到nginx


檢查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證書存在安全隱患,在生產環境上需要購買和使用經權威機構認證和辦法的證書。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM