泛域名解析与Https
最后更新时间:
文章总字数:
预计阅读时间:
摘要
本文为站点泛域名解析配置记录、自八月以来遇到的新问题解决记录
Https与泛域名
什么是https
HTTPS(全称:Hypertext Transfer Protocol Secure),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。[1]
什么是泛域名
泛域名使用通配符(如*)等对于部分域名进行替代。如*.ztcly.top的规则将同时覆盖blog.ztcly.top和file.ztcly.top。
这里以单服务器为例,使用nginx实现所有的子级域名均指向相同地址。如上面这两个地址实际运行的服务均在一台服务器上。
如何获取证书
这里选择Let’s Encrypt的免费证书
Let’s Encrypt 是一个由非营利性组织 互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。
简单的说,借助 Let’s Encrypt 颁发的证书可以为我们的网站免费启用 HTTPS(SSL/TLS) 。 [2]
由于服务器运行Win操作系统,可以使用win-acme进行证书的获取与验证。
使用win-acme获取与更新证书的流程待补充,教程可以见用win-acme生成免费的泛域名证书、let’s encrypt或见下面泛域名证书获取过程。
以win-ACME为例,获取Let’s Encrypt泛域名证书。
链接:win-acme官网 | win-acme下载(Github)
下载并使用命令行工具打开wacs.exe,界面如下图:

在这个界面就可以根据自己的需要开始创建证书了。这里不使用默认选项,选择Create certificate(full option)。即在上图的界面中选择M。
Source来源这里选择Manual Input,在这一项中手动输入2或是直接回车(因为是默认项)都可以。
在Host一项中中输入自己需要的域名。
如下图:

接下来选择证书类型,泛域名证书按照它的提示选择“Separate certificate for each domain”。即在这一步输入1。

接下来会来到验证环节。根据不同的证书类型和不同的网络类型可以选择不同的验证方式,这里比较稳定的验证方式:手动修改DNS记录。
注:采取这种类型的方式无法设置自动验证。当证书到期时需要手动进行更新,证书有效期一般为三个月。
在选择验证类型的地方选择[dns]Create verification records manually(auto-renew not possible),即在这一步选择6。下面保持生成默认的RSA秘钥即可。如下图:

最后,因为要生成用于nginx所使用的文件,文件类型这里选择PEM encodeed files(Apache,nginx,etc.)即可,即在这一步选择2.最后设置导出证书的路径。

如何实现泛域名解析
这里使用nginx进行泛解析,其可以支持无限多的子域名,而无需为每个子域名指定新的服务器。这里以本站即*.ztcly.top进行举例。
首先,需要在DNS提供商那里设置*通配符,即将所有的*.ztcly.top全部指向服务器的地址。

如何指定Https
首先,Https默认端口为443,所以需要保证443端口开放。而当有http请求时,直接返回HTTP 301(永久性转移Permanently Moved),返回的地址即为请求地址,但是将请求地址中的http换成https。即当访问http://blog.ztcly.top时,返回HTTP 301并重定向至https://blog.ztcly.top.以此达到指定访问Https的效果。
以ztcly.top首页为例,在nginx中,可以做如下配置:
打开配置文件nginx.conf,该文件一般位于nginx根目录下的conf目录中
1 | |
上面的配置除了指定错误时的页面,最重要的就是将所有http请求重定向至对应的https地址。listen 80即监听80端口,80端口为默认的http端口,在访问时若未指定端口号即默认指向80端口。return 301 https://$host$request_uri;即返回HTTP 301,并将http请求地址中的http更换为https。当有人通过http访问首页时,就会自动进行重定向。
首页的https配置如下:
1 | |
使用ssl_certificate配置项指定证书文件的路径,ssl_certificate_key来指定证书的密钥文件,这里指定前面生成证书时的文件即可。一般而言,生成的证书文件为*-crt.pem,秘钥文件为*-key.pem,泛域名证书中的星号在文件名中为下划线。如果将这些文件放在nginx.conf文件的同一目录下,只需要指定文件名而不需要指定路径。ssl_ciphers指定加密套件。location则指定了首页文件的位置与路径。