使用 lighttpd 和 wordpress 进行加密

使用 lighttpd 和 wordpress 进行加密

我正在尝试let's encrypt实现并certbot使用lighttpdCentOS 6

这是我的主机的完整配置文件

$SERVER["socket"] == ":443" {
  ssl.engine = "enable"
  ssl.pemfile = "/etc/letsencrypt/live/mysite.com/web.pem"
  ssl.ca-file = "/etc/letsencrypt/live/mysite.com/chain.pem"
  server.name = "mysite.com"
  server.document-root = "/home/mysite/public_html"
  server.errorlog = "/var/log/lighttpd/mysite.com_error.log"
  accesslog.filename = "/var/log/lighttpd/mysite.com_access.log"
  ssl.cipher-list = "ECDHE-RSA-CHACHA20-POLY1305 ECDHE-ECDSA-CHACHA20-POLY1305 AES128+EECDH:AES128+EDH:!aNULL:!eNULL"
  ssl.honor-cipher-order = "enable"
  ssl.disable-client-renegotiation = "enable"
  ssl.use-sslv2= "disable"
  ssl.use-sslv3 = "disable"
}

$HTTP["scheme"] == "http" {
  $HTTP["host"] =~ "^(www.)?mysite.com$" {
    server_name = "mysite.com"

    server.document-root = "/home/mysite/public_html"
    accesslog.filename = "/home/mysite/logs/access.log"

    fastcgi.server = ( ".php" =>
      ( "localhost" =>
        (
            "socket" => "/var/run/lighttpd/php-fpm.socket.mysite"
        )
      )
    )

    url.rewrite-once = (

      # Exclude some directories from rewriting
      "^/(\.well-known|wp-admin|wp-includes|wp-content|phpmyadmin)/(.*)" => "$0",

      # Exclude .php files at root from rewriting
      "^/(.*.php)" => "$0",

      # Handle search correctly
      "^/(.*)?(?s=)(.*)$" => "/search/$3",

      # Handle permalinks and feeds
      "^/(.*)$" => "/index.php/$1",

      "^/?$" => "/index.php",

    )


    alias.url = ("/phpmyadmin" => "/usr/share/phpmyadmin/")

  }
}

所以我遇到的第一个问题是,当我尝试访问时,https:// mysite.com我得到的内容没有图像和样式,所以这是一个 URL 重写问题,但我没有看到 https 已启用。浏览器仍然会警告我网站不安全。

第二个问题是当我添加时url.redirect = (".*" => "https://%0$0")出现太多重定向错误。

所以我很困惑。我认为问题可能出在重写上,但奇怪的是我甚至没有启用 https。

PS 是的,我在certbot这一切之前就收到了成功的消息。

解决方案就是安装 WP 插件,它会将我所有的 http 链接转换为图像,并将样式转换为 https,现在它可以正常工作了。@mrkoopie 的回答帮助我以这种方式思考解决方案,所以我接受了它。

答案1

好消息是,如果您通过 HTTPS 访问网站时没有出现证书错误,则您的服务器配置正确。坏消息是,您的网站配置不正确。

实际情况是 HTML 内容通过 HTTPS 加载。到目前为止,一切都很好,也很安全。但问题在于,HTML 内容所引用的对象(例如图像、css 和 js)是通过 HTTP 而不是 HTTPS 引用的。这很糟糕,因为当 HTML 代码通过 HTTPS 加载时,浏览器不会下载任何未加密的文件。

要解决此问题,请确保您的网站引用每个文件时都使用 HTTPS。在 WordPress 中,这可以轻松完成,但是您没有提供您使用的是什么系统,并且每个系统的情况都不同。

那么,当 HTML 代码通过 HTTPS 加载时,为什么通过 HTTP 加载对象是不好的呢?事实上,您使用 HTTPS 意味着您希望安全地加载内容。主要目的是确保没有人能够更改或查看内容。如果您通过 HTTP 加载任何对象,它很容易受到恶意注入的攻击,任何人都可以看到正在加载的内容(假设他们可以获得您的流量)。由于这会大大降低安全性,因此当 HTML 内容通过 HTTPS 加载时,浏览器会忽略 HTTP 引用的任何对象。配置您的服务器以将 http 流量重定向到 https 是行不通的,因为浏览器无论如何都不会尝试加载对象。

希望这可以帮助。

答案2

笔记:

  1. CentOS 7 和 8 的 lighttpd 使用不同的 lighttpd 配置文件结构(conf.d目录和modules.conf)。

  2. CentOS 6 具有旧版 OpenSSL,由于 OpenSSL 安全漏洞,该版本无法正常工作。您可能需要将服务器升级到 CentOS7/8 并使用最新的 OpenSSL 来支持 TLS 1.3 版本。

  3. 确保您已经在 CentOS 7/8 Linux 服务器上安装了 lighttpd 和 certbot,并且最新版本如下所列(截至 2021 年 1 月)。

    lighttpd/1.4.55 (ssl) 
    OpenSSL 1.1.1g FIPS  21 Apr 2020
    certbot 1.11.0
    

以下是与 lighttpd、Wordpress 和 certbot 配合良好的更新详细信息:

  1. 在你的 Linux 中,运行:

    openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
    
  2. 启用/添加mod_opensslmod_setenvserver.modules/etc/lighttpd/modules.conf

  3. 跑步

    certbot certonly --webroot -w /home/website -d domain.com
    

    (将 domain.com 替换为您的域名)

    输出:

    IMPORTANT NOTES:
    - Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/domain.com/fullchain.pem
    
    Your key file has been saved at:
    /etc/letsencrypt/live/domain.com/privkey.pem
    
    Your cert will expire on 2021-01-16. To obtain a new or tweaked
    version of this certificate in the future, simply run certbot
    again. To non-interactively renew *all* of your certificates, run
    certbot renew
    
  4. 添加

    certbot renew 
    

    到 cronjob 并每月运行一次。

  5. lighttpd.confSSL指令

    $HTTP["host"] =~ "domain\.com$" {
    
       server.document-root = "/home/website"
    
       url.rewrite = (
           "^/(.*)\.(.+)$" => "$0",
           "^/(phpMyAdmin)/?(.*)" => "$0",
           "^/(.+)/?$" => "/index.php/$1"
       )
    
       url.access-deny = ( "~", "xmlrpc.php")
       server.error-handler-404 = "/index.php"
       dir-listing.activate       = "disable"
    }
    
    $SERVER["socket"] == ":80" {
            $HTTP["host"] =~ "(.*)" {
                    url.redirect = ( "^/(.*)" => "https://%1/$1" )
            }
    }
    
    
    $SERVER["socket"] == "0.0.0.0:443" {
            ssl.engine   = "enable"
            ssl.disable-client-renegotiation = "enable"
    
            ssl.privkey = "/etc/letsencrypt/live/domain.com/privkey.pem"
            ssl.pemfile = "/etc/letsencrypt/live/domain.com/fullchain.pem"
    
      $HTTP["host"] =~ "domain\.com$" {
            ssl.privkey = "/etc/letsencrypt/live/domain.com/privkey.pem"
            ssl.pemfile = "/etc/letsencrypt/live/domain.com/fullchain.pem"
      }
    
            ssl.dh-file = "/etc/ssl/certs/dhparam.pem"
    
      # ECDH/ECDHE ciphers curve strength
            ssl.ec-curve            = "secp384r1"
            ssl.use-compression     = "disable"
    
      # Environment flag for HTTPS enabled
      setenv.add-environment = (
               "HTTPS" => "on"
      )
    
    
      ssl.use-sslv2 = "disable"
      ssl.use-sslv3 = "disable"
      ssl.openssl.ssl-conf-cmd = ("Protocol" => "-TLSv1.1, -TLSv1, -SSLv3")
      ssl.honor-cipher-order    = "disable"
      ssl.cipher-list = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    :ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
    
      # HSTS(15768000 seconds = 6 months)
    
      $HTTP["scheme"] == "https" {
            setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; ")
      }
    
    
      $HTTP["host"] =~ "domain\.com$" {
    
         url.rewrite = (
            "^/(.*)\.(.+)$" => "$0",
            "^/(phpMyAdmin)/?(.*)" => "$0",
            "^/(.+)/?$" => "/index.php/$1"
         )
    
         url.access-deny = ( "~", "xmlrpc.php")
         server.error-handler-404 = "/index.php"
         dir-listing.activate       = "disable"
    
      }
    
    }
    ## end zone - $SERVER["socket"] == "0.0.0.0:443"
    

    然后重新启动你的lighttpd服务器。

SSL 服务器测试 https://www.ssllabs.com/ssltest/index.html 并输入您的域名。上面的 SSL 指令将使您的网站在 SSL 测试中获得 A+ 分数。

相关内容