拿到域名后第一件事当然是给自己的博客开启https啦~
(中间踩了许多坑导致弄了一上午才弄好)

1. 服务器配置

我的服务器配置如下:

/*系统信息*/
Distributor ID:    Debian
Description:    Debian GNU/Linux 9.8 (stretch)
Release:    9.8
Codename:    stretch

/*硬件信息*/
阿里云学生机
CPU:1核
内存:2G
硬盘:40G SSD

/*环境信息*/
LNMP环境

2. 获取 SSL 证书

我使用的是 Let's Encrype 的证书。

2.1 Let's Encrype 简介

Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。 ——Wiki

官网:https://letsencrypt.org/

2.2 acme.sh 简介

简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。
acme.sh 有以下特点:

  • 一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端。
  • 完整的ACME协议实施。 支持ACME v1和ACME v2 支持ACME v2通配符证书
  • 简单,功能强大且易于使用。你只需要3分钟就可以学习它。
  • Let's Encrypt免费证书客户端最简单的shell脚本。
  • 纯粹用Shell编写,不依赖于python或官方的Let's Encrypt客户端。
  • 只需一个脚本即可自动颁发,续订和安装证书。 不需要root/sudoer访问权限。
  • 支持在Docker内使用,支持IPv6

2.3 安装 acme.sh

安装很简单,只需一条指令即可:

curl  https://get.acme.sh | sh

2.4 配置 acme.sh

普通用户和 root 用户都可以安装使用。
安装过程进行了以下几步:

  1. 把 acme.sh 安装到你的 home 目录下:~/.acme.sh/
  2. 创建一个 bash 的 alias, 方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
echo 'alias acme.sh=~/.acme.sh/acme.sh' >>/etc/profile
```

3. 安装过程中会自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

PS: 在该脚本的安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

###2.5 申请证书

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。

####2.5.1 HTTP方式
http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
```bash
acme.sh --issue -d clsn.io -d *.clsn.io --webroot /www/wwwroot/clsn.io/
```
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用。

#####Apache服务器
如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:
```bash
acme.sh --issue  -d clsn.io   --clsn.io
```

#####Nginx服务器
如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:
```bash
acme.sh --issue -d *.domineto.top --nginx
```

#####无 web 服务器
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证:
```bash
acme.sh --issue -d clsn.io --standalone
```

#####更高级的用法
更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert

####2.5.2 DNS方式

这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。
这种方式的缺点是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

#####一般方法
一般的方法就参考下面的链接或原文吧(主要是我没用这种方法,嫌它费时)。
https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode

#####dns 方式API
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。

具体的去原文或下面的链接里面找吧。这里我介绍一下我用阿里云的 API 获得泛解析证书的过程吧。

#####获取泛域名证书

######1.环境准备
安装必要的环境依赖:
```bash
apt-get update && \
    apt-get install curl -y && \
    apt-get install cron -y && \
    apt-get install socat -y
```

######2.导入阿里云的Access Key ID和Access Key Secret到环境变量中

阿里云的Access Key ID和Access Key Secret可以在下面这个页面中登录获取:
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fak-console.aliyun.com%2F%3Fspm%3D5176.2020520001.0.0.0EJtVx#/accesskey

接着再在服务器中输入一下指令导入 ID 和 Secret :
```bash
export Ali_Key="your Key"
export Ali_Secret="your Secret"
```

######3.申请泛域名证书
运行以下指令来生成证书:

```bash
acme.sh --issue --dns dns_ali -d *.domineto.top
```

####更详细的 API 用法
更详细的 api 用法:
https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

##3. 使用证书
###3.1 下载证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。

> **注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件,**

例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件.
这里面的文件都是内部使用, 而且目录结构可能会变化.
正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

```bash
acme.sh  --installcert  -d  <domain>.com   \
        --key-file   /etc/nginx/ssl/<domain>.key \
        --fullchain-file /etc/nginx/ssl/fullchain.cer \
        --reloadcmd  "service nginx force-reload"
```

###3.2 Nginx服务器安装SSL证书

以Nginx标准配置为例,生成的证书文件推荐使用 fullchain.cer,私钥文件为是domineto.top.key。

通过上述中生成的证书路径为/etc/nginx/ssl/www\.domineto.top/;
修改配置文件:
(这里贴一份我的配置文件做参考吧)
```
server {
     listen 443 ssl default_server;
     listen [::]:443 ssl default_server;
    

     ssl on;
     ssl_certificate /etc/nginx/ssl/www.domineto.top/fullchain.cer;
     ssl_certificate_key /etc/nginx/ssl/www.domineto.top/domineto.top.key;
     ssl_session_timeout 5m;
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_prefer_server_ciphers on;


    root /var/www/html;

    index index.php index.html index.htm index.nginx-debian.html;

    server_name domineto.top www.domineto.top;

          if ($host ~ '^domineto.top'){
            return 301 https://blog.domineto.top$request_uri;
    }

    location / {
                if (-f $request_filename/index.html){
                rewrite (.*) $1/index.html break;
                }
                if (-f $request_filename/index.php){
                    rewrite (.*) $1/index.php;
                }
                if (!-f $request_filename){
                    rewrite (.*) /index.php;
                }
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
    
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }

    
    location ~ /\.ht {
        deny all;
    }
}


server {
    listen 80;
    listen [::]:80;

    server_name domineto.top www.domneto.top;

    add_header Strict-Transport-Security max-age=15768000;

        return 301 https://blog.domineto.top$request_uri;

}

```

然后重启 Nginx :
```
systemctl force-reload nginx.service
//听说这里一定要用 force-reload,我用restart似乎是一样的
```

##4.证书更新
###4.1 证书的更新
目前证书在 60 天以后会通过定时任务自动更新, 你无需任何操作。
今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

###4.2 acme.sh 更新
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.

升级 acme.sh 到最新版 :
```bash
acme.sh --upgrade
```

如果你不想手动升级, 可以开启自动升级:
```bash
acme.sh  --upgrade  --auto-upgrade
```
之后, acme.sh 就会自动保持更新了.

你也可以随时关闭自动更新:
```bash
acme.sh --upgrade  --auto-upgrade  0
```

##5.Typecho设置
###5.1 修改站点地址
操作如下:

1. 登录Typecho后台
2. 点击设置中的基本设置
3. 将站点地址改为https的地址

###5.2 修改Config.inc.php配置
在站点根目录下的config.inc.php文件中加入下面的配置,否则网站后台还是会调用HTTP资源

```
/** 开启HTTPS */
define('__TYPECHO_SECURE__',true);
```

###5.3 修改评论配置
由于这一步我并没有碰到,所以我就搬运一下网上的吧。(可能我的主题自动支持了https?)
找到站点主题目录下的comments.php文件,并搜索$this->commentUrl(),将其替换为:
```
echo str_replace("http","https",$this->commentUrl());
```
如果这一步没有设置,博客可能无法提交评论.

###5.4 其他配置
如果这时候Chrome还没有给小绿锁的话,可以按下F12查看哪些资源调用的还是http协议。把所有调用http协议的资源改成https就好了。

##6.一些问题
在 Nginx 配置的时候我最开始是让一个 server 监听了两个端口,然后分别执行两种功能。这就导致了一些BUG的产生。所以我开了另一个 server 来监听80端口,然后重定向到 https 的 URL。具体参考我上面的配置吧。

##7.参考资料:
https://m.aliyun.com/yunqi/articles/674835
作者:惨绿少年
出处:http://clsn.io
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
最后修改:2021 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏