很多人觉得,HTTPS是公网的事,跟局域网八竿子打不着。反正数据又不出门,加密干嘛?但真到用的时候才发现,现代浏览器对HTTP的嫌弃越来越明显,摄像头权限、麦克风调用、地理位置那些API,全都要求安全上下文。换句话说,你不做HTTPS,很多功能在局域网里根本跑不起来。
先说结论:完全可以,而且方法不止一条。
最笨的办法,是自己生成一个自签名证书,往Nginx或者IIS里一挂,再让每台客户端的浏览器手动信任这个证书。这个办法能用,但坑很深。浏览器会一直弹警告,用户一脸懵,你还要跑到每台电脑上把证书装进受信任的根存储,麻烦程度堪比给全公司电脑装一次杀毒软件。
所以我更推荐另一个思路:在局域网内部搭一个私有CA(证书颁发机构)。你用自己的服务器签发证书,然后把根证书下发到所有客户端。只要根证书被信任,后续任何一台服务器要上HTTPS,你随时签一个子证书出来,浏览器统统认账,不会有任何红色警告。
具体怎么做?拿Linux环境举例,先准备一台机器当CA中心,安装openssl,生成根证书的私钥和自签名证书。这一步相当于你自己开了一家“证件作坊”,根证书就是作坊的公章。然后把根证书分发到Windows、Mac或手机里,双击导入,存放到“受信任的根证书颁发机构”。分发方式可以很粗暴,放个局域网共享,让大家自己装,也可以用组策略批量推,看你公司规模。

接下来,你要给真正的网站服务器生成一个CSR(证书签名请求),把这个请求送到CA中心,用根证书的私钥签一下,得到一张SSL证书。把证书和私钥部署到Nginx,配置一下443端口,完事。访问的时候,浏览器会看到你签发的证书,往上追溯发现它是由本地根证书签的,而这个根证书你又提前装好了,于是锁图标直接变绿,全程没有弹窗。
有人会问,这和自签名证书看起来差不多啊?差别很大。自签名证书的根证书和服务器证书是同一个,你装的时候要么被迫信任IP地址,要么会警告域名不匹配。而内部CA签出来的证书,可以指定SAN(Subject Alternative Name),把服务器名、IP地址都写进去,浏览器校验全通过,跟正规证书在体验上没有区别。
还有一点值得注意,局域网里访问网站,强烈建议用域名而不是IP。比如你可以在路由器的DHCP里加一条DNS记录,把web.local指向你的服务器,或者直接在每台客户端的hosts文件里写死。因为证书绑定的是名称而不是IP,你拿IP访问,浏览器照样翻脸。
至于安全性,得说实话。私有的CA体系,安全程度取决于你保护根证书私钥的水平。如果那台CA机器的私钥泄露了,别人就能随意签发证书,整个信任体系就崩了。所以拿到证书之后,最好把CA主机的私钥加密保存,甚至可以离线存到U盘里,平时拔掉不联网。你不这么做,跟裸奔也没区别。
数据要不要加密传输?要。要加密到什么力度?现在主流推荐TLS 1.2以上,用ECDHE密钥交换算法,这样前向保密,就算有人今天录了流量,以后也解不开。加密套件里别开那些已经过时的RC4、DES,浏览器自己都会嫌弃。
有人可能会想,直接用公网买一张证书行不行?买一张域名证书,要求域名必须能公网解析,你在局域网里用一个私有域名,证书机构不会给你签。除非你真有公网域名,然后通过DNS解析到局域网IP,这种骚操作不太建议,纯粹给自己添堵。
最后说个使用场景。我之前帮朋友在一家工作室装了这套东西,他们内部跑了一个文件服务器,套上HTTPS以后,手机浏览器访问再也不弹警告,上传大文件也稳定。后来还挂了一个内部OA系统,扫码登录、摄像头刷脸这些功能全都能用了。整件事花了一个小时,成本为零,唯一消耗的是耐性。
所以别再问“可不可以”了,真正的问题是“你愿不愿意折腾这一下”。架一个内部CA,给局域网加一层加密,其实没有想象中复杂,收益却实在。往大了说,这叫零信任架构的入门实践,往小了说,你的人再也不用被浏览器吓一跳了。