在 Debian 上给 Nginx 配置 CA 证书及配置 HTTPS 教程
in 技术 with 0 comment

在 Debian 上给 Nginx 配置 CA 证书及配置 HTTPS 教程

in 技术 with 0 comment

其实我以前一直都不太明白,为什么别人的博客基本上都写了 关于如何注册 CA 证书 或者是 全站HTTPS 之类的博文,当时也不很清楚这东西的重要性,直到现在我打算给自己的博客加上 HTTPS 加密。。。

TIM截图20171209235940.png

呐,就是上图显示的“安全”的图标,有了这个图标就表示,网站正在对你的网页传输进行加密,就可以防止第三方对你上网的内容进行监听

其实还可以防止被墙来着,虽然我这博客也没什么被墙的必要啦。。

OK,那么前话就不多说,现在就放教程吧:


准备及前提

开始

在这里我们打算使用一款 Linux 上的自动获取 CA 证书的软件:Certbot

Let's Encrypt 作为新的证书颁发机构,免费,自动,开放,这三点对于个人用户来说尤为重要。免费自不用说,自动更是免去了很多过程和麻烦。

官网目前推荐的获取和安装方式是 certbot ,只需要简单运行一些命令并作一些配置即可。

先上一下官网地址以示感谢吧:
https://certbot.eff.org/
https://github.com/certbot/certbot

还有关于 Nginx 由 http 改 https 也并不复杂,需要修改一下你的网页配置文件就好了。

CA 证书获取

安装 Certbot

这一步其实在其他的 Linux 机器上本来需要配置环境,下载依赖包等等操作,但是在 Debian 上,有了 apt 是真的可以为所欲为的

apt install certbot

一行就搞定所有的安装操作了。

TIM截图20171210003030.png

找到网站配置文件

为了成功验证你的申请的证书的域名指的是你的服务器,首先你需要打开你的网页配置文件进行配置。

具体是哪个文件要看你在配置 Nginx 的时候是在哪个文件输入的网页配置信息。

因为 Nginx 的配置文件的内容很多都是 互相继承 的,所以造成了很多教程在 “把配置信息写进哪个文件里” 的问题上有所异同。

我就说说我的 Nginx 配置情况吧(对照一下你自己的目录看看):

TIM截图20171210014454.png

server {
  listen 80;
  root /var/www/php/typecho;
  index index.html index.htm index.php;
  server_name www.starryfk.com;
  
  ......
}

判断你的网站配置到底写在哪个文件里面了就见仁见智吧,一般就在 nginx.conf site-available/ site-enabled/ 里面之间了。

修改配置

因为我们打算使用 Webroot 的验证方式,certbot 会在域名对应的根目录创建一个叫做 well-known 的隐藏文件夹,并且创建用于验证域名所有权的文件。

为了能使 Nginx 成功反代验证信息,我们需要对 Nginx 的网站配置文件进行修改:
正如上面所说,你打开的配置文件里面会有如下的代码段落:

server {
  listen 80;
  root /var/www/php/typecho;
  index index.html index.htm index.php;
  server_name www.starryfk.com;
  
  .....
}

那么我们所需要做的就是在server代码块的花括号里面加上这一句

location ~ /.well-known {
        allow all;
}

现在修改后的代码看起来是这样的

server {
  listen 80;
  root /var/www/php/typecho;
  index index.html index.htm index.php;
  server_name www.starryfk.com;
 
        location ~ /.well-known {
                allow all;
        }

......
}

然后输入

service nginx reload

以此来应用修改的配置。

不过要注意的是,在完成之后,以为不用再验证了,闲得没事删了这段语句,因为证书的续期也是需要再次验证一次的,具体的内容会在后面讲到。

获取 CA 证书

然后就是使用这个超方便的 Certbot干一些羞羞的事情 获取 HTTPS 所需要的 CA 证书

首先先要运行 Certbot

certbot certonly

使用以上的命令来进行获取证书的配置程序

然后就是配置的第一个问题

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Place files in webroot directory (webroot)
2: Spin up a temporary webserver (standalone)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1

翻译过来的话大概就是:

你喜欢以什么方式来验证 CA 证书?
-------------------------------------------------------------------------------
1. 把文件放进网页根目录(Webroot)
2. 加速(?)一个临时服务器(Standalone(独立))
-------------------------------------------------------------------------------
选择适当的数字[1-2]然后点击[回车](按'c'键取消)

在这里我们就选择 Webroot 方式就好了,也就是:

输入'1'然后回车。

然后就是第二个问题

Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel):

翻译过来大概就是:

请输入你的域名(用逗号或者空格来分隔多个域名)(输入'c'来取消):

那么这里就:

输入你博客的域名地址

比如我是 www.starryfk.com 就输入 www.starryfk.com

个人建议的话就最好是输入自己的博客域名的全名(也就是带主机名的),比如 www 前缀

然后就是第三个问题

Select the webroot for starryfk.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel):

翻译过来就是

选择你的域名的网页根目录:
-------------------------------------------------------------------------------
1: 输入一个新的网页根目录
-------------------------------------------------------------------------------
按'1'来确认选项 (按'c'来取消):

这个就没有什么好选择的了啊。。就直接:

输入'1'并回车

然后是第四个问题

Input the webroot for starryfk.com: (Enter 'c' to cancel):

翻译过来就是

输入你的网页的根目录:(输入'c'来取消):

比如我的博客就是丢在 /var/www/php/typecho 的,那么就直接:

输入网站根目录的绝对路径

在注册中可能还会遇到如下的问题

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

这个我就懒得翻译了,主要就是问你同意不同意网址里面写的协议

(反正都需要我做翻译了,也不指望你能看得懂英文协议了)

这里我们就直接:

输入'A'然后回车来同意协议

然后所有的东西都配置好了之后,程序就会自动去注册证书了,至于证书在哪个目录的话,你可以在程序运行的后,输入查看本机保存的证书的指令:

certbot certificates

那个就是你的证书的放置的路径了,如果有些什么其他的应用也需要用到你的这个域名的证书的话,就输入里面所显示的证书和密匙的路径就好了。

想了解其他更多的命令的话就输入certbot --help就好了

证书的续期

因为这个证书是有3个月的有效期限制的,所以就需要每3个月去注册一次,用如下的指令来 续命 续签:

certbot renew

当然为了方便起见,你还可以在 Linux 上运用 Crontab 计划任务来实现隔一段时间自动执行命令

比如我现在要规定每月的一号的 6:00 都执行一次certbot renew,输入:

crontab -e

以此来打开计划任务的配置文件,然后在最后加上一行:

0 6 1 * * certbot renew

具体的参数设置便在此不再赘述

a31ce3b95cef3772949fd4fedfd616b6.jpg

配置 Nginx

在获取证书之后,你需要在你的 Nginx 的网页配置里面启用 HTTPS 相关的功能,才能正常使用 HTTPS 连接方式

修改配置文件

正如上面所说,你打开的配置文件里面会有如下的代码段落:

server {
  listen 80;
  root /var/www/php/typecho;
  index index.html index.htm index.php;
  server_name www.starryfk.com;
  
  ......
}

然后我们就要在此基础上对代码进行修改(不要复制粘贴照抄,因为里面的是我的配置,用的是我的域名,你可能不适用

ssl_certificate /etc/letsencrypt/live/www.starryfk.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.starryfk.com/privkey.pem;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;
server {
        listen 80;
        server_name www.starryfk.com;
        return 301 https://$host$request_uri;
}

好了,修改后的代码看起来大概是这样的:

server {
        listen 80;
        server_name www.starryfk.com;
        return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  root /var/www/php/typecho;
  index index.html index.htm index.php;
  server_name www.starryfk.com;
  
  ssl_certificate /etc/letsencrypt/live/www.starryfk.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/www.starryfk.com/privkey.pem;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;

  location ~ /.well-known {
             allow all;
  ......
}

还是那句话,千万不要照着完成后的代码搬上去,跟着步骤来,还有的就是记得把所有的 www.starryfk.com 改成你自己的域名

激活配置

那么修改完成了之后我们就直接重载 Nginx 服务来启用新的配置吧!

servive nginx reload

输入以上的命令来重载 Nginx 的配置文件,一般运行成功是没有任何提示的。

如果有错误提示的话,在再检查一下你的配置文件有没有语法错误,比如缺括号,缺必要的空格之类的

如果觉得自己有必要的话,可以上网再查一下关于 Nginx 的 SSL 优化之类的文章


如果你觉得我的文章有什么不足需要补充修正的地方,欢迎在下方的评论留言,我会第一时间回复的XD

Responses