wordpress-logo-stacked-rgb.png
wordpress-logo-stacked-rgb.png

貌似 2017 年 1 月 1 日起是 http 使用的最后期限,所有站点都纷纷开始使用 https 访问。我最近也使用了 acme.sh 进行相关站点的 https 证书处理。但是唯独某个使用 word­press 的站点老死无法生成证书,通过 acme 的 de­bug 模式可以看到服务器返回的是 403 访问拒绝的错误。

通过更换虚拟目录和手工配置验证文件等方法纠错依旧无解。我的主机配置是 ng­inx 的 PHP 方案。后来想了一下是否是 ng­inx 配置文件有问题。最终在看 wordpress 官方的 nginx rewrite 时发现了问题的端倪。原来在 Global re­stric­tions file 就是官方推荐的 rewrite 方案文件 word­press.conf 其中有一段:

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /\. {
    deny all;
}

因为 ssl 证书验证时候创建过程是要通过 web 方式访问站点根目录中的.well-known 目录中生成验证字符串文件。因此这行 rewrite 导致该目录无法被验证服务访问。但是奇怪的是通过手工创建的文件可以通过 http 访问(可能是我当时幻觉了╥﹏╥...)。

解决问题的方法很简单,就是将 ng­inx 配置文件目录中的 word­press.conf 里面找到上面那几行注释掉即可。

具体的设置可以参考 hrwhisper 的配置方法进行配置 Ng­inx 服务器,本机使用的配置文件是这样的,因为多个站点共用了证书生成路径,因此统一写成了 ssl-key.conf 文件进行配置。ssl.conf 文件请详细查看这里
nginx 站点的 vhost 配置文件

server {
        listen 443 ssl;
        server_name www.static.ezo.biz static.ezo.biz;
        charset     utf-8;
        index index.html index.htm index.php;
        root  /home/ccchen/www/static.ezo.biz;
        ssl_certificate /etc/letsencrypt/live/static.ezo.biz/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/static.ezo.biz/privkey.pem;
        include global/ssl.conf;

        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }

        location ~ .*\.php(\/.*)*$ {
            #root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

}
server {
    listen  80;
    server_name static.ezo.biz www.static.ezo.biz;
    include global/ssl-key.conf;
}

ssl-key.conf 文件

location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /home/ccchen/www/key;
}

location / {
    return 301 https://$server_name$request_uri;
}

BTW:如果日后使用 acme.sh 进行证书更新的时候切记使用下面的范例进行操作(注意路径):

acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/ccchen/www/key

其实 /home/​cc­chen/​www/​key 这个路径是所有站点都共用的,你可以自定义自己的路径,记得将改文件夹权限改为可读写。

如果你想独立管理每个站点的 ssl 证书的话,推荐查看这个文章,有介绍 ng­inx 1.6 + 后版本的 ssl 配置。

-EOF-