400 Bad Request The plain HTTP request was sent to HTTPS port

配置 https 的时候遇到这样一个问题,直接访问 https://www.domain.com 正常,访问 http://www.domain.com 报错:400 Bad Request The plain HTTP request was sent to HTTPS port。


nginx 配置如下:

server {
    listen 80 default_server;
    listen 443 default_server;

    ssl on;
    ssl_certificate /vagrant/cert/nginx.crt;
    ssl_certificate_key /vagrant/cert/nginx.key;
}

有两种解决方案:

server {
    listen 80 default_server;
    return 301 https://$host$request_uri;
}

server {
    listen 443 default_server;
    ssl on;
    ssl_certificate /vagrant/cert/nginx.crt;
    ssl_certificate_key /vagrant/cert/nginx.key;
}
server {
    listen 80 default_server;
    listen 443 ssl default_server;

    ssl_certificate /vagrant/cert/nginx.crt;
    ssl_certificate_key /vagrant/cert/nginx.key;

    if ($https != 'on') {
        return 301 https://$host$request_uri;
    }
}

299 total views, 1 views today

Let’s Encrypt

去年开始把博客升级成全站 https,用的是在阿里云申请的一年免费 WoSign 证书,原本准备等到期了再换的,但是最近博客被 Google 浏览器标记为不安全,所以不得不提前切换到 Let’s Encrypt 证书。


1. Let’s Encrypt 是什么?

想要在网站上启用 HTTPS 的话,你需要从证书颁发机构(CA)获取证书。Let’s Encrypt 就是一个免费的 CA。

2. 怎么申请 Let’s Encrypt 证书?

Let’s Encrypt 网站上面详细介绍了 With Shell Access 和 Without Shell Access 应该怎么申请证书,这里我们使用 Certbot。首先我们在服务器上安装 Certbot。

sudo apt install software-properties-common

sudo add-apt-repository ppa:certbot/certbot

sudo apt-get update

sudo apt-get install certbot

然后执行 certbot certonly,按照提示一步一步操作,证书就生成好了。

3. 配置 nginx 使用 Let’s Encrypt 证书。

在 /etc/letsencrypt/live/your.domain/ 目录下面找到你的证书文件,然后修改 nginx 配置文件。

ssl_certificate /etc/letsencrypt/live/tanghengzhi.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tanghengzhi.com/privkey.pem;

修改完成之后不要忘了重启 nginx。

sudo nginx -s reload

最后再打开浏览器验证一下。

4. 定期更新证书

Let’s Encrypt 证书的有效期为 90 天,所以每隔三个月就要重新申请一次证书。

certbot renew

参考:

https://letsencrypt.org/getting-started/

https://certbot.eff.org/

401 total views, 1 views today