Featured image of post 申请免费的SSL证书!

申请免费的SSL证书!

“你这SSL证书免费我肯定要啊”

前言

为了安全性,如今的网站大都使用https协议进行传输。虽然本小站没有什么安全性的顾虑,但是现在的浏览器(例如chrome)点开http站点时,就会有一个标志出现: 有强迫症的我可忍不了这个,于是我赶紧找方法实现本站的https访问

https是个啥?

首先了解一下到底什么是https。按照惯例,先从百度百科无耻地摘抄关于https的介绍:

HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面。

说了一堆看不懂的东西,简单来说https就是http+ssl协议的集合,利用ssl对http传输的内容进行加密,这里就需要ssl证书,终于轮到了本文的重点:如何申请免费的ssl证书?

方法一:阿里云内直接申请

第一个方法简单粗暴,在阿里云内能够直接申请到免费的ssl证书。在阿里云控制台内,点击“SSL证书-免费证书-立即购买”,就可以免费申请到单域名证书了,每个账户终身最多20张,对于一个小站来说是够用的

但是!问题来了!当我在构建remark42评论系统时,需要跳转到子域名上。然而此方法的证书只有单域名证书,这样的话访问子域名时浏览器会报证书不匹配的错误,于是我只能换另一种方法

方法二(推荐!):使用acme.sh申请

acme.sh是Github上的一个项目,它通过ACME协议自动从Let’s Encrypt(从2021年8月1日起,acme.sh默认使用ZeroSSL)上申请ssl证书,并且该项目还有贴心的中文文档,非常方便部署:

acme.sh中文文档

接下来还是详细说一下部署过程吧:

1. 安装 acme.sh

在需要安装证书的服务器上执行命令:

1
   curl  https://get.acme.sh | sh -s email=[email protected]

其中[email protected]替换为自己的电子邮件,因为申请ZeroSSL需要一个账号

2. 生成证书

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

  1. http验证

    http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了

    如果使用了nginx,可以直接执行一下命令:

    1
    
    acme.sh --issue  -d mydomain.com   --nginx
    

    在apache中使用命令:

    1
    
    acme.sh --issue  -d mydomain.com   --apache
    

    这种方法在验证后需要自己在nginx或apach的配置文件中手动配置ssl 2. dns验证

    dns 方式手动在域名上添加一条 txt 解析记录, 验证域名所有权。然而现在大多数域名解析商提供api(如大多数域名解析商),acme.sh可以使用 api 自动添加 txt 记录完成验证

    以阿里云为例:

    首先登录阿里云帐户以获取 API 密钥。 https://ak-console.aliyun.com/#/accesskey

    1
    2
    
    export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
    export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
    

    再运行以下命令办法证书:

    1
    
    acme.sh --issue --dns dns_ali -d example.com -d www.example.com
    

    更多api的支持可以点击这里

    如果需要注册泛域名证书/通配符证书或多域名证书,在命令后加-d *.example.com或加数个指定的域名即可(当时我没有注意,结果申请了好多次……)

3. 复制/安装证书

证书生成以后, 接下来需要把证书复制到指定位置

nginx使用以下命令:

1
2
3
4
    acme.sh --install-cert -d example.com \
    --key-file       /path/to/keyfile/in/nginx/key.pem  \
    --fullchain-file /path/to/fullchain/nginx/cert.pem \
    --reloadcmd     "service nginx force-reload"

apache使用以下命令:

1
2
3
4
5
   acme.sh --install-cert -d example.com \
   --cert-file      /path/to/certfile/in/apache/cert.pem  \
   --key-file       /path/to/keyfile/in/apache/key.pem  \
   --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
   --reloadcmd     "service apache2 force-reload"

nginx配置文件

无论使用哪种方法,最后要在nginx中配置server:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  example.com;
    root         /usr/share/nginx/html;

    ssl_certificate cert/cert.pem;
    ssl_certificate_key cert/key.pem;
    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; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;
}

后记

以上就是申请ssl证书的方法,小朋友们学废了吗?总之有脚本部署还是非常方便的,最重要的就是免费