前言
最近,不是读Ph.D.了嘛,也有打算将一些文章做一些B站视频,反正就是要正式摆到台面上给大家看了,(当然以前也有摆到台面上给大家看,只不过人不多),反正最近是比较正式地摆出来了,所以考虑到左上角老是有一个不安全的小锁还是不太好,于是乎,打算搞个SSL证书,把HTTP换成HTTPS。
于是,开始乱七八糟的瞎整。
正文
正文内容主要分为3个部分:
- SSL证书:有什么区别?如何购买?和如何下载
- 如何上传SSL证书至容器与如何配置
- 如何强制以HTTPS形式访问网站
1. SSL证书
1.1 SSL证书的分类
首先,SSL证书哪里购买,是个好问题,首先我们要知道SSL证书分为哪几种。根据文章《SSL数字证书类型与区别》,我们可以知道从验证方式来分类,可以分为3类:
- DV SSL证书(域名验证型):只需要验证域名所有权,无需人工验证申请单位真实身份,几分钟就可以颁发的SSL证书。价格一般在百元-千元,适用于个人或者小型网站。
- OV SSL证书(企业验证型):需要验证域名所有权以及企业身份信息,证明申请单位是一个合法存在的真实实体,一般在1~5个工作日颁发。价格一般在百元-千元,适用于企业型用户申请。
- EV SSL证书(扩展验证型):除了验证域名所有权以及企业身份信息之外,还需要提交扩展性验证,通常CA机构还会电话回访,一般在2~7个工作日颁发证书。价格一般在千元至万元左右,适用于在线交易网站、企业型网站。
对我们个人用户而言,我们使用DV SSL证书是完完全全足够了,毕竟我们也确实没有什么企业信息,只需要证明我们的域名所有权即可,真正重要的是下面这个分类方法,以域名数量来分类,也可以分为3类:
- 单域名SSL证书:只可以保护一个域名(包括带www和不带www)的SSL证书,可以是顶级域名也可以是二级域名,但是只能保护一个。
- 多域名SSL证书,可以同时保护多个域名,不限制域名的类型,可以是顶级域名也可以是二级域名,但是应该也是只能保护特定的域名,比如你保护的是seanzou.com和xinhaizou.com两个顶级域名,那你就无法保护顶级域名下的cv.seanzou.com这样的域名了。(PS: 我并没有买过这个,如果说法错误请提出指正。)
- 通配符证书:只能保护一个域名以及该域名的所有下一级域名,不限制域名数量。
1.2 SSL证书的选择
那么其实如何选择这件事情就不麻烦了,首先一般我们都是个人网站,所以都首先DV SSL证书,然后在域名数量上面,如果:
- 你需要保护的URL只有一个,那么就选择单域名SSL证书,因为很便宜。
- 你需要保护的URL有很多个,但都是不同级的域名,比如 www.seanzou.com, cv.cool.seanzou.com, test.xinhaizou.com,那么你就需要选择多域名SSL证书,因为太杂了。
- 你需要保护的URL都属于某个域名的子域名,比如 cv.seanzou.com, blog.seanzou.com, ebook.seanzou.com,那么你就应该选择通配符证书,因为你有很多同一个级别的域名。
1.3 SSL证书的购买
购买的话,如果是DV SSL单域名SSL证书,阿里云其实可以白嫖,具体白嫖的方法我不太记得了,详情请自己百度。我这里购买了单域名SSL 和 通配符证书,(你问我为啥要买一个单域名SSL证书?因为我傻,我一开始以为单域名SSL证书就是通配符证书,所以踩了这个坑,哭了。)
首先让我们来到控制台>域名>域名列表
,然后点进我们自己的域名,在基本信息栏的右边,你会发现一个SSL证书,下面有一个开启SSL证书的超链接
,点进去,点进来之后你会自动发现进入了购买页面,这里我们将逐个介绍每个的选择:
- 域名名称(这个很重要,我一开始就踩了坑,你选择的SSL域名数量是由你这里直接匹配决定的)
- 如果你输入 seanzou.com,这不是通配符SSL证书,这只是一个单域名SSL证书!
- 如果你输入 *.seanzou.com,这个才是通配符SSL证书,你会发现价格完全不一样。
- 如果你输入 seanzou.com, xinhaizou.com,这就会是一个多域名SSL证书。
- 证书类型:我选择了DV证书
- 证书品牌:我选择了DigiCert
- 其他服务:看自己的选择,我选择了不需要
- 证书服务时长:我选择了1年
- 开启域名监控:我选择了否
- 勾选服务协议
然后购买即可,这样我们就成功购买了一个属于自己的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_certificate
和ssl_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.