前言

最近,不是读Ph.D.了嘛,也有打算将一些文章做一些B站视频,反正就是要正式摆到台面上给大家看了,(当然以前也有摆到台面上给大家看,只不过人不多),反正最近是比较正式地摆出来了,所以考虑到左上角老是有一个不安全的小锁还是不太好,于是乎,打算搞个SSL证书,把HTTP换成HTTPS。

于是,开始乱七八糟的瞎整。

正文

正文内容主要分为3个部分:

  1. SSL证书:有什么区别?如何购买?和如何下载
  2. 如何上传SSL证书至容器与如何配置
  3. 如何强制以HTTPS形式访问网站

1. SSL证书

1.1 SSL证书的分类

首先,SSL证书哪里购买,是个好问题,首先我们要知道SSL证书分为哪几种。根据文章《SSL数字证书类型与区别》,我们可以知道从验证方式来分类,可以分为3类:

  1. DV SSL证书(域名验证型):只需要验证域名所有权,无需人工验证申请单位真实身份,几分钟就可以颁发的SSL证书。价格一般在百元-千元,适用于个人或者小型网站。
  2. OV SSL证书(企业验证型):需要验证域名所有权以及企业身份信息,证明申请单位是一个合法存在的真实实体,一般在1~5个工作日颁发。价格一般在百元-千元,适用于企业型用户申请。
  3. EV SSL证书(扩展验证型):除了验证域名所有权以及企业身份信息之外,还需要提交扩展性验证,通常CA机构还会电话回访,一般在2~7个工作日颁发证书。价格一般在千元至万元左右,适用于在线交易网站、企业型网站。

对我们个人用户而言,我们使用DV SSL证书是完完全全足够了,毕竟我们也确实没有什么企业信息,只需要证明我们的域名所有权即可,真正重要的是下面这个分类方法,以域名数量来分类,也可以分为3类:

  1. 单域名SSL证书:只可以保护一个域名(包括带www和不带www)的SSL证书,可以是顶级域名也可以是二级域名,但是只能保护一个
  2. 多域名SSL证书,可以同时保护多个域名,不限制域名的类型,可以是顶级域名也可以是二级域名,但是应该也是只能保护特定的域名,比如你保护的是seanzou.com和xinhaizou.com两个顶级域名,那你就无法保护顶级域名下的cv.seanzou.com这样的域名了。(PS: 我并没有买过这个,如果说法错误请提出指正。)
  3. 通配符证书:只能保护一个域名以及该域名的所有下一级域名,不限制域名数量。

1.2 SSL证书的选择

那么其实如何选择这件事情就不麻烦了,首先一般我们都是个人网站,所以都首先DV SSL证书,然后在域名数量上面,如果:

  1. 你需要保护的URL只有一个,那么就选择单域名SSL证书,因为很便宜。
  2. 你需要保护的URL有很多个,但都是不同级的域名,比如 www.seanzou.com, cv.cool.seanzou.com, test.xinhaizou.com,那么你就需要选择多域名SSL证书,因为太杂了。
  3. 你需要保护的URL都属于某个域名的子域名,比如 cv.seanzou.com, blog.seanzou.com, ebook.seanzou.com,那么你就应该选择通配符证书,因为你有很多同一个级别的域名。

1.3 SSL证书的购买

购买的话,如果是DV SSL单域名SSL证书,阿里云其实可以白嫖,具体白嫖的方法我不太记得了,详情请自己百度。我这里购买了单域名SSL 和 通配符证书,(你问我为啥要买一个单域名SSL证书?因为我傻,我一开始以为单域名SSL证书就是通配符证书,所以踩了这个坑,哭了。)

首先让我们来到控制台>域名>域名列表,然后点进我们自己的域名,在基本信息栏的右边,你会发现一个SSL证书,下面有一个开启SSL证书的超链接,点进去,点进来之后你会自动发现进入了购买页面,这里我们将逐个介绍每个的选择:

  1. 域名名称(这个很重要,我一开始就踩了坑,你选择的SSL域名数量是由你这里直接匹配决定的)
    1. 如果你输入 seanzou.com,这不是通配符SSL证书,这只是一个单域名SSL证书!
    2. 如果你输入 *.seanzou.com,这个才是通配符SSL证书,你会发现价格完全不一样。
    3. 如果你输入 seanzou.com, xinhaizou.com,这就会是一个多域名SSL证书。
  2. 证书类型:我选择了DV证书
  3. 证书品牌:我选择了DigiCert
  4. 其他服务:看自己的选择,我选择了不需要
  5. 证书服务时长:我选择了1年
  6. 开启域名监控:我选择了否
  7. 勾选服务协议

然后购买即可,这样我们就成功购买了一个属于自己的SSL证书了~!

2. 上传SSL证书至容器

2.1 下载SSL证书

当我们拥有了一个自己的SSL证书以后,我们可以在控制台>数据证书管理服务(SSL)>SSL证书里面看见我们的证书,并且点击下载,可以将证书下载下来。对于下载的类型,我们因部署的类型而异,这里我以阿里云的Wordpress应用来举例子,Wordpress应用使用的是Nginx容器,证书格式为pem/key,我们直接下载就可以了。

2.2 上传SSL证书

证书我们下载后发现会有是压缩文件夹,然后解压之后有两个文件分别是xxx.key和xxx.pem,我们将会用到这两个证书文件到我们的Nginx里面去。

具体我们可以参考WordPress环境上安装SSL证书,首先我们需要上传我们的xxx.key和xxx.pem到Wordpress应用所在的服务器上面去,当然要上传,不然=。= 服务器咋证明自己有这个证书呢。为了方便,我们可以把SSL证书上传到这个一般放cert的地址/usr/local/nginx/conf/vhost/cert

2.3 配置Nginx.conf(配置SSL证书)

然后我们根据WordPress环境上安装SSL证书接下来的步骤,进入到目录cd /usr/local/nginx/conf/vhost, 并且首先备份一下cp wordpress.conf wordpress.conf.backup,这样即时出问题了也没关系;然后使用vim打开vim wordpress.conf,接着我们就会看见nginx.conf的配置。(这个地方阿里云或者Wordpress改成了wordpress.conf,本来到名字应该是nginx.conf。)

我们主要修改的就是把ssl_certificatessl_certificate_key两个参数的值,分别改为我们xxx.pem 和 xxx.key的绝对路径,即可。

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/cert-file-name.pem;
  ssl_certificate_key /usr/local/nginx/conf/ssl/cert-file-name.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name _;
  access_log /data/wwwlogs/wordpress_nginx.log combined;
  index index.html index.htm index.php;
  root /data/wwwroot/wordpress;
  #if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
  #if ($host != www.example.com) {  return 301 $scheme://www.example.com$request_uri;  }
  include /usr/local/nginx/conf/rewrite/wordpress.conf;
  #error_page 404 /404.html;
  #error_page 502 /502.html;

  location ~ [^/]\.php(/|$) {
    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
  }
  location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
    deny all;
  }
}

然后执行命令systemctl restart nginx重启nginx服务,和service mysqld restart重启数据库。(其实这种情况nginx -s reload和直接重启服务器都是可以的,笑)

不仅仅是配置Nginx容器,配置其他也是一样的,要学会灵活,举一反三:D。

3. 强制HTTPS形式访问网站

但是,我们会发现一个问题就是,这个时候我们可以同时访问HTTP和HTTPS的URL,我们也很明显的发现上面的阿里云中的Wordpress应用里面的wordpress.conf只用了一个server,把端口80(HTTP)和443(HTTPS)都监听了。也没有什么if-else条件说,把端口80收到的消息强制转发给443,怎么办呢?这个时候就需要我们进行一个重定向了。

如果Nginx.conf里面本来就写了两个server的block,一个是监听80一个是监听443的,那么我们就把80里面所有的东西都删了,然后改成如下。

server {
  listen 80;
  listen [::]:80;
  server_name blog.seanzou.com;
  rewrite ^ https://$host$request_uri? permanent;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ...
}

如果我们像阿里云这个wordpress.conf,只有一个server同时监听80端口和443端口的,那么我们就把所有关于80端口的东西从443删掉,(当然443需要的就不要删掉了),然后然后重新自己写一个即可:

server {
  listen 80;
  listen [::]:80;
  server_name blog.seanzou.com;
  rewrite ^ https://$host$request_uri? permanent;
}

总结

呼呼,写完撒花。
呜呜呜,花了单域名SSL证书的冤枉钱!!我哭了!
写出来给大家,避坑!

参考

[1] In Nginx, how can I rewrite all http requests to https while maintaining sub-domain?
[2] SSL数字证书类型与区别
[3] WordPress环境上安装SSL证书

Q.E.D.


立志做一个有趣的碳水化合物