本文档指导您在 Apache 2.x HTTP 服务器上安装并配置 SSL 证书,关于 Apache 2.x 在各个平台上的安装不再涉及。

由于近年 OpenSSL 高危漏洞不断,因此强烈推荐您在开始配置之前首先升级 OpenSSL 到最新版本

# 确保 Apache SSL 模块开启


<span class="hljs-title">sudo</span> a2enmod ssl

# 配置 SSL 证书

完整的 SSL 证书分为四个部分:

  • CA 根证书 (root CA)
  • 中级证书 (Intermediate Certificate)
  • 域名证书
  • 证书密钥 (仅由您持有)

以 COMODO PositiveSSL 证书为例,您将收到四份文件:

  • 根证书 -
    AddTrustExternalCARoot.crt
  • 中级证书 -
    COMODORSAAddTrustCA.crt
  • 中级证书 -
    COMODORSADomainValidationSecureServerCA.crt
  • 您的域名证书 -
    example_com.crt

您要依照 中间证书 -> 根证书 的顺序串联为证书链,才能被绝大多数浏览器信任。使用

cat

命令串联证书:


<span class="hljs-title">cat</span> COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt &gt; ca-bundle.crt

得到

ca-bundle.crt

后,和证书文件

example_com.crt

,密钥文件

example_com.key

一同上传至服务器并保存在安全的位置,例如

/etc/ssl/private

目录下 (没有此目录请创建)。

# 修改 Apache 站点配置

下面是一份针对 Apache 2.4 的 SSL 部分配置


SSLEngine on
SSLCertificateFile    /etc/ssl/<span class="hljs-keyword">private</span>/example_com.crt
SSLCertificateKeyFile /etc/ssl/<span class="hljs-keyword">private</span>/example_com.key
SSLCertificateChainFile /etc/ssl/<span class="hljs-keyword">private</span>/ca-bundle.crt

以下为

&lt;VirtualHost&gt;

的详细配置


<span class="hljs-tag">&lt;VirtualHost *:443&gt;</span>
<span class="hljs-keyword"><span class="hljs-common">DocumentRoot</span></span> /var/www/
<span class="hljs-keyword">SSLEngine</span> <span class="hljs-literal">on</span>
<span class="hljs-keyword">SSLCertificateFile</span>    /etc/ssl/private/example_com.crt
<span class="hljs-keyword">SSLCertificateKeyFile</span> /etc/ssl/private/example_com.key
<span class="hljs-keyword">SSLCertificateChainFile</span> /etc/ssl/private/ca-bundle.crt
<span class="hljs-tag">&lt;/VirtualHost&gt;</span>

请注意如果您的 Apache2 版本大于 2.4.8,您可以将所有证书串联为一个文件作为

SSLCertificateFile

的值,而不必写

SSLCertificateChainFile

# 强制定向到 HTTPS

首先,我们需要确认 Apache 开启

mod_rewrite

模块,如果没有开启,请使用

sudo a2enmod rewrite

命令开启。

其次,你需要在站点配置文件中开启

AllowOverride

,这样

.htaccess

文件才会起作用。

开启并重启

Apache

后,复制一下代码到你目录的

.htaccess

文件


<span class="hljs-keyword"><span class="hljs-common">RewriteEngine</span></span> <span class="hljs-literal">On</span>
<span class="hljs-keyword"><span class="hljs-common">RewriteCond</span></span> <span class="hljs-cbracket">%{HTTPS}</span> <span class="hljs-literal">off</span>
<span class="hljs-keyword"><span class="hljs-common">RewriteRule</span></span> (.*) https://<span class="hljs-cbracket">%{HTTP_HOST}</span><span class="hljs-cbracket">%{REQUEST_URI}</span>

# SSL 安全配置

# 禁用压缩

<span class="hljs-title">SSLCompression</span> <span class="hljs-built_in">off</span>
# 禁用 SSLv2 和 SSLv3

<span class="hljs-keyword">SSLProtocol</span> <span class="hljs-literal">All</span> -SSLv2 -SSLv3
# 抵御 Poodle 和 SSL Downgrade 攻击

您需要支持

TLS-FALLBACK-SCSV

以自动开启此功能。下列 OpenSSL 版本包含对

TLS-FALLBACK-SCSV

的支持,Lighttpd 会自动启用此特性。

  • OpenSSL 1.0.1
    1.0.1j

    及之后的版本中支持

  • OpenSSL 1.0.0
    1.0.0o

    及之后的版本中支持

  • OpenSSL 0.9.8
    0.9.8zc

    及之后的版本中支持

# 加密和交换算法

一份推荐的配置:


<span class="hljs-constant">SSLCipherSuite</span> <span class="hljs-constant">EECDH</span>+<span class="hljs-constant">AESGCM</span><span class="hljs-symbol">:EDH+AESGCM</span><span class="hljs-symbol">:AES256+EECDH</span><span class="hljs-symbol">:AES256+EDH</span>

如果您需要兼容老式系统和浏览器 (Windows XP, IE6),请使用下面的:


<span class="hljs-constant">SSLCipherSuite</span> <span class="hljs-constant">EECDH</span>+<span class="hljs-constant">AESGCM</span><span class="hljs-symbol">:EDH+AESGCM</span><span class="hljs-symbol">:AES256+EECDH</span><span class="hljs-symbol">:ECDHE-RSA-AES128-SHA</span><span class="hljs-symbol">:DHE-RSA-AES128-GCM-SHA256</span><span class="hljs-symbol">:AES256+EDH</span><span class="hljs-symbol">:ECDHE-RSA-AES256-GCM-SHA384</span><span class="hljs-symbol">:ECDHE-RSA-AES128-GCM-SHA256</span><span class="hljs-symbol">:DHE-RSA-AES256-GCM-SHA384</span><span class="hljs-symbol">:ECDHE-RSA-AES256-SHA384</span><span class="hljs-symbol">:ECDHE-RSA-AES128-SHA256</span><span class="hljs-symbol">:ECDHE-RSA-AES256-SHA</span><span class="hljs-symbol">:DHE-RSA-AES256-SHA256</span><span class="hljs-symbol">:DHE-RSA-AES128-SHA256</span><span class="hljs-symbol">:DHE-RSA-AES256-SHA</span><span class="hljs-symbol">:DHE-RSA-AES128-SHA</span><span class="hljs-symbol">:ECDHE-RSA-DES-CBC3-SHA</span><span class="hljs-symbol">:EDH-RSA-DES-CBC3-SHA</span><span class="hljs-symbol">:AES256-GCM-SHA384</span><span class="hljs-symbol">:AES128-GCM-SHA256</span><span class="hljs-symbol">:AES256-SHA256</span><span class="hljs-symbol">:AES128-SHA256</span><span class="hljs-symbol">:AES256-SHA</span><span class="hljs-symbol">:AES128-SHA</span><span class="hljs-symbol">:DES-CBC3-SHA</span><span class="hljs-symbol">:HIGH</span><span class="hljs-symbol">:</span>!<span class="hljs-symbol">aNULL:</span>!<span class="hljs-symbol">eNULL:</span>!<span class="hljs-constant">EXPORT</span><span class="hljs-symbol">:</span>!<span class="hljs-constant">DES</span><span class="hljs-symbol">:</span>!<span class="hljs-constant">MD5</span><span class="hljs-symbol">:</span>!<span class="hljs-constant">PSK</span><span class="hljs-symbol">:</span>!<span class="hljs-constant">RC4</span>
# Forward Secrecy 和 DHE 参数

<span class="hljs-built_in">cd</span> /etc/ssl/certs
openssl dhparam -out dhparam.pem <span class="hljs-number">4096</span>

建议您使用性能强劲的平台生成此文件,例如最新版的至强物理机。如果您只有一台小型 VPS,请使用

openssl dhparam -out dhparam.pem 2048

命令生成 2048bit 的参数文件。

添加到配置文件:


<span class="hljs-title">SSLOpenSSLConfCmd</span> DHParameters <span class="hljs-string">"/etc/ssl/certs/dhparam.pem"</span>
# 启用 HSTS

添加到配置文件:


<span class="hljs-comment"># Optionally load the headers module:</span>
<span class="hljs-keyword"><span class="hljs-common">LoadModule</span></span> headers_module modules/mod_headers.so

<span class="hljs-tag">&lt;VirtualHost 67.89.123.45:443&gt;</span>
    <span class="hljs-keyword"><span class="hljs-common">Header</span></span> always set Strict-Transport-Security <span class="hljs-string">"max-age=63072000; includeSubdomains; preload"</span>
<span class="hljs-tag">&lt;/VirtualHost&gt;</span>

# 重启 Apache


<span class="hljs-title">sudo</span> service apache2 restart

您可能需要:

发表评论