超详细网站博客域名和二级域名、子域名升级HTTPS免费申请SSL证书配置nginx指南

随着互联网的飞速发展,我们的工作生活已经离不开互联网,HTTP虽然使用极为广泛, 但是存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付,网络交易等网站应用中安全方面最需要关注的。

谷歌、火狐、360等浏览器开始要求强制使用HTTPS网站,小程序开发也必须是HTTPS网站,企业、网站网页部署HTTPS加密似乎已经势不可挡,今天来讲解一下怎么通过Nginx快速把我们的http网站升级成https

HTTPS介绍

再此之前我们先简单了解一下HTTP和HTTPS;

什么是HTTPS???

HTTPS是一种通过计算机网络进行安全通信的传输协议,经8*由HTTP进行通信利用SSL/TLS建立全信道**,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

特点

  • 内容加密:采用混合加密技术,中间者无法直接查看明文内容;
  • 验证身份:通过证书认证客户端访问的是自己的服务器;
  • 保护数据完整性:防止传输的内容被中间人冒充或者篡改。

总结: HTTPS牛X!

HTTP和HTTPS的原理

HTTPS 主要由两部分组成:HTTP + SSL / TLS,也就是在 HTTP 上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。

HTTP 原理

① 客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过TCP来完成,一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和许可内容。

② 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。

HTTPS 原理

① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器

② 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;

③ 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服务器;

④ 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和 MAC密钥;

⑤ 客户端将所有握手消息的 MAC 值发送给服务器;

⑥ 服务器将所有握手消息的 MAC 值发送给客户端;

HTTPS优缺点

人有悲欢离合,月有阴晴圆缺,世间万物皆不可称完美,HTTPS自然也有它的优缺点。

优点

  • 使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
  • HTTPS 协议是由 SSL+HTTP构建的可进行加密传输、身份认证的网络协议,要比 HTTP安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性;
  • HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本;

缺点

  • 相同网络环境下,HTTPS 协议会使页面的加载时间延长近 50%,增加 10%到 20%的耗电。此外,HTTPS 协议还会影响缓存,增加数据开销和功耗;
  • 成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本。

配置HTTPS

在网络安全如此重要的今天,HTTPS的必要性还是毋庸置疑的,话不多说,冲冲冲!

需要准备的资源

一台可用的服务器

首先需要有一台可用的服务器,后续用作域名解析。如果没有服务器可以先购买一台云服务器。

一个备案过的域名

需要一个备过案的域名,用于解析服务器的IP地址。在对应购买的域名的服务商网站控制台可以完成备案。

SSL证书

SSL证书有免费和收费两个渠道。

我们这边主要介绍腾讯云和阿里云(排名不分先后)两个免费申请SSL证书的方式,当然资金允许情况下也可以直接购买。

阿里云申请免费SSL证书

阿里云免费证书规则:自2021年起,免费证书申请将切换到证书资源包下每个实名个人/企业主体在一个自然年内可以一次性领取20张免费证书,免费证书每张证书有效期一年。免费证书仅支持绑定一个单域名,不支持绑定通配符域名或者IP。

阿里云申请免费SSL证书文档:官方文档地址

腾讯云申请免费SSL证书

腾讯云免费证书规则:只支持绑定1个域名,可以支持绑定二级域名 abc.com、或是三级域名 example.abc.com。同一主域最多只能申请20张免费证书,每张有效期一年,免费证书到期后如需继续使用证书,需要重新申请并安装。

腾讯云申请免费SSL证书文档:官方文档地址

域名升级成HTTPS

我们如果直接用域名解析IP地址,域名也是可以访问的,但是是HTTP环境的。
我们使用的Nginx来配置升级HTTPS

登录服务器

市场上有很多终端登录工具,比如:xshell、Putty、FinalShell等等,大家可以根据自己的喜好自行安装SSH工具进入服务器(下文以FinalShell工具为示例)。

下载并安装FinalShell

大家也可自行搜索下载SSH客户端,登录页面大同小异,下面以FinalShell工具为例,安装完成后开始登录我们的服务器。

服务器安装Nginx

  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,在SSH连接工具连接成功后,输入命令安装Nginx;

// 安装nginx
yum install -y nginx

// 设置nginx开机启动
systemctl start nginx.service
systemctl enable nginx.service

但是nginx默认使用端口 80, 我们购买的服务器实例一般默认不开启端口80,默认只有 22 和 3389端口,我们可以通过设置,打开80和443端口;登录相应服务器管理网站打开端口服务,我们这边以阿里云为例开始设置。


设置好之后,我们直接访问我们服务器的公网IP地址,就可以看到如下画面,就代表Nginx设置好了;

Nginx服务器安装SSL证书

单域名升级HTTPS

Github地址:完整的单域名nginx.conf文件配置(清晰注释) -- 点击进入


当我们在上面申请成功免费的SSL证书之后,点击下载证书。

下载完成会得到一个压缩包,我们解压之后选择Nginx文件夹,里面的两个文件就是我们后续需要配置的文件。
下载到本地的压缩文件包解压后Nginx文件夹包含:

  • .crt文件:是证书文件,crt是pem文件的扩展名。
  • .key文件:证书的私钥文件。

这时候我们打开我们的SSH工具,进入Nginx的配置:

// 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
cd /etc/nginx
步骤一

在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到/etc/nginx/cert目录中(使用SSH工具附带的本地文件上传功能,将本地证书文件和密钥文件上传到Nginx服务器的证书目录[示例中为/etc/nginx/cert])。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为a.key;


步骤二

然后开始Nginx配置,编辑Nginx配置文件(nginx.conf)

```
// 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
cd /etc/nginx

// 编辑nginx的配置文件
vi nginx.conf
```

步骤三

修改与证书相关的配置内容按i键进入编辑模式,增加代码,监听443端口,如下

```
  server {
        listen       443 ssl;
        listen       [::]:443;
        server_name  localhost;
         ssl on;

                root /usr/share/nginx/html;
                index index.html index.htm;
        #证书文件名称
        ssl_certificate cert/a.crt;
        #私钥文件名称
        ssl_certificate_key cert/a.key;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
```

修改完成后,按Esc键、输入`:wq!`并按Enter键,保存修改后的配置文件并退出编辑模式。

步骤四

执行命令/sbin/nginx -s reload 重启服务器即可!(如果重启未成功,说明配置文件nginx.conf错误,检查是否有错误,后执行重启)


步骤五

验证是否安装成功,证书安装完成后,可通过访问证书的绑定域名验证该证书是否安装成功。例如:https://www.域名.com

二级域名配置HTTPS

Github地址:完整的单域名+ 二级域名nginx.conf文件配置(完美注释) -- 点击进入


上述步骤成功之后,我们就可以通过https://www.域名.com 来访问我们网站了,但是问题来了,因为我们申请的免费SSL证书是单域名绑定,也就是只能让https://www.域名.com 下的内容实现HTTPS访问,我们的二级域名api.域名.com还是只能HTTP访问。

假设我们现在希望api.域名.com以HTTPS访问应该怎么办呢?

添加二级域名解析

首先我们需要添加二级域名的解析,首先保证httpL//api.域名.com可以正常访问,IP地址处就填写我们的公网IP地址。

二级域名申请SSL证书

申请SSL证书的步骤与上面一致,这里就不在赘述了。最多可以申请20张免费证书,只是申请域名SSL证书的时候,记得填写我们的api.域名.com,申请成功后我们下载到本地。

把下载的证书文件放入服务器

这里步骤与上述一致,这里简单说下:
这时候我们打开我们的SSH工具,进入Nginx的配置:

// 进入nginx目录
cd /etc/nginx

在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到/etc/nginx/cert目录中(使用SSH工具附带的本地文件上传功能,将本地证书文件和密钥文件上传到Nginx服务器的证书目录[示例中为/etc/nginx/cert])。

为了避免与其他证书文件呼啸,我们可以将对应的私钥文件放到cert目录下并且命名为api.key、api.crt;

编辑nginx.conf文件
    // 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
    cd /etc/nginx

    // 编辑nginx的配置文件
    vi nginx.conf
    
    
    // 我们也可以把**nginx.conf文件**保存至本地然后打开编辑修改,
    
# 我们也可以把nginx.conf文件保存至本地然后修改
开启监听8100端口用于二级域名使用

nginx.conf文件中添加监听8100端口(别忘记检查服务器是否开启了8100端口):

    server {
        listen       8100 default_server;
        listen       [::]:8100 default_server;
        server_name  _;
        # 这里root表示指向的目录,可以根据自身配置路径
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
二级域名指向8100端口并配置SSL证书

nginx.conf文件中再次添加监听443接口:

    server {
        listen       443 ssl;
        # 注:域名处修改成自己的域名地址
        server_name  api.域名.com;
	 ssl on;
        
		
        #证书文件名称
        ssl_certificate cert/api.crt;
        #私钥文件名称
        ssl_certificate_key cert/api.key;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  5m;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

		

		location / {
                    # 注:域名处修改成自己的域名地址
		   proxy_pass http://www.域名.com:8100;
		   proxy_set_header Host $host;
        # 获取请求的ip地址
        proxy_set_header X-real-ip $remote_addr;
        # 获取请求的多级ip地址,当请求经过多个反向代理时,会获取多个ip,英文逗号隔开

        }
        
		root /usr/share/nginx/html;
		index index.html index.htm;
		
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

http自动重定向至https

其实很简单只需要在80端口配置那里添加rewrite重定向即可,

    server {
		# 80端口配置
        listen       80 default_server;
        listen       [::]:80 default_server;
        
        
        
	# 注意这里改写成自己的域名!!!
	server_name www.域名.com;
	# http请求时直接重定向到https
    	rewrite ^(.*)$ https://${server_name}$1 permanent; 
        
        
        root         /usr/share/nginx/html/video;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
		
		# location部分用于匹配网页位置
        location / {
        }
		# 404 配置
        error_page 404 /404.html;
            location = /40x.html {
        }
		# 5xx 配置
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

结尾

好了,以上就是本篇全部的配置内容啦。

如果遇到问题可以在下方评论区贴出,一定会第一时间回复!

码字不易。如果觉得本篇文章对你有帮助的话,希望能可以留言点赞支持,非常感谢~

参考资料

HTTPS原理 - 百度百科

感悟

前两天有位老哥评论我两年的一篇博客(搜索引擎搜索标题:JS做一个可输入分钟的倒计时钟功能就可以搜到这篇博客),当时写的一个倒计时的Demo有个bug,没想到在2021年被这位老哥发现了,记得当时想了很久也没找到解决那个bug的方案,两年后的现在发现燕来并没有想象的那么难。

估计现在觉得痛苦万分的事情,也许两年后也会淡然一笑吧。

我会变得更好的,是因为你,但不是为了你

posted @ 2021-04-26 09:49  Tz一号  阅读(1780)  评论(0编辑  收藏  举报