Lighttpd 配置 SSL

本文档指导您在 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 命令串联中间证书、根证书:

cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ca-root.bundle.crt

然后将证书密钥 example_com.key 和域名证书 example_com.crt 合并

cat  example_com.key example_com.crt > example_com.pem

得到 root.bundle.crtexample_com.pem 后,将两者上传至服务器并保存在安全的位置,例如 /etc/ssl/private 目录下 (没有此目录请创建)。

# 修改 lighttpd 站点配置

下面是 lighttpd.conf 文件中关于 SSL 的部分配置

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

# 强制定向到 HTTPS

下面是 lighttpd.conf 文件中关于强制 HTTP 定向到 HTTPS 的部分配置

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

# Lighttpd 安全配置

# 禁用 SSL Compression (抵御 CRIME 攻击)
ssl.use-compression = "disable"
# 禁用 SSLv2 及 SSLv3
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
# 抵御 Poodle 和 SSL downgrade 攻击

您需要支持 TLS-FALLBACK-SCSV 以自动开启此功能。下列 OpenSSL 版本包含对 TLS-FALLBACK-SCSV 的支持,Lighttpd 会自动启用此特性。

  • OpenSSL 1.0.11.0.1j 及之后的版本中支持
  • OpenSSL 1.0.01.0.0o 及之后的版本中支持
  • OpenSSL 0.9.80.9.8zc 及之后的版本中支持
# 加密及交换算法

一份推荐的配置:

ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES128+EECDH:AES128+EDH"

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

ssl.cipher-list = "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"
# 配置 Forward Secrecy 和 DHE 参数

生成强 DHE 参数:

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

建议您使用性能强劲的平台生成此文件,例如最新版的至强物理机。如果您只有一台小型 VPS,请使用 openssl dhparam -out dhparam.pem 2048 命令生成 2048bit 的参数文件。

添加到 SSL 配置文件:

ssl.dh-file = "/etc/ssl/certs/dhparam.pem"
ssl.ec-curve = "secp384r1"
# 启用 HSTS
server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
}

# 重启 Lighttpd

sudo service lighttpd restart