泛域名解析与Https

文章发布时间:

最后更新时间:

文章总字数:
1.4k

预计阅读时间:
5 分钟

摘要

本文为站点泛域名解析配置记录、自八月以来遇到的新问题解决记录

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,界面如下图:

acme

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

acme2

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

acme3

接下来会来到验证环节。根据不同的证书类型和不同的网络类型可以选择不同的验证方式,这里比较稳定的验证方式:手动修改DNS记录。

注:采取这种类型的方式无法设置自动验证。当证书到期时需要手动进行更新,证书有效期一般为三个月。

在选择验证类型的地方选择[dns]Create verification records manually(auto-renew not possible),即在这一步选择6。下面保持生成默认的RSA秘钥即可。如下图:

acme4

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

acme5

如何实现泛域名解析

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

DNS设置1

如何指定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
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
return 301 https://$host$request_uri;
server_name NavgationPage;
location / {
root C:/Users/ztcly/NavgationPage/dist/;
index index.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

上面的配置除了指定错误时的页面,最重要的就是将所有http请求重定向至对应的https地址。
listen 80即监听80端口,80端口为默认的http端口,在访问时若未指定端口号即默认指向80端口。
return 301 https://$host$request_uri;即返回HTTP 301,并将http请求地址中的http更换为https。当有人通过http访问首页时,就会自动进行重定向。
首页的https配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 导航主页
server {
listen 443 ssl;
server_name ztcly.top;
ssl_certificate ztcly.top-crt.pem;
ssl_certificate_key ztcly.top-key.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root C:/Users/ztcly/NavgationPage/dist/;
index index.html index.htm;
}
}

使用ssl_certificate配置项指定证书文件的路径,ssl_certificate_key来指定证书的密钥文件,这里指定前面生成证书时的文件即可。一般而言,生成的证书文件为*-crt.pem,秘钥文件为*-key.pem,泛域名证书中的星号在文件名中为下划线。如果将这些文件放在nginx.conf文件的同一目录下,只需要指定文件名而不需要指定路径。
ssl_ciphers指定加密套件。
location则指定了首页文件的位置与路径。

参考文档

  1. 百度百科https
  2. Let’s Encrypt 安装配置教程,免费的 SSL 证书