北京安保职达 發表於 2021-4-26 09:49:00

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

<p>随着互联网的飞速发展,我们的工作生活已经离不开互联网,HTTP虽然使用极为广泛, 但是存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付,网络交易等网站应用中安全方面最需要关注的。</p>
<p>谷歌、火狐、360等浏览器开始要求强制使用HTTPS网站,小程序开发也必须是HTTPS网站,企业、网站网页部署HTTPS加密似乎已经势不可挡,今天来讲解一下怎么通过<strong>Nginx快速把我们的http网站升级成https</strong>。</p>
<h1 id="https介绍">HTTPS介绍</h1>
<p>再此之前我们先简单了解一下HTTP和HTTPS;</p>
<h2 id="什么是https">什么是HTTPS???</h2>
<p>HTTPS是一种<strong>通过计算机网络进行安全通信的传输协议</strong>,经8*由HTTP进行通信<strong>,</strong>利用SSL/TLS建立全信道**,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。</p>
<h3 id="特点">特点</h3>
<ul>
<li>内容加密:采用混合加密技术,中间者无法直接查看明文内容;</li>
<li>验证身份:通过证书认证客户端访问的是自己的服务器;</li>
<li>保护数据完整性:防止传输的内容被中间人冒充或者篡改。</li>
</ul>
<p><strong>总结:HTTPS牛X!</strong></p>
<h2 id="http和https的原理">HTTP和HTTPS的原理</h2>
<p>HTTPS 主要由两部分组成:HTTP + SSL / TLS,也就是在 HTTP 上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。</p>
<h3 id="http-原理">HTTP 原理</h3>
<p>①客户端的浏览器首先要<strong>通过网络与服务器</strong>建立连接,该连接是<strong>通过TCP来完成</strong>,一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和许可内容。</p>
<p>②服务器<strong>接到请求后,给予相应的响应信息</strong>,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。</p>
<h3 id="https-原理">HTTPS 原理</h3>
<p>① 客户端将<strong>它所支持的算法列表和一个用作产生密钥的随机数发送给服务器</strong>;</p>
<p>② 服务器从算法列表中<strong>选择一种加密算法</strong>,并<strong>将它和一份包含服务器公用密钥的证书发送给客户端</strong>;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;</p>
<p>③ 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服务器;</p>
<p>④ 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和 MAC密钥;</p>
<p>⑤ 客户端将所有握手消息的 MAC 值发送给服务器;</p>
<p>⑥ 服务器将所有握手消息的 MAC 值发送给客户端;</p>
<h2 id="https优缺点">HTTPS优缺点</h2>
<p>人有悲欢离合,月有阴晴圆缺,世间万物皆不可称完美,HTTPS自然也有它的优缺点。</p>
<h3 id="优点">优点</h3>
<ul>
<li>使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;</li>
<li>HTTPS 协议是由 SSL+HTTP构建的可进行加密传输、身份认证的网络协议,要比 HTTP安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性;</li>
<li>HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本;</li>
</ul>
<h3 id="缺点">缺点</h3>
<ul>
<li>相同网络环境下,HTTPS 协议会使页面的加载时间延长近 50%,增加 10%到 20%的耗电。此外,HTTPS 协议还会影响缓存,增加数据开销和功耗;</li>
<li>成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本。</li>
</ul>
<h1 id="配置https">配置HTTPS</h1>
<p>在网络安全如此重要的今天,HTTPS的必要性还是毋庸置疑的,话不多说,冲冲冲!</p>
<h2 id="需要准备的资源">需要准备的资源</h2>
<h3 id="一台可用的服务器">一台可用的服务器</h3>
<p>首先需要有一台可用的服务器,后续用作域名解析。如果没有服务器可以先购买一台云服务器。</p>
<h3 id="一个备案过的域名">一个备案过的域名</h3>
<p>需要一个备过案的域名,用于解析服务器的IP地址。在对应购买的域名的服务商网站控制台可以完成备案。</p>
<h3 id="ssl证书">SSL证书</h3>
<p>SSL证书有免费和收费两个渠道。</p>
<p>我们这边主要介绍腾讯云和阿里云(排名不分先后)两个免费申请SSL证书的方式,当然资金允许情况下也可以直接购买。</p>
<h4 id="阿里云申请免费ssl证书">阿里云申请免费SSL证书</h4>
<p>阿里云免费证书规则:自2021年起,免费证书申请将切换到证书资源包下每个实名个人/企业主体在一个自然年内可以一次性领取20张免费证书,免费证书每张证书<strong>有效期一年</strong>。免费证书仅支持绑定一个<strong>单域名</strong>,不支持绑定通配符域名或者IP。</p>
<p>阿里云申请免费SSL证书文档:官方文档地址</p>
<h4 id="腾讯云申请免费ssl证书">腾讯云申请免费SSL证书</h4>
<p>腾讯云免费证书规则:只支持绑定1个域名,可以支持绑定二级域名 abc.com、或是三级域名 example.abc.com。同一主域最多只能申请20张免费证书,每张<strong>有效期一年</strong>,免费证书到期后如需继续使用证书,需要重新申请并安装。</p>
<p>腾讯云申请免费SSL证书文档:官方文档地址</p>
<h2 id="域名升级成https">域名升级成HTTPS</h2>
<p>我们如果直接用域名解析IP地址,域名也是可以访问的,但是是HTTP环境的。<br>
我们使用的<strong>Nginx</strong>来配置升级HTTPS</p>
<h3 id="登录服务器">登录服务器</h3>
<p>市场上有很多终端登录工具,比如:xshell、Putty、FinalShell等等,大家可以根据自己的喜好自行安装SSH工具进入服务器(下文以FinalShell工具为示例)。</p>
<h4 id="下载并安装finalshell">下载并安装FinalShell</h4>
<p>大家也可自行搜索下载SSH客户端,登录页面大同小异,下面以FinalShell工具为例,安装完成后开始登录我们的服务器。</p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220125090-77859241.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220145371-949867573.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220205967-1917659204.png" alt="" loading="lazy"></p>
<h3 id="服务器安装nginx">服务器安装Nginx</h3>
<p>  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,在SSH连接工具连接成功后,输入命令安装Nginx;</p>
<pre><code class="language-linux">// 安装nginx
yum install -y nginx

// 设置nginx开机启动
systemctl start nginx.service
systemctl enable nginx.service
</code></pre>
<p>但是nginx默认使用端口 80, 我们购买的服务器实例一般默认不开启端口80,默认只有 22 和 3389端口,我们可以通过设置,打开80和443端口;登录相应服务器管理网站打开端口服务,我们这边以阿里云为例开始设置。</p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220223632-22968062.png" alt="" loading="lazy"></p>
<hr>
<p>设置好之后,我们直接访问我们服务器的公网IP地址,就可以看到如下画面,就代表Nginx设置好了;</p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220245276-530849880.png" alt="" loading="lazy"></p>
<h3 id="nginx服务器安装ssl证书">Nginx服务器安装SSL证书</h3>
<h4 id="单域名升级https">单域名升级HTTPS</h4>
<p>Github地址:完整的单域名nginx.conf文件配置(清晰注释) -- 点击进入</p>
<hr>
<p>当我们在上面申请成功免费的SSL证书之后,点击下载证书。</p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220304305-720714136.png" alt="" loading="lazy"></p>
<p>下载完成会得到一个压缩包,我们解压之后选择Nginx文件夹,里面的两个文件就是我们后续需要配置的文件。<br>
下载到本地的压缩文件包解压后Nginx文件夹包含:</p>
<ul>
<li>.crt文件:是证书文件,crt是pem文件的扩展名。</li>
<li>.key文件:证书的私钥文件。</li>
</ul>
<p>这时候我们打开我们的SSH工具,进入Nginx的配置:</p>
<pre><code>// 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
cd /etc/nginx
</code></pre>
<h5 id="步骤一">步骤一</h5>
<p>在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到<code>/etc/nginx/cert</code>目录中(<strong>使用SSH工具附带的本地文件上传功能,将本地证书文件和密钥文件上传到Nginx服务器的证书目录[示例中为/etc/nginx/cert]</strong>)。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为a.key;</p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220325047-831311749.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220344249-1071181253.png" alt="" loading="lazy"></p>
<hr>
<h5 id="步骤二">步骤二</h5>
<p>然后开始Nginx配置,编辑Nginx配置文件(nginx.conf)</p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220408896-916932769.png" alt="" loading="lazy"></p>
<pre><code>```
// 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
cd /etc/nginx

// 编辑nginx的配置文件
vi nginx.conf
```
</code></pre>
<hr>
<h5 id="步骤三">步骤三</h5>
<p>修改与证书相关的配置内容<code>按i键进入编辑模式</code>,增加代码,监听443端口,如下<br>
<img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220431460-1849119426.png" alt="" loading="lazy"></p>
<pre><code>```
server {
      listen       443 ssl;
      listen       [::]:443;
      server_namelocalhost;
         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_timeout5m;
      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键,保存修改后的配置文件并退出编辑模式。
</code></pre>
<hr>
<h5 id="步骤四">步骤四</h5>
<p>执行命令<code>/sbin/nginx -s reload</code>重启服务器即可!(如果重启未成功,说明配置文件nginx.conf错误,检查是否有错误,后执行重启)</p>
<hr>
<h5 id="步骤五">步骤五</h5>
<p>验证是否安装成功,证书安装完成后,可通过访问证书的绑定域名验证该证书是否安装成功。例如:https://www.域名.com</p>
<h4 id="二级域名配置https">二级域名配置HTTPS</h4>
<p>Github地址:完整的单域名+ 二级域名nginx.conf文件配置(完美注释) -- 点击进入</p>
<hr>
<p>上述步骤成功之后,我们就可以通过<code>https://www.域名.com</code> 来访问我们网站了,但是问题来了,因为我们申请的免费SSL证书是单域名绑定,也就是只能让<code>https://www.域名.com</code> 下的内容实现HTTPS访问,我们的二级域名<code>api.域名.com</code>还是只能HTTP访问。</p>
<p>假设我们现在希望<code>api.域名.com</code>以HTTPS访问应该怎么办呢?</p>
<h5 id="添加二级域名解析">添加二级域名解析</h5>
<p>首先我们需要添加二级域名的解析,首先保证<code>httpL//api.域名.com</code>可以正常访问,IP地址处就填写我们的公网IP地址。<br>
<img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220605863-1804643201.png" alt="" loading="lazy"></p>
<h5 id="二级域名申请ssl证书">二级域名申请SSL证书</h5>
<p>申请SSL证书的步骤与上面一致,这里就不在赘述了。最多可以申请20张免费证书,只是申请域名SSL证书的时候,记得填写我们的<code>api.域名.com</code>,申请成功后我们下载到本地。</p>
<p><img src="https://img2020.cnblogs.com/blog/1669498/202104/1669498-20210425220455330-2069138412.png" alt="" loading="lazy"></p>
<h5 id="把下载的证书文件放入服务器">把下载的证书文件放入服务器</h5>
<p>这里步骤与上述一致,这里简单说下:<br>
这时候我们打开我们的SSH工具,进入Nginx的配置:</p>
<pre><code>// 进入nginx目录
cd /etc/nginx
</code></pre>
<p>在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到<code>/etc/nginx/cert</code>目录中(<strong>使用SSH工具附带的本地文件上传功能,将本地证书文件和密钥文件上传到Nginx服务器的证书目录[示例中为/etc/nginx/cert]</strong>)。</p>
<p><strong>为了避免与其他证书文件呼啸,我们可以将对应的私钥文件放到cert目录下并且命名为api.key、api.crt;</strong></p>
<h5 id="编辑nginxconf文件">编辑nginx.conf文件</h5>
<pre><code>    // 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
    cd /etc/nginx

    // 编辑nginx的配置文件
    vi nginx.conf
   
   
    // 我们也可以把**nginx.conf文件**保存至本地然后打开编辑修改,
   
# 我们也可以把nginx.conf文件保存至本地然后修改
</code></pre>
<h5 id="开启监听8100端口用于二级域名使用">开启监听8100端口用于二级域名使用</h5>
<p>在<strong>nginx.conf</strong>文件中添加监听8100端口(别忘记检查服务器是否开启了8100端口):</p>
<pre><code>    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 {
      }
    }
</code></pre>
<h5 id="二级域名指向8100端口并配置ssl证书">二级域名指向8100端口并配置SSL证书</h5>
<p>在<strong>nginx.conf</strong>文件中再次添加监听443接口:</p>
<pre><code>    server {
      listen       443 ssl;
      # 注:域名处修改成自己的域名地址
      server_nameapi.域名.com;
       ssl on;
      
               
      #证书文件名称
      ssl_certificate cert/api.crt;
      #私钥文件名称
      ssl_certificate_key cert/api.key;

      ssl_session_cache shared:SSL:1m;
      ssl_session_timeout5m;
        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 {
      }
    }
</code></pre>
<h4 id="http自动重定向至https">http自动重定向至https</h4>
<p>其实很简单只需要在80端口配置那里添加<code>rewrite</code>重定向即可,</p>
<pre><code>    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 {
      }
    }
</code></pre>
<h1 id="结尾">结尾</h1>
<p>好了,以上就是本篇全部的配置内容啦。</p>
<p>如果遇到问题可以在下方评论区贴出,一定会第一时间回复!</p>
<p>码字不易。如果觉得本篇文章对你有帮助的话,希望能可以留言点赞支持,非常感谢~</p>
<h1 id="参考资料">参考资料</h1>
<p>HTTPS原理 - 百度百科</p>
<h1 id="感悟">感悟</h1>
<p>前两天有位老哥评论我两年的一篇博客(搜索引擎搜索标题:<code>JS做一个可输入分钟的倒计时钟功能</code>就可以搜到这篇博客),当时写的一个倒计时的Demo有个bug,没想到在2021年被这位老哥发现了,记得当时想了很久也没找到解决那个bug的方案,两年后的现在发现燕来并没有想象的那么难。</p>
<p>估计现在觉得痛苦万分的事情,也许两年后也会淡然一笑吧。</p>
<blockquote>
<p>我会变得更好的,是因为你,但不是为了你</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/zhaohongcheng/p/14702361.html
頁: [1]
查看完整版本: 超详细网站博客域名和二级域名、子域名升级HTTPS免费申请SSL证书配置nginx指南