本文档指导您在 lighttpd 1.4.x HTTP 服务器上安装并配置 SSL 证书,关于 lighttpd 1.4.x 在各个平台上的安装不再涉及。
由于近年 OpenSSL 高危漏洞不断,因此强烈推荐您在开始配置之前首先升级 OpenSSL 到最新版本

# 配置 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-root.bundle.crt

然后将证书密钥

example_com.key

和域名证书

example_com.crt

合并


<span class="hljs-title">cat</span>  example_com.key example_com.crt &gt; example_com.pem

得到

root.bundle.crt

example_com.pem

后,将两者上传至服务器并保存在安全的位置,例如

/etc/ssl/private

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

# 修改 lighttpd 站点配置

下面是

lighttpd.conf

文件中关于 SSL 的部分配置


<span class="hljs-variable">$SERVER</span>[<span class="hljs-string">"socket"</span>] == <span class="hljs-string">":443"</span> {
     ssl.engine = <span class="hljs-string">"enable"</span>
     ssl.pemfile = <span class="hljs-string">"/etc/ssl/private/example_com.bundle.pem"</span>
     ssl.ca-file = <span class="hljs-string">"/etc/ssl/private/ca-root.bundle.crt"</span>
     server.name = <span class="hljs-string">"example.com"</span>
     server.document-root = <span class="hljs-string">"/var/www"</span>
}

# 强制定向到 HTTPS

下面是

lighttpd.conf

文件中关于强制 HTTP 定向到 HTTPS 的部分配置


<span class="hljs-variable">$HTTP</span>[<span class="hljs-string">"scheme"</span>] == <span class="hljs-string">"http"</span> {
    <span class="hljs-comment"># capture vhost name with regex conditiona -&gt; %0 in redirect pattern</span>
    <span class="hljs-comment"># must be the most inner block to the redirect rule</span>
    <span class="hljs-variable">$HTTP</span>[<span class="hljs-string">"host"</span>] =~ <span class="hljs-string">".*"</span> {
        url.redirect = (<span class="hljs-string">".*"</span> =&gt; <span class="hljs-string">"https://<span class="hljs-variable">%0</span><span class="hljs-variable">$0</span>"</span>)
    }
}

# Lighttpd 安全配置

# 禁用 SSL Compression (抵御 CRIME 攻击)

ssl.<span class="hljs-keyword">use</span>-compression = <span class="hljs-string">"disable"</span>
# 禁用 SSLv2 及 SSLv3

ssl.<span class="hljs-keyword">use</span>-sslv2 = <span class="hljs-string">"disable"</span>
ssl.<span class="hljs-keyword">use</span>-sslv3 = <span class="hljs-string">"disable"</span>
# 抵御 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

    及之后的版本中支持

# 加密及交换算法

一份推荐的配置:


ssl.cipher-<span class="hljs-built_in">list</span> = <span class="hljs-string">"EECDH+AESGCM:EDH+AESGCM:AES128+EECDH:AES128+EDH"</span>

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


ssl.cipher-<span class="hljs-built_in">list</span> = <span class="hljs-string">"EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"</span>
# 配置 Forward Secrecy 和 DHE 参数

生成强 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 的参数文件。

添加到 SSL 配置文件:


<span class="hljs-keyword">ssl</span>.dh-file = <span class="hljs-string">"/etc/ssl/certs/dhparam.pem"</span>
<span class="hljs-keyword">ssl</span>.ec-curve = <span class="hljs-string">"secp384r1"</span>
# 启用 HSTS

server.modules += ( <span class="hljs-string">"mod_setenv"</span> )
<span class="hljs-variable">$HTTP</span>[<span class="hljs-string">"scheme"</span>] == <span class="hljs-string">"https"</span> {
    setenv.add-response-header  = ( <span class="hljs-string">"Strict-Transport-Security"</span> =&gt; <span class="hljs-string">"max-age=63072000; includeSubdomains; preload"</span>)
}

# 重启 Lighttpd


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

发表评论