Linux 配置 SSL 證書

完整的 SSL 證書分爲四個部分:

  • CA 根證書 (root CA)
  • 中級證書 (Intermediate Certificate)
  • 域名證書
  • 證書密鑰 (僅由您持有)

以 COMODO PositiveSSL 證書爲例,您將收到四份文件:html

  • 根證書 – AddTrustExternalCARoot.crt
  • 中級證書 – COMODORSAAddTrustCA.crt
  • 中級證書 – COMODORSADomainValidationSecureServerCA.crt
  • 您的域名證書 – example_com.crt

您要依照 域名證書 -> 中間證書 -> 根證書 的順序串聯爲證書鏈,才能被絕大多數瀏覽器信任。使用 cat 命令串聯證書:算法

cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com.bundle.crt

獲得 example_com.bundle.crt 後,和密鑰文件 example_com.key 一同上傳至服務器並保存在安全的位置,例如/etc/ssl/private 目錄下(沒有此目錄請建立)。瀏覽器

修改 NGINX 站點配置

下面是一份針對較新版本的 NGINX 的 SSL 部分配置,請將其添加到站點配置文件中 server 的部分,並根據註釋和您的需求修改。安全

listen 443 ssl;    # 偵聽端口
# listen [::]:443 ssl ipv6only=on;    # 若是您但願同時偵聽 IPv6,請取消此行註釋

server_name example.com;    # 請改成您的域名

ssl_certificate /etc/ssl/private/example_com.bundle.crt;    # 證書鏈
ssl_certificate_key /etc/ssl/private/example_com.key;    # 密鑰
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;    # 支持的協議,Windows XP 不支持
ssl_prefer_server_ciphers on;    # 啓用 Forward Secrecy
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+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

若是您但願至少支持一些老式瀏覽器,而且在可以使用 ECDHE 時儘量使用此算法,您可使用下面的配置:服務器

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+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";

或者使用最簡單的方案:session

ssl_ciphers "EECDH+aRSA+AES";

生成 DHE 參數

爲了不使用 OpenSSL 默認的 1024bit DHE 參數,咱們須要生成一份更強的參數文件:性能

cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096

建議您使用性能強勁的平臺生成此文件,例如最新版的至強物理機。若是您只有一臺小型 VPS,請使用 openssl dhparam -out dhparam.pem 2048 命令生成 2048bit 的參數文件。spa

完成後,在 SSL 配置下添加一行:code

ssl_dhparam /etc/ssl/certs/dhparam.pem;

啓用 HSTS

HTTP Strict Transport Security (HSTS) 可使瀏覽器第一次訪問您的站點後即記住僅經過 HTTPS 與您的站點通訊,能夠大大提高安全性。server

在 SSL 配置下添加:

add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

強制定向到 HTTPS

您須要一個單獨 server 配置用於偵聽 HTTP 80 端口,而後全部發送到這裏的請求定向到 HTTPS 協議。

server {
    listen 80;
    # listen [::]:80 ipv6only=on;    # 若是您須要同時偵聽 IPv6,請取消此行註釋
    server_name example.com;    # 您的域名

    location / {
        return 301 https://example.com$request_uri;    # 要重定向的地址,請將 example.com 改成您的域名
    }
}

或者使用 rewrite:

rewrite ^ https://example.com$request_uri? permanent;    # 請將 example.com 改成您的域名

一份完整樣例

這裏是基於 NGINX 1.4.6 的一份完整配置樣例。請根據您的需求修改使用。

server {
        listen 80;
        # listen [::]:80 ipv6only=on;
        server_name www.example.com;
        rewrite ^ https://www.example.com$request_uri? permanent;
}

server {
        listen 443 ssl;
        # listen [::]:443 ssl ipv6only=on;

        server_name www.example.com;

        ssl on;
        ssl_certificate /etc/ssl/private/www_example_com.crt;
        ssl_certificate_key /etc/ssl/private/www_example_com.key;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/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+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
        keepalive_timeout 70;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        add_header Strict-Transport-Security max-age=63072000;
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        root /var/www/example.com;
        index index.html;

        location / {
                try_files $uri $uri/ /index.html;
        }
}
相關文章
相關標籤/搜索