引言

如果你刚刚建立了一个网站,还没有配置SSL证书,那么地址栏会显示类似http://xxx的地址,而左侧通常也会有连接不安全的字样。例如vocakey.info

file

网站不配置SSL证书自然是不安全的,但是配置SSL证书对新站长来说非常繁琐。
当然,网站不配置SSL也不是不能用。鉴于个人的小博客受到中间人攻击的概率也不是很大,通常懒狗站长会懒得配置SSL(比如之前的我)。

但是毕竟不使用SSL的http明文传输存在中间人攻击的风险,而且如今的各个浏览器都在千方百计地提示你SSL的重要性,搜索引擎也不会优先收录没有SSL的网站。所以为网站配置SSL显得越来越重要了。

以下是网站需要SSL证书的几个原因,转载自GDCA数安时代

  1. 防范黑客
    HTTP是一种文本协议,它在您的设备和您访问的网站之间发送信息。HTTPS是这个的安全版本。它对两个数据之间的信息进行加密,因此两个数据对之间发送的任何信息都会被置乱,使其几乎无法读取。
    这是必不可少的,如果你输入敏感的细节,如密码,或信用卡信息。但同样,它可以保护您免受中间人(MITM)攻击:这是指第三方(即黑客)正在拦截两个客户端之间的传输。
    你可能不认为这是个大问题。然而,如果没有加密,网络罪犯可以显示一个假网页。这个虚假网站上的链接可能会将恶意软件下载到您的计算机上。
    如果您安装SSL证书,您的读者将收到您希望他们阅读的消息。

  2. 你对用户更值得信赖
    毋庸置疑,读者信任一个安全的网站,而不是一个对他们的设备有害的网站。希望您总是通过检查URL来检查站点是否安全,尤其是电子商务页面。一些用户甚至会使用虚拟专用网(VPN)来确保保持良好的安全级别。
    几年前,知道SSL证书的人相对较少。现在,更多的人认识到这种安全的必要性。我们或许可以感谢谷歌提高了人们的认识。
    有了证书,你就向你的读者和客户发送了一条信息,向他们证明你是认真对待他们的。你认真对待他们的隐私。通过这样做,你在灌输自信。
    如果没有SSL证书,您将向您的读者挥舞红旗,这可能会使他们推迟将来的访问。

  3. Chrome可以正确显示您的站点
    任何试图访问没有SSL证书的站点的读者都会看到一个页面,提醒他们连接不是私有的。
    记住,Google Chrome是最流行的主流浏览器。人们喜欢它的界面,喜欢它的安全性。在Chrome的大部分时间里,它都会加载带有挂锁的加密页面,并显示绿色的“安全”信息。
    2018年,谷歌在这一问题上改变了立场。Chrome不会将HTTP视为站点的标准模式,而是希望HTTPS作为默认模式,并且只会不情愿地显示不安全的站点,即在警告用户它不安全之后。

  4. 改进的搜索引擎排名
    我们已经确定Chrome不会喜欢没有SSL的站点;作为搜索引擎的Google也不会。
    很多人依靠搜索引擎优化(SEO)在Google上获得更高的排名。但是搜索任何东西,第一页的绝大多数结果都有可能有HTTPS地址。询问任何搜索引擎优化专家,他们会告诉你,这是至关重要的网站上的前两页的结果。相对而言,很少有人能超越这一点。
    为了在竞争中保持领先地位,你所能做的任何事情(法律)都是至关重要的,尤其是通过优先考虑安全性。
    有了SSL证书,不仅读者会更信任你,搜索引擎也会信任你。这会产生更多的读者,你的博客越受欢迎,它在谷歌上的排名就越高!这是双赢的。

  5. 提高站点速度
    你的网站排名也部分取决于网站速度。你的网站越快,访问的人就越多,你在搜索结果中出现的次数也就越高。
    因此,使用HTTPS还可以提高页面的加载速度,这是一件好事——尽管你听说过。据说,添加SSL证书会拖慢网页速度。事实上,有一个完整的网站专门展示了HTTPS比HTTP快多少。
    但这不是全部事实。HTTP和HTTPS之间的差距很小,但后者通常是一个相对较新的协议,称为HTTP/2。而且HTTP/2确实比HTTP和标准HTTPS快。
    你会从提高的性能中受益,你的观众也会受益。如果用户知道快速加载的所有内容,他们就更有可能返回。

  6. 经得起未来考验
    网络的安全性在不断发展。SSL证书并不是抵御黑客的终极防御措施,但它们是一个良好的开端。因为SSL也发展起来了。
    具体来说,它正在升级到传输层安全性(TLS)。您可能已经看到SSL和TLS可以互换使用,但是有一些不同之处。由于更彻底的验证、更新的算法和更好的密钥生成,TLS更强大。这些身份验证发生在任何数据中继之前,因此发生的速度非常快。

无论大小,电子商务还是博客,都无所谓:每个网站都需要坚实的安全措施。
你真的不应该低估你的网站的影响力,也不应该低估你作为网站所有者的责任。同样,您不应该低估HTTPS地址的威力,也不应该低估整个加密的威力。它是互联网的重要组成部分。如果您还没有SSL证书,那么确实是时候获得SSL证书了。
file

什么是SSL证书?运行原理是什么?

这里可以看看大佬讲的:SSL证书原理讲解

还有Bilibili视频

SSL证书颁布机构为了验证你的身份,即你对域名的控制权,通常会使用两种方式中的一种验证:

  1. 写入网站目录验证
    申请证书时,你会被要求向网站某一路径写入一段随机字符,之后证书颁布机构会访问网址 + 路径来验证字符是否匹配之前的要求。如果匹配,就可以证明你确实有此网址的控制权。
  2. DNS验证
    申请证书时,你会被要求对申请证书的域名添加一条TXT记录的解析,内容为一段随机字符。之后证书颁布机构会访问此解析网址来验证是否匹配之前的要求。如果匹配,就可以证明你确实有此域名的控制权。

注意:方式1可以证明你对某一网站的控制权;而方式2可以证明你对某一域名的控制权,范围更广。所以申请泛域名解析只能使用方式2验证。

获取SSL证书

以下操作需要你有一个域名,并且可以解析域名。
需要有网站服务器Shell的执行权限。

为了在网站上启用 HTTPS,我们需要从证书颁发机构(CA)申请 SSL 证书。
我们选用可以免费获取证书的机构 Let's Encrypt 来申请一个泛域名证书。

更安全可靠的付费证书也不是不行,但是动辄成百上千,反正我是顶不住。

什么是Let's Encrypt?

Let's Encrypt, 是一个免费的、自动化的、开放的证书颁发机构。截至2018年9月,它的全球SSL证书市场份额已超过50%,得到主流浏览器和厂商的认可与支持。

一般的 SSL 安全证书签发服务都需要付费,且价格昂贵。为了加快推广 https 的普及, EEF 电子前哨基金会、 Mozilla 基金会和美国密歇根大学成立了一个公益组织叫 ISRG ( Internet Security Research Group ),这个组织从 2015 年开始推出了 Let’s Encrypt 免费证书。这个免费证书不仅免费,而且还相当好用。

Let's Encrypt证书提供免费的申请,但没有高额的安全保险,不具备点对点的技术支持,而且申请过程比较复杂,适合具有一定的专业知识的个人站长申请。并且每次申请到的SSL证书有效期只有90天,但是可以通过脚本实现提前自动续约达到自动化永久免费使用的目的。

在2018年5月,Let's Encrypt发布了免费泛域名通配符SSL证书 ,在HTTPS全面普及的当下,越来越多的开发者选择了Let's Encrypt证书。

什么是泛域名证书?

泛域名例如:*.mikumikumi.xyz。也就是这个证书可以给某个域名的所有二级域名使用,就叫做泛域名证书(也称作通配符证书)。

Let's Encrypt自2018年开始支持申请泛域名证书,相比于单域名证书,泛域名证书更利于日常的维护。

获取域名注册商DNS接口的Key和Secret

申请泛域名证书只能使用DNS验证方法。为了之后的自动申请泛域名证书,我们需要通过域名注册商的DNS接口来操作解析。各家的操作大同小异,我使用阿里云来获取。

  1. 登录阿里云控制台-RAM访问控制-用户,创建RAM用户以授权之后的自动申请脚本操作DNS接口。
    file
  2. 填写登录名称显示名称,方便记忆。勾选Open API调用访问。点击确定,随后会有安全验证,通过即可。
    file
  3. 创建成功,需要妥善保存 AccessKey IDAccessKey Secret ,如图,页面刷新或退出后将不再显示。点击下载CSV文件会得到包含 AccessKey IDAccessKey Secret 的文件,方便保存。随后选中用户,点击添加权限
    file
  4. 选择如图的4个权限即可。点击确定。
    file

直接使用主账号(阿里云控制台-用户信息管理-安全信息管理)的AccessKey ID和AccessKey Secret也可以操作接口,但是主账号能够操作阿里云账号下的全部资源,一旦泄露后果非常严重,所以建议使用RAM用户并限制其权限到最小。

使用acme.sh脚本自动申请证书

网上有很多使用certbot申请证书的例子。Certbot ACME客户端可以自动执行证书颁发和安装,无需停机。它还为不想要自动配置的人提供专家模式。它使用Python开发,易于使用,适用于许多操作系统,并且具有出色的文档。
但由于我的域名注册商是阿里云,似乎certbot并不支持操作阿里云的DNS接口,所以我使用支持阿里云DNS的acme.sh脚本来申请。

事后补充:我配置完之后得知certbot是可以操作阿里云dns,前提是安装certbot-dns-aliyun模块,运行命令pip install certbot-dns-aliyun即可安装。具体方法见使用 Certbot 自动申请并续订阿里云 DNS 免费泛域名证书

acme.sh是一个完全用Shell(Unix shell)语言编写的ACME协议客户端。完整的ACME协议实现。支持ACME v1和ACME v2 支持ACME v2通配符证书,简单,强大,也能实现自动证书颁发和安装。

acme.sh支持两种验证方式,详见Let's Encrypt免费泛域名SSL证书申请及自动续签

我这里进行泛域名解析,使用DNS接口验证。

  1. 获取并安装acme.sh,配置ID和Secret。
    普通用户会安装到 ~/.acme.sh/acme.sh ,root用户会安装到 /root/.acme.sh/acme.sh
    配置AccessKey ID 和 AccessKey Secret到环境变量,脚本通过环境变量获取ID和Secret。终端关闭后此环境变量会失效,不会泄露ID和Secret

    # 下载并运行acme.sh安装脚本。由于网络问题可能需要设置代理。
    curl https://get.acme.sh | sh
    source ~/.bashrc
    # 配置AccessKey ID 和 AccessKey Secret到环境变量。
    export Ali_Key="xxxxxx"
    export Ali_Secret="xxxxxx"
  2. 运行acme,开始申请证书。
    假定邮箱为me@domain.com,域名为mikumikumi.xyz
    此过程使用DNS验证方式,会自动操作你的域名解析,添加TXT解析以验证控制权。

    # 这里的 acme.sh 是安装后的位置,根据实际情况自行修改。
    acme.sh --server letsencrypt --register-account -m me@domain.com --issue --debug --dns dns_ali -d mikumikumi.xyz -d *.mikumikumi.xyz
  3. 等待片刻,即可成功申请到SSL证书。如果申请失败,详细查看日志,寻找问题。

生成的证书公钥私钥存放在~/.acme.sh/mikumikumi.xyz/下。
如果使用root用户,则存放在/root/.acme.sh/mikumikumi.xyz/下。注意不能直接使用此目录下的证书,原因见正确使用acme.sh签发的TLS证书

使用acme.sh的--installcert选项,并指定目标位置,然后证书文件会被安装到相应的位置。
例:

acme.sh \
--installcert -d mikumikumi.xyz \
--key-file /root/ssl_cert/mikumikumi.xyz/mikumikumi.xyz.key \
--fullchain-file /root/ssl_cert/mikumikumi.xyz/mikumikumi.xyz.cer \
--reloadcmd "systemctl reload nginx"
  • -d表示要操作的网站证书。
  • --key-file表示私钥文件要复制到的位置。
  • --fullchain-file表示包含完整证书链的公钥文件要复制到的位置。
  • --reloadcmd表示自定义的重新加载证书的命令。
    之后在nginx中使用安装后的证书文件即可。

此证书有效期为90天,而acme脚本会在证书到期前自动更新证书,所以无需手动更新证书。
acme的自动更新会创建计划任务。通过crontab -e即可查看。
自动更新会用到之前的AccessKey ID 和 AccessKey Secret来操作DNS接口,所以要一直保证RAM用户的权限正常。

目前由于 acme 协议和 Let's Encrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步。
手动升级 acme.sh 到最新版:
acme.sh --upgrade
如果你不想手动升级,可以开启自动升级:
acme.sh --upgrade --auto-upgrade
你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0

配置nginx

编辑 nginx 配置文件监听 443 端口,启用 SSL,并配置 SSL 的公钥、私钥证书路径:

server {
   listen        443 ssl;
   server_name   www.mikumikumi.xyz;
   root /var/www/;
   index  index.html index.htm index.php;

    ssl on;
    # 这里配置公钥私钥的路径
    ssl_certificate /root/ssl_cert/mikumikumi.xyz/mikumikumi.xyz.cer;
    ssl_certificate_key /root/ssl_cert/mikumikumi.xyz/mikumikumi.xyz.key;

    # ...
}

添加 HTTP 自动跳转到 HTTPS:

server {
    listen        80;
    server_name   www.mikumikumi.xyz;
    location / {
        rewrite ^(.*)$  https://$host$1 permanent;
    }
}

配置好之后,重启nginx:
sudo systemctl restart nginx.service

至此,网站的SSL证书就配置好了。


WordPress配置SSL后的一些小问题

配置完SSL证书并重启nginx之后,WordPress可能会出现排版混乱的问题,这是因为之前的网站大量使用了http链接,而在网站转换为https之后链接还是保持了http。

一个简单而有效的方法是在WordPress后台安装Better Search Replace插件,将数据库中所有表里的http://替换为https://。替换完毕后记得禁用插件以免降低性能。

参考:
https://blog.csdn.net/iua1024/article/details/122208703
https://cloud.tencent.com/developer/article/1500063
https://www.cnblogs.com/oboth-zl/p/14330854.html