Lighttpd启用HTTPS

证书来源

  1. 阿里云的免费证书,由Symantec提供,下载证书时没有Lighttpd这个服务器类型,所以选的类型是其他。

  2. 腾讯云的免费证书,由TrustAsia提供,也没有Lighttpd这个类型,但可使用Apache的证书。

合并证书

  1. 下载解压后的三个关键的文件:公钥和私钥及CA证书

  2. 阿里云的三个文件名类似这样:私钥:2143553x.key,公钥:2143553x.pem,CA证书:chain.pem。

  3. 腾讯云的三个文件名类似这样:私钥:3_xxx.cn.key,公钥:2_xxx.cn.crt,CA证书:1_root_bundle.crt。

  4. 合并私钥和公钥供lighttpd使用,cat 2143553x.key 2143553x.pem > server.pem

配置HTTPS

1
2
3
4
5
6
7
$SERVER["socket"] == ":443" {
ssl.engine = "enable" # 是否开启SSL
ssl.pemfile = "/etc/lighttpd/server.pem" # 合并后的私钥和公钥
ssl.ca-file = "/etc/lighttpd/chain.pem" # 证书信任链文件路径
server.document-root = "/var/www/" # 网站根目录
ssl.cipher-list = "ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE" # 配置加密方式
}
  1. 由于Lighttpd 1.x 版本不支持HTTP/2所以无法配置。
  2. 配置符合PFS规范的加密套件(关闭RC4加密和DHE等)。
  3. 以上配置经过 https://myssl.com/ 检测可获得 A 评级,开启HSTS后能够提升到A+。

其他配置

  1. 重定向所有http访问到https,该方法设置简单但存在可HTTPS降级攻击的问题,与配置HSTS二选一。
1
2
3
4
5
$SERVER["socket"] == ":80" {
$HTTP["host"] =~ ".*" {
url.redirect = ( ".*" => "https://%0$0" )
}
}
  1. 配置HSTS可以解决HTTPS降级攻击,但需要确保永远提供的是HTTPS服务,否则之前的老用户在max-age过期前都会重定向到HTTPS,造成不能通过HTTP正确访问域名的情况
1
2
3
4
5
server.modules += ( "mod_setenv" )

$HTTP["scheme"] == "https" {
setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=31536000; includeSubdomains; preload" )
}

问题解决

  1. 非信任机构生成的证书将浏览器将显示不安全,信任链CA证书是给我们颁发公私钥的机构的信任证书

  2. 证书合并时格式错误出现无法读取的问题

1
2
3
4
5
6
7
8
9
# 错误:SSL: couldn't read X509 certificate from '/etc/lighttpd/server.pem'
# 解决:合并后的证书格式应如下样式,否则lighttpd读取时会出错上面错误

-----BEGIN RSA PRIVATE KEY-----
......
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
......
-----END CERTIFICATE-----
  1. 配置HSTS中max-age的单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。

  2. 更强的SSL设置请参考 https://cipherli.st/ 提供的Lighttpd示例

  3. 更多配置请点这 官方介绍