资讯详情

资讯详情

内网HTTPS部署实战:自建CA、信任分发与Nginx配置全指南

前阵子帮某客户把一套内部业务系统部署到局域网服务器上功能调试全部完成最后卡在一个看似不起眼的环节客户IT要求内网访问地址必须走HTTPS不能用明文HTTP。我一开始觉得有点折腾内网都是公司自己人HTTPS不是公网才需要考虑的事吗等真正动手设计局域网部署方案时才发现这个需求背后有非常现实的原因实际踩出来的坑也比想象中多得多。这篇文章我就从“为什么内网也要上HTTPS”开始一路讲到局域网环境怎么绕开公网CA的签发限制、怎么让终端信任自建CA、Nginx怎么接、移动端怎么配置最后把那些我实际遇到的高频坑和排查思路一并整理了。适合正在做局域网业务系统部署的运维、后端开发和技术负责人参考尤其是那种内部系统一堆、安全要求又不低的企业环境。1. 为什么内网业务系统也需要HTTPS三个被忽略的现实理由1.1 内网不等于安全区明文口令在局域网里几乎是裸奔不少人习惯性地把“内网”默认为安全环境觉得外面的人进不来里面的都是自己人那就没必要加密了。这个想法在很早以前或许还行得通但现在的内网环境真的不像想象中那么封闭。局域网里用抓包工具抓明文HTTP流量难度比很多人以为的低得多。只要在同一交换机或同一Wi-Fi环境下抓到某个业务系统的HTTP请求账号密码基本就是明文写在包里的过滤一下username、password字段就能看到。我不止一次见到过这样的真实情况一个内部系统上线了几年一直用默认账号或者很简单的口令整个部门的人都知道这个密码。表面上没事但一旦某个同事无意中开了抓包工具或者内网里进了横向移动的恶意程序口令散播的速度会非常快。HTTPS解决的不是“防外贼”这一个点它至少能把传输层的口令保护起来让局域网里的批量嗅探和被动监听变得没有意义。把明文HTTP的账号密码比作写在明信片上寄出去沿途每个中转站都能看到内容HTTPS则是装进信封密封好中途即使被人截走也拆不开里面的口令。一个实实在在的验证就是部署完HTTPS之后再用抓包工具去看登录请求看到的只有密文和TLS握手协商的字节流业务字段已经完全不可读了。1.2 现代浏览器有大量功能只在HTTPS下开放第二条理由往往被业务系统开发团队忽略。现代浏览器把很多比较“敏感”的Web API限制在安全上下文Secure Context中而安全上下文的判定条件就是HTTPS或者本机localhost。换句话说只要你的内部系统还是用明文HTTP开放的很多浏览器能力就直接从功能列表里消失了。举个例子很多仓储、门店类的内部系统需要在网页里直接调用摄像头或者扫码枪这时要用到getUserMedia这个API它在HTTP页面下根本无法启用。类似的还有剪贴板写入、浏览器通知推送、Service Worker离线缓存、蓝牙接口、USB接口等这些API基本都要求页面处于安全上下文。以前做内网系统可能觉得这些能力用不上但随着业务方提需求越来越细迟早会遇到“怎么我的页面调不了摄像头报错说需要安全上下文”这种问题到时候再回头补HTTPS成本就明显大了。这条非常适合后端和前端团队提前理解内网上HTTPS不只是安全合规的事它还是能不能用上现代Web能力的前提条件。与其等业务需求来了再紧急改造不如第一次部署时就顺带上。1.3 安全合规审计的硬性要求第三条理由比较现实不管哪个行业现在很多安全检查和合规审计都会关注数据传输是否加密。尤其是内网业务系统如果涉及人员信息、财务数据、合同内容、客户资料明文HTTP在不少检查清单里会被直接判定为中危甚至高危问题。我见过不止一个项目功能都开发完了审计报告出来要求整改“内网传输未加密”最后被逼着在很紧的时间窗口里补证书、改配置、重新分发信任。与其等到审计发现问题再慌慌张张处理不如在上线阶段就把HTTPS规划进去。做IT这行很多问题不是技术门槛高而是“当初没想到、后面来补救”的代价太大。内网HTTPS就是一个典型前期多做一步后期能省掉一整轮紧急整改。2. 局域网HTTPS的三座大山域名、签发验证与终端信任2.1 第一座山内网业务系统往往没有可用的正式域名公网上给一个网站配HTTPS流程已经被各种工具简化得很成熟了申请域名、解析记录、自动签证书、配置Web服务器。但把这些流程原样搬到局域网里第一步就会卡住——内网业务系统通常没有正式域名。很多内部系统部署完以后大家访问的方式就是http://192.168.10.20:8080这种IP加端口。就算企业内网有自己的DNS起的名字也往往是erp.company.local或者oa.internal这种公网根本查不到的内部域名。证书签发机构验证域名所有权时靠的是公网DNS和公网可达性内部域名在这些验证流程里基本等于不存在因此走常规的公网CA通道根本走不通。这就带来了一个内网HTTPS特有的核心问题我们不是为了“证书而证书”而是要在“没有公网域名、无法走公网验证”的前提下建立起一个终端愿意信任的HTTPS访问通道。理解了这个前提后面所有方案就都围绕它展开。2.2 第二座山公网CA的签发验证流程无法在内网走通退一步说假设内网业务系统恰好有一个公司注册的公网域名只不过解析到了内网IP是不是就能顺利申请证书了也不一定。常用的自动签发流程里HTTP-01验证要求CA能从公网访问到服务器的80端口并获取到指定的验证文件DNS-01验证虽然不需要开放80端口但要求你能够通过API或人工操作公网DNS的TXT记录。这两个条件在内网环境里往往都不具备服务器本身没有公网映射或者企业出于安全考虑不允许开放外部访问又或者负责公网DNS的管理权限不在自己手里。这就是内网和公网部署HTTPS最大的差异之一。公网服务器可以让Lets Encrypt这类CA在很短周期内自动续签内网服务器连验证请求都收不到自然谈不上自动续期。很多团队在公网玩得很顺的“申请证书—自动续签”流程换成内网立刻失效。所以内网部署必须换一条路要么自建CA要么用企业内部CA服务要么在“恰好有正式域名”的前提下走常规CA申请但手动续期。2.3 第三座山终端要信任一棵“我们自己的根”HTTPS的信任机制本质上是一条“链式信任”服务器把证书发给客户端客户端从证书里读出签发者的信息然后在本地维护的受信任CA列表里寻找这个签发者找到了就认为证书可信找不到就弹出警告。公网上的正规CA之所以被浏览器信任是因为它们的根证书早就预装在Windows、macOS、Android、iOS以及浏览器里了。自签名证书之所以被人诟病并不是因为加密算法不安全而是因为它“自己证明自己”客户端找不到任何可信任的上游来佐证。浏览器为了避免中间人攻击只能给出红色警告页。想解决这个问题正确的思路不是“消除警告”这么简单而是自己动手搭建一棵可管理的信任树我们创建一台内部CA把它的根证书分发到每台终端终端装上之后就等于在这台设备上“预装”了一个受信任的根。这棵树虽然和公网CA的根不是同一个但从TLS信任模型上看完全成立。你完全可以把它理解为公网CA让全世界信任内部CA让公司内部的每台终端信任信任范围不同模型一致。很多人一听到“自建CA”就直觉觉得不安全其实真正不安全的是“根私钥保管不当”和“根证书分发失控”。只要这两个环节控制好了内网自建CA完全可靠这也是后面所有方案的基础认知。3. 方案选型自建CA、域证书服务还是商业证书3.1 三种方案先横向对比一下在我实际接触过的内网HTTPS部署里大致能归结为三条路线小型自建CA、Windows域证书服务、商业证书前提是有正式域名。为了做选择方便我把它们放在一起对比方案适用场景成本签发方式终端信任管理维护难度自建CAOpenSSL/xca小型局域网、终端数量少、无域环境免费手动签发链路由自己控制手动或半自动分发根证书中等灵活度高域证书服务AD CSWindows域环境、终端集中管理免费需要Windows Server自动注册、证书模板统一签发组策略自动下发企业根较高适合专职IT商业证书有正式域名且域名可被公网/内网解析按年付费CA自动或人工签发终端天然信任公网根无需额外操作最低从表里可以看出没有绝对的最优方案只有匹配环境的方案。如果你所在的企业本来就有AD域那AD CS带来的批量信任下发能力很香如果只是一个几十台终端的小局域网搭建一套完整AD CS反而过重轻量的自建CA反倒最顺手。3.2 小型局域网自建CA是最务实的路径自建CA这个词听起来像要搞很复杂的基础设施实际上用OpenSSL命令行加一个图形化管理工具一个人就能维护起来。我自己的习惯是把根CA放在一台不常开机的管理机上平时通过它签发服务器证书签发完成之后把根私钥冷备保存起来。给业务系统签发的服务器证书有效期设一年到期前通过脚本检查并提醒。这套流程对于一个几十台终端、几台服务器的内部环境来说已经非常够用。有人会问签发出来的证书和正规CA的证书有什么区别从协议层面讲没有本质区别都是X.509证书TLS握手流程完全一致。区别只在“信任根在哪里”正规CA的根被全世界预置信任自建CA的根被你自己分发的终端信任。企业内部的业务系统本来就只有内部员工访问信任范围完全可控这也是自建CA在内网场景下能被广泛接受的根本原因。3.3 有域环境用域证书服务统一下发如果公司本来就有Windows域环境那么用域证书服务AD CS来处理内网HTTPS会非常舒服。域内所有计算机可以通过组策略自动信任企业CA的根证书再配合证书模板和自动注册服务器证书也可以自动申请、自动续期平时基本不用人肉干预。但AD CS的配置复杂度确实比自建CA高不少要先部署企业CA角色配置证书模板的权限还要处理CRL分发点、组策略、Web注册页面这些东西。对没有专职Windows基础设施团队的小公司来说这套东西的学习和维护成本并不低。所以我的建议是有域就用域顺手没有域就不要硬套用自建CA达到的效果已经能满足绝大多数需求。3.4 有正式域名时直接使用商业证书最省心还有一种比较少见但极其省心的情况业务系统恰好有一个正式注册的公网域名虽然服务器在内网但可以通过公司内部DNS把域名解析到内网IP。这时候完全可以直接走商业证书或Lets Encrypt这类公网CA因为终端本来就预置了这些CA的根证书服务器证书签下来之后所有终端不需要做任何额外的信任配置浏览器打开就是绿锁。当然这条路的限制也很明显必须能控制域名的DNS记录而且域名所有者愿意把一个内网业务系统挂进去。适合有正规域名管理能力的企业不适合那些域名都散落在各个部门手里的混乱场景。如果满足条件这是我个人最推荐的方案因为它把“终端信任分发”这个最麻烦的环节整个省掉了。4. 实操用OpenSSL从零搭建内网CA并签发服务器证书4.1 环境准备目录结构与私钥管理我用OpenSSL手工搭CA已经有几年了习惯的目录结构是这样的ca/ ├── root-ca.key # 根私钥绝密 ├── root-ca.crt # 根证书用来分发给终端 ├── server.key # 某个业务系统的服务器私钥 ├── server.csr # 证书请求文件 └── server.crt # 签发后的服务器证书根私钥和服务器私钥最好分开存放。根私钥用于给服务器证书“盖章”不需要频繁使用服务器私钥是要交给Nginx/IIS用的必然会被业务服务器读取。如果图省事把根私钥直接放在Web服务器上一旦Web服务器被攻破整个内网的信任体系就形同虚设了。我的建议是在专门的目录里完成全部CA操作签发完证书之后把根私钥复制到离线保存的U盘上并给文件加上足够强的口令保护。4.2 创建根CA让终端信任的起点创建一个根CA本质就是生成一对根密钥然后自签一张根证书。命令如下# 生成根私钥使用RSA 4096位 openssl genrsa -out root-ca.key 4096 # 生成自签根证书有效期10年 openssl req -x509 -new -nodes -key root-ca.key -sha256 -days 3650 \ -subj /CN某公司内网根CA/O某公司/OUIT \ -addext basicConstraintscritical,CA:TRUE \ -addext keyUsagecritical,keyCertSign,cRLSign \ -out root-ca.crt这里有几个关键点。一是basicConstraintsCA:TRUE这是告诉所有终端“这张证书有资格签发其他证书”只有带了这个标志的证书才能被当作CA根来信任。二是我签了10年有效期因为根证书更换的成本非常高——根一旦更换所有终端的信任配置都要重新来一遍所以根证书有效期要给足。三是如果用的OpenSSL版本比较老req命令不认识-addext参数就把这两个扩展写进一个ext文件再通过-extfile引入效果一样。根证书生成后可以先查一下指纹留档openssl x509 -in root-ca.crt -noout -fingerprint -sha256把这个指纹记录在案以后终端安装根证书时用户可以核对指纹确认没拿错文件。4.3 生成服务器证书请求SAN字段必须同时覆盖IP和域名这一步是整个自建CA流程里最容易翻车的环节。以前签发证书的习惯是看CNCommon Name字段比如CN192.168.10.20就算给这个IP签了证书。但现在的浏览器尤其是Chrome 58之后的版本基本已经忽略CN真正决定证书是否匹配的是SANSubject Alternative Name主题备用名称字段。如果证书里没有包含用户访问时输入的那个域名或IP浏览器照样报不信任。正确做法是创建一个专门的CSR配置文件把业务系统访问会用到的主机名和IP都列在SAN里。比如某个业务系统用户会通过sys.internal.example.com访问服务器内网IP是192.168.10.20同时还有一个网卡地址是10.0.0.5那么配置文件可以这样写[req] prompt no distinguished_name dn req_extensions req_ext [dn] CN sys.internal.example.com O 某公司 OU IT [req_ext] subjectAltName alt_names [alt_names] DNS.1 sys.internal.example.com IP.1 192.168.10.20 IP.2 10.0.0.5然后一条命令同时生成服务器私钥和CSRopenssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -config server.cnf-nodes表示服务器私钥不加密存储这样Nginx在启动时不需要交互式输入口令。服务器私钥只在业务服务器上使用权限要收紧一般设置为只有root或运维账号可读。4.4 用根CA完成签核检查证书链与SAN拿着CSR去根CA那边签发这一步需要在能访问根私钥的机器上执行openssl x509 -req -in server.csr -CA root-ca.crt -CAkey root-ca.key \ -CAcreateserial -out server.crt -days 365 \ -extfile server.cnf -extensions req_ext-extfile这里把前面配置文件里[req_ext]下的SAN又带进了最终证书这一步非常容易漏。有人签出来的证书SAN是空的浏览器怎么访问都不匹配就是因为签发时没有显式传入扩展。-days 365是服务器证书有效期我建议就给一年不要学根证书给10年服务器证书保持较短的周期便于到期滚动更换。签发完成后先验证一下SAN有没有进去openssl x509 -in server.crt -noout -text | grep -A1 Subject Alternative Name正常输出会是这样X509v3 Subject Alternative Name: DNS:sys.internal.example.com, IP Address:192.168.10.20, IP Address:10.0.0.5到这一步证书文件已经可以交给业务系统了。如果是自建CA直接签服务器证书证书链只有两级服务器证书 → 根CA。将来如果为了进一步隔离根私钥的风险加了一层中间CA那Web服务器配置时记得把中间证书和服务器证书拼在同一个文件里否则有些客户端会因为补不全中间证书而报警。5. 部署与信任分发Nginx接入和终端装入根证书的正确姿势5.1 Nginx配置不只配证书还要处理代理头内网业务系统最常见的部署形态是Nginx在80/443端口做反代后面挂着Java、Node或者PHP的应用服务。拿到server.crt和server.key之后Nginx配置大致长这样server { listen 443 ssl; server_name sys.internal.example.com; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这里最容易被忽略的是X-Forwarded-Proto这个头。Nginx终止了TLS后面应用服务器看到的其实是HTTP请求。如果业务系统要根据协议判断请求是否加密或者框架需要生成基于HTTPS的绝对链接就必须依赖这个头知道“外部请求原本是HTTPS”。我曾经碰到过页面能打开、但接口全都请求HTTP的情况排了一圈才发现是后端框架没拿到X-Forwarded-Proto生成的API地址全错了。这个头在公网部署时很多人也会加但内网部署因为“觉得反代离得近”更容易漏。另外可以加一个80端口的跳转server { listen 80; server_name sys.internal.example.com; return 301 https://$host$request_uri; }这样用户即使输入了HTTP地址也会被自动带到HTTPS。不过要提醒一下如果业务系统本身有接口回调、或者有些老客户端不会跟随跳转上线前务必测试一遍关键业务流程防止跳转后出现接口跨协议调用的问题。5.2 Windows终端把根证书放进受信任的根证书颁发机构服务器端配置好之后真正的重头戏是让终端信任根证书。Windows终端的最简单方法是图形化安装双击root-ca.crt选择“本地计算机”然后放入“受信任的根证书颁发机构”存储区。全程下一步即可但有一个细节要反复强调位置一定要选对。命令行方式也可以管理员权限执行certutil -addstore -enterprise Root root-ca.crt如果不想影响整个机器、只影响当前用户可以用certutil -addstore -user Root root-ca.crt我见过很多“装了根证书但浏览器还是报警”的案例查到最后往往是证书被装到了“个人”存储区或者装到了“中间证书颁发机构”存储区。浏览器只会在“受信任的根证书颁发机构”里找根装错位置等于没装。如果公司有Windows域环境还可以通过组策略把根证书推送到所有域内计算机这才是真正省心的路径。域内电脑批量信任根证书再由AD CS统一签发服务器证书整条链可以做到全自动这也是域环境方案最大的吸引力。5.3 macOS与移动端钥匙串、描述文件与“完全信任”macOS上安装根证书相对简单双击证书文件钥匙串访问会弹出来导入到“系统”钥匙串然后在证书列表里打开证书的“显示简介”把“信任”里的选项改成“始终信任”。这一步很多人会漏只导入不设置信任级别浏览器还是会竖起警告。iOS稍麻烦一些。把root-ca.crt以附件形式发到手机用Safari打开并下载之后进入“设置 → 通用 → 关于本机 → 证书信任设置”把刚安装的根证书对应的开关打开也就是点一下“完全信任”。iOS的设计比较保守描述文件装完并不会自动生效必须在“证书信任设置”里做最后确认。几乎所有第一次做iOS内网HTTPS的团队都会在这里卡住一次。Android的情况在后面踩坑章节会专门展开这里先提一个结论Android 7以上第三方App默认不信任用户安装的CA证书手动装进去的根证书只对一部分系统应用和浏览器管用。如果企业App要在Android上走自建CA的HTTPS必须通过网络配置文件把用户CA也纳入信任范围或者通过MDM把证书装进系统凭据库。5.4 比部署更重要的统一入口域名与内部DNS在整个部署过程中我最想强调的建议是内网业务系统尽量不要继续用IP:端口的方式访问而是想办法在内部DNS里给系统起一个易记的内部域名比如sys.internal.example.com所有用户通过这个域名访问。原因有三个。第一证书SAN写域名比写IP更稳定以后服务器换IP了只需要改DNS记录证书完全不用动如果直接用IP签证书IP一变证书立刻失效。第二现代浏览器对IP SAN证书的支持虽然可以但多网卡环境下IP经常有多个SAN里漏掉一个就会导致一部分用户打不开。第三统一域名入口给后续扩展留了空间将来想加负载均衡、加WAF、做灰度发布都是围绕域名做文章比围着IP改配置优雅得多。没有内部DNS的小环境怎么办那就退而求其次用IP SAN证书同时务必将业务系统中实际会用到的所有IP放进SAN。我在生产环境见过服务器有两个网卡配置时只给其中一个IP签了证书结果某些网段用户访问另一个IP直接报错。这类问题不大但排查起来很费时间不如签证书时一次性列全。6. 内网HTTPS的五个高频坑与完整排查链路6.1 装了根证书依然报警从头排查证书链这是内网HTTPS部署中遇到最多的问题我把排查链路整理成一套固定的步骤遇到“根证书明明装了浏览器还是报不受信任”就按顺序走排查项验证方式常见结论服务器证书链是否完整openssl s_client -connect 127.0.0.1:443 -showcerts证书链缺失中间证书根证书是否安装在正确存储区证书管理器查看存储位置装到了“个人”而非“受信任的根”证书链上各证书是否过期查看每一级证书的Not After根或叶子证书过期SAN是否与访问地址匹配openssl x509 -in server.crt -noout -textSAN缺少对应域名/IP客户端系统时间是否准确查看终端时间/时区时间漂移导致证书“未生效”或“已过期”这套链路里最容易忽略的是第一条的完整链检查。用openssl s_client看输出时如果服务器只下发了一张叶子证书而叶子证书又不是由终端已信任的根直接签发的浏览器就会因为补不全证书链而报警。输出的“Certificate chain”应该能看到完整的两级或三级证书。服务器端证书文件拼接时顺序必须是“叶子证书在前中间证书在后”搞反了同样会导致链不完整。6.2 用IP访问与用域名访问的证书匹配差异一张证书可以同时包含DNS SAN和IP SAN但浏览器匹配时是精确对号的你用域名访问它就只看DNS SAN你用IP访问它就只看IP SAN。两者不匹配照样报警。之前我处理过一个案例业务系统同时支持sys.internal.example.com和192.168.10.20两种访问方式签证书时只写了域名结果用域名访问正常用IP访问的同事全部被警告拦截。后来把IP补进SAN重新签了一张才算彻底解决。另外要留意一些比较老的客户端设备和自研客户端它们对IP SAN的支持并不好可能在证书验证阶段直接失败。如果业务系统受众里有这类设备尽量走域名访问别依赖IP SAN。6.3 Android 7以上App默认不信任用户CA做Android端的企业App时这个问题非常典型。Android 7.0开始应用默认的信任锚列表里只包含系统CA不包含用户安装的CA。也就是说用户在系统设置里手动安装的根证书Chrome这类系统浏览器可能认但第三方App默认不认结果就是“根证书装了App依然报证书无效”。要解决得从App配置入手。Android开发时可以在res/xml下新建一个网络配置把用户CA也加入信任范围network-security-config base-config cleartextTrafficPermittedfalse trust-anchors certificates srcsystem/ certificates srcuser/ /trust-anchors /base-config /network-security-config然后在AndroidManifest里给application加上android:networkSecurityConfig引用。如果不想让每个App单独改配置更彻底的办法是通过MDM统一推送证书到系统CA存储区但这需要设备有相应的管理能力。此坑的教训是Android端自建CA方案不能只靠“装根证书”一步还要考虑App层是否认账。6.4 iOS的“完全信任”开关没打开iOS的问题前面已经提过这里单独拿出来说是因为这个开关藏得太深。很多用户照着文档装完描述文件以为万事大吉结果Safari访问HTTPS还是提示不受信任。运维人员如果自己没踩过这个坑很难想到问题出在“证书信任设置”里的手动开关。给终端用户写安装说明时一定要把“设置 → 通用 → 关于本机 → 证书信任设置 → 完全信任”这一步写进去最好配上截图。这个步骤不做iOS上的一切都是白配置。6.5 证书到期引发的“一夜全线报警”自建CA签发的证书没有自动续期机制不像Lets Encrypt有脚本定时续期。很多团队部署完HTTPS就再也不看证书直到某天早上业务部门打电话说系统全部打不开才跑去检查Nginx日志。一看证书过期时间赫然是昨天。我的做法是服务器证书有效期只给一年同时把到期检查放进运维日历。每个季度用一条命令把证书目录下的所有证书到期时间打出来看一眼for f in /etc/nginx/ssl/*.crt; do echo $f - $(openssl x509 -in $f -noout -enddate) done这条命令虽然简单但比任何监控系统都来得直接。到期前一个月、前一周各提醒一次基本就不会出“一夜全线报警”的状况。7. 证书生命周期管理与到期提醒的小技巧7.1 根证书离线保管服务器证书一年一换把根私钥当成压箱底的财产来对待。平时签发证书用的承载机尽量不接入业务网络根私钥文件用完之后立刻从工作目录移走冷备到一个带口令保护的压缩包里甚至可以同时存两个U盘分开放置。这样做的好处是即使某台业务服务器被攻破攻击者拿到的也只是该服务器的私钥而无法控制CA去签发新证书冒充其他系统。整个CA信任体系的底线就在这里。服务器证书则相反不建议签太长有效期。一年一签、一年一换配合上面说的检查脚本滚动更换成本很低。根证书给10年、服务器证书给1年这套组合在实际维护中非常顺手。7.2 一个不起眼但很实用的到期检查脚本上面那串openssl命令可以再包装成一个小脚本放在crontab里每周跑一次当月数少于30天时输出警示。示例如下#!/bin/bash for f in /etc/nginx/ssl/*.crt; do enddate$(openssl x509 -in $f -noout -enddate | cut -d -f2) days$(( ( $(date -d $enddate %s) - $(date %s) ) / 86400 )) if [ $days -lt 30 ]; then echo WARN: $f expires in $days days ($enddate) fi done各家环境里的日期格式和路径可能不一样但只要核心逻辑跑通这个脚本就能帮你提前发现所有即将到期的证书。内网HTTPS最怕的就是“没人记得证书还会过期”用脚本把这个隐患变成定时提醒运维压力会小很多。7.3 最后分享一点心得做内网HTTPS部署这些年我最大的体会是技术本身并不难难的是把“信任链”当作一项长期运维资产来经营。公网方案之所以省心是因为信任根被别人维护好了内网方案之所以繁琐是因为信任根交到了自己手上从根私钥的保管、服务器证书的签发到终端的分发、到期前的换证全部都要自己负责。如果你正在规划一套局域网业务系统部署我的建议是第一批就老老实实把HTTPS做进去哪怕当前系统对加密的需求没那么迫切。原因很简单局域网里最贵的成本不是证书签发而是事后整改和临时救火。把自建CA、内部DNS、根证书分发、到期检查这几件事做成流程固定下来以后每上线一套新系统都直接复用整个内网的访问体验和安全水位都会稳定很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →