萧麦 發表於 2025-10-11 19:16:00

记录---图文并茂讲解nginx中http升级https(部署SSL证书)知识点总结

<h1 data-id="heading-0">🧑‍💻 写在开头</h1>
<p>点赞 + 收藏 === 学会🤣🤣🤣</p>
<h2 data-id="heading-0">为何网站要升级为https</h2>
<p>原因有以下几点:</p>
<h3 data-id="heading-1">1. 避免浏览器的不安全的警告</h3>
<ul>
<li>浏览器对于http的网站会在地址栏明确标记【不安全】字样</li>
<li>这样直接降低用户对网站的信任度</li>
<li>造成用户流失</li>
<li>甚至可能被用户误认为是钓鱼网站</li>
<li>如下图,是笔者的网站没有升级https证书的时候的样子</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202510/2149129-20251011191258054-1063395059.png" alt="企业微信截图_20251011153502" loading="lazy"></p>
<p>升级后的</p>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202510/2149129-20251011191308424-2043030498.png" alt="企业微信截图_20251011153512" loading="lazy"></p>
<h3 data-id="heading-2">2. 加密传输数据,防止数据泄露</h3>
<ul>
<li>这样理解,如果我们使用的是http的话,连接了一家咖啡厅的WiFi</li>
<li>而后执行登录操作,比如输入用户名密码:admin/admin123</li>
<li>输入了以后,黑客就能通过工具抓包,看到我们的请求参数的用户名和密码</li>
<li>于是,黑客就拿到了我们的用户名和密码...</li>
<li>实际上,除了能看到以外,甚至还能够修改我们的提交数据之类的</li>
<li>ssl证书通过非对称加密和对称加密,先验证身份,再用专属钥匙加密数据</li>
<li>这样,黑客就没办法了</li>
</ul>
<blockquote>
<p>SSL 证书通过加密用户与网站之间的通信(如用户输入的信息、浏览行为等)防止数据在传输过程中被黑客窃取或篡改。即使是个人网站,若涉及用户留言、登录(如后台管理)、简单表单提交等,HTTPS 能避免数据泄露风险。</p>
</blockquote>
<h3 data-id="heading-3">3. https拥有摄像头、麦克风、地理位置权限</h3>
<ul>
<li>若是http网站调用摄像头/麦克风,浏览器会直接拒绝</li>
<li>类似的,调用定位地理位置api,浏览器也会会弹出警告,甚至拒绝</li>
</ul>
<h3 data-id="heading-4">4. 有利于SEO搜索引擎优化</h3>
<ul>
<li>搜索引擎大厂,比如谷歌、百度优先https网站,排名更高</li>
<li>另外,也会降低http网站的权重,从而影响网站的流量</li>
<li>另外,HTTP/2、CDN 加速等,也严格要求使用https</li>
</ul>
<h2 data-id="heading-5">如何获取ssl</h2>
<h3 data-id="heading-6">免费的 Let's Encrypt</h3>
<p>Let's Encrypt:letsencrypt.org/zh-cn/</p>
<ul>
<li>Let's Encrypt提供免费的SSL证书</li>
<li>主流浏览器都支持</li>
<li>缺点就是证书有效期只有90天</li>
<li>需要每三个月手动更新一次</li>
</ul>
<h3 data-id="heading-7">付费的云服务器供应商提供</h3>
<ul>
<li>付费ssl证书也不贵,普通的也就几十块钱一年</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202510/2149129-20251011191341350-1728116977.png" alt="企业微信截图_20251011153519 - 副本" loading="lazy"></p>
<h2 data-id="heading-8">nginx代码控制</h2>
<h3 data-id="heading-9">下载nginx证书</h3>
<p>比如,笔者在腾讯云后台下载对应的ssl证书</p>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202510/2149129-20251011191407150-1025643764.png" alt="企业微信截图_20251011153527" loading="lazy"></p>
<p>&nbsp;下载好以后,解压能得到四个文件</p>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202510/2149129-20251011191419095-504002910.png" alt="企业微信截图_20251011153535" loading="lazy"></p>
<p>这四个文件分别是:</p>
<ol>
<li>
<p><code>ashuai.work.csr</code>——部署时不需要</p>
<ul>
<li>csr后缀全称:Certificate Signing Request(证书签名请求)</li>
<li>作用:这是我们在申请证书时生成的一个请求文件,包含了我们公钥和域名等信息,提交给 CA(腾讯云)用于签发证书。</li>
</ul>
</li>
<li>
<p><code>ashuai.work.key</code>——<code>部署时需需要</code></p>
<ul>
<li>全称:Private Key(私钥)</li>
<li>作用:这是生成 CSR 时同时产生的私钥,非常关键,必须保密,不能泄露。</li>
</ul>
</li>
<li>
<p><code>ashuai.work_bundle.crt</code>——<code>部署时需需要</code></p>
<ul>
<li>作用:这是证书链文件,包含了我们的域名证书 + 中间 CA 证书(有时也包括根证书),用于建立信任链。</li>
</ul>
</li>
<li>
<p><code>ashuai.work_bundle.pem</code>——部署时不需要</p>
<ul>
<li>作用:和&nbsp;<code>.crt</code>&nbsp;文件内容基本相同,只是扩展名不同。<code>.pem</code>&nbsp;是一种通用的证书编码格式(Base64 PEM 编码),很多系统都支持。</li>
<li>就是备用的.crt文件</li>
</ul>
</li>
</ol>
<h3 data-id="heading-10">在nginx.conf文件同级目录下,新建文件夹存放证书文件</h3>
<p>比如,笔者在服务器上的对应目录,新建一个名为cert的文件夹,用于存放证书文件</p>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202510/2149129-20251011191430702-1729165498.png" alt="企业微信截图_20251011153545" loading="lazy"></p>
<h3 data-id="heading-11">在nginx.conf写入使用证书的语法</h3>
<p>而后,在ngixn.conf文件内,把刚刚的证书文件,引入进来,并做如下配置</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;"># SSL 配置
ssl_certificate      cert/ashuai.work_bundle.crt; # 证书文件路径
ssl_certificate_keycert/ashuai.work.key; # 私钥文件路径
ssl_session_timeout5m; # 会话超时时间为 5 分钟
ssl_protocolsTLSv1.2 TLSv1.3; # 使用的协议
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # HIGH:!aNULL:!MD5; # 加密套件
ssl_prefer_server_ciphers on; # 让服务器优先选择自己支持的加密套件</pre>
</div>
<p>注意,这里的<code>cert/ashuai.work_bundle.crt; # 证书文件路径</code>&nbsp;的&nbsp;<code>cert/xxx.crt</code>表示同级目录,去找和nginx.conf同级目录的ashuai.work_bundle.crt这个文件</p>
<p>图示:</p>
<p><img src="https://img2024.cnblogs.com/blog/2149129/202510/2149129-20251011191454932-1648065106.png" alt="企业微信截图_20251011153554" loading="lazy"></p>
<h3 data-id="heading-12">80端口重定向到443、监听443端口,并禁用ip访问</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;"># 80端口的请求全部重定向到443端口
server {
    listen 80;
    server_name ashuai.work;
    return 301 https://$host:$server_port$request_uri;
}

#"兜底"配置,用于捕获所有未明确匹配其他server块的HTTPS请求(包括通过IP访问或非法域名)
server {
    listen 443 default_server ssl;# ← 核心配置
    server_name _;
    return 403;
}

server {
    listen       443 ssl;# 监听443端口并启用SSL
    server_nameashuai.work;

    # add_headerX-Frame-Options SANEORIGIN;#DENY
    # add_header'Referrer-Policy' 'no-referrer'
    add_header 'Referrer-Policy' 'origin';

    location / {
      ......
    }
}</pre>
</div>
<h3 data-id="heading-13">把原先的http的请求,转发到https</h3>
<p>得通过497的方式,nginx才会把http的请求,转发到https</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">http {
    include       mime.types;
   
    ......

    # SSL 配置
    ssl_certificate      cert/ashuai.work_bundle.crt; # 证书文件路径
    ssl_certificate_keycert/ashuai.work.key; # 私钥文件路径
    ssl_session_timeout5m; # 会话超时时间为 5 分钟
    ssl_protocolsTLSv1.2 TLSv1.3; # 使用的协议
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # HIGH:!aNULL:!MD5; # 加密套件
    ssl_prefer_server_ciphers on; # 让服务器优先选择自己支持的加密套件

    # 引入同级目录下的conf.d文件夹的所有的以.conf结尾的server配置
    include conf.d/*.conf;

    # 如果访问的是 HTTP,自动返回 497 并重定向到 HTTPS
    error_page 497 https://$host:$server_port$request_uri;
}</pre>
</div>
<div>
<h2>本文转载于:https://juejin.cn/post/7539732578423062569</h2>
</div>
<h3 id="tid-D8HBxE">如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。</h3>
<p><em><img src="https://img2024.cnblogs.com/blog/2149129/202501/2149129-20250122165814748-630765389.png" alt="" loading="lazy"></em></p><br><br>
来源:https://www.cnblogs.com/smileZAZ/p/19135814
頁: [1]
查看完整版本: 记录---图文并茂讲解nginx中http升级https(部署SSL证书)知识点总结