做站这些年,时不时就得给自己搞一张自签名证书。内网管理系统要上 HTTPS,测试环境要跑小程序,路由器后台界面要换个安全连接,这些场景你不可能为了它专门去买一张证书。很多人被“自签名”三个字吓住,以为要装一堆工具、点半天向导,其实真动手就知道,证书生成工具就一个,系统里自带的 openssl 就是它。一条命令把私钥和证书一起吐出来,连敲键盘加回车不超过十秒,剩下的全是细节。这篇就按我平时干活的顺序讲一遍:命令怎么敲,SAN 扩展为什么不能省,证书往哪导入,权限怎么设,以及这门手艺到底能用到哪一步为止。

先说清楚自签名证书是啥,什么时候才需要它
自签名证书,说人话就是自己给自己签发的证书,签发者和持有者是同一个人,没有第三方机构出来背书。它的作用是把浏览器和服务器之间的通道加密起来,让数据在传输路上别被人一眼看光;但它证明不了“这个站点就是它宣称的那家”,所以浏览器第一次见到它,态度很统一:警告。
常见的使用场景就那么几类:本地开发要测 HTTPS 才肯生效的功能,内网管理系统不想让同事的账号密码裸奔,路由器、NAS、打印机的后台界面换个加密连接,还有只从内网访问、量又不大的服务。判断标准很简单,访问的人全是你自己,或者你能当面叫他装证书的同事,那就放心用;只要面向陌生人,这条路直接堵死。
一条命令就能生成:openssl 到底怎么敲
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 3650 -subj “/CN=site.local” -addext “subjectAltName=DNS:site.local,DNS:*.site.local”
上面这句就是全部家当,复制过去把域名改掉就能用。它同时干了两件事,先生成一对密钥,再拿这对密钥签出一张证书,所以中途不会来问你任何问题,敲完回车,当前目录下就多了 key.pem 和 cert.pem 两个文件。逐段拆开看,-x509 表示直接生成自签名证书而不是证书请求文件;-newkey rsa:2048 是顺手生成一对 2048 位 RSA 密钥;-nodes 的意思是不给私钥再加一层密码,省得服务下次启动时停在原地等你输口令。
继续往后看,-keyout 指定私钥存到 key.pem,-out 指定证书存到 cert.pem,两个文件名别写反了,写反了后面配置服务时会一直报格式不对;-days 3650 是十年有效期,内网服务图省事可以这么设;-subj 塞进主体信息,这里只写了 CN,也就是 site.local;最后 -addext 补上 SAN 扩展。旧一点的 openssl 可能不认 -addext,那就先写一份配置文件,用 -config 和 -extensions 走老路子,具体以本机 openssl 的帮助和系统官方文档为准。
SAN 扩展不写,现代浏览器照样说不安全
这是新手最容易翻车的一处。早年的证书只看 CN 字段,也就是 Common Name,你把域名写在 -subj 里就算数;现在完全变了,主流浏览器校验的是 SAN,全称 Subject Alternative Name,CN 基本退居成给人看的备注。
你只写 CN 不写 SAN,证书装上去照样红警告,报的常是 NET::ERR_CERT_COMMON_NAME_INVALID 这类提示,点“高级”再点继续访问也未必放行。所以生成时务必把实际会用到的全部名字塞进 subjectAltName:site.local 给浏览器访问,*.site.local 兜住子域名,用 IP 直连的再补一项 IP,例如 IP:192.168.1.10。漏一项,从那个入口访问就得多看一次警告。
生成的 cert.pem 和 key.pem,一个公开一个要命
生成出来一个是证书 cert.pem,一个是私钥 key.pem,这两样东西的待遇必须分开。证书本来就是要发出去的,谁要看就给谁看,装在服务器上、发给同事、丢进配置文件路径都行;私钥是整条加密通道的命根子,一旦被人拿到,别人就能冒充你的服务,之前所有加密都成了摆设,等于白忙一场。
所以在 Linux 上第一件事就是把权限收紧:chmod 600 key.pem,意思是只有文件所有者本人能读写,同组用户和其他用户一律靠边站。改完敲一句 ls -l key.pem,看一眼输出最前面那几位,确认是 -rw——- 才算过关。另外两条老规矩也顺手记着,私钥别提交进代码仓库,别丢在网站能直接下载的目录里;要给 Web 服务用,就把文件属主换成跑服务的那个账号,别拿 root 身份硬跑。证书文件本身不用这么严,644 就够,它是公开信息。
把 cert.pem 导入受信任根证书机构,红警告才消失
证书生成完,浏览器还是会给它脸色看,地址栏照样挂着红叉,因为系统不认识签发它的那个“机构”。这里说的受信任根证书机构,就是你电脑或浏览器里那份受信任的证书清单,系统只认清单上的签发者,清单之外的签发者一律按可疑处理。把 cert.pem 装进去,让它从“来路不明的签发者”变成“我认可的签发者”,警告才会消失。这一步跟加密强度没关系,纯粹是信任关系的问题。
Windows 上的入口是运行框输入 certmgr.msc,打开证书管理器,找到受信任的根证书颁发机构这一项,右键导入,选中 cert.pem,一路下一步走完。macOS 用钥匙串访问,把文件拖进系统钥匙串,再双击打开、展开信任这一栏,把使用此证书时改成始终信任,会要求你输一次系统密码,这一步不点,前面的导入等于白做,浏览器照样报错。Linux 桌面环境各有各的图形工具,服务器端则要看具体发行版和服务的配置方式,没有统一入口。再提醒一句,Firefox 自带一套独立的证书库,不跟着系统走,得进它的设置里找到证书管理那一栏,单独导入一遍才生效。
导入证书时最容易踩的几个坑
第一个坑,导入时选错了存储位置,证书塞进了“个人”或者“中级证书颁发机构”,看着装成功了,浏览器照样不认,回头翻半天找不到原因,正确的位置是受信任的根证书颁发机构。第二个坑,装完不重启浏览器,标签页里依旧是那张红脸,别急着重装证书,先把浏览器彻底关掉再打开。
第三个坑,用 IP 访问的服务,SAN 里却没写 IP 那一项,警告一直在。第四个坑最要命,随手把别人给的一张根证书装进系统,等于把家里钥匙交给了陌生人,只装自己生成的那一份。第五个坑,公司内网几十台机器都要装,别一台台手动来,用组策略或者设备管理平台批量下发更省事,具体操作以各家官方文档的说明为准。
这类证书只能内网测试用,公网正式站得换 DV 证书
把话说在前头,自签名证书只适合内网和测试环境,公网正式站点坚决不能用。原因很直白:你的访客没理由、也不会去装你的根证书,他们打开页面看到的就是“不安全”三个字,然后关掉走人。手机上跳出来的警告更吓人,红底白字一路铺满屏幕,普通用户根本点不下去,更别说继续填表单或者下单了。
更麻烦的是,搜索引擎、社交平台和各家小程序在抓取或跳转时,遇到不受信任的证书经常直接拦掉,轻则掉排名掉流量,重则整个页面打不开。正式站该用 DV 证书,也就是域名验证型证书,现在免费的选择不少,用 ACME 客户端能自动续期,主机面板里往往点一下就能签。各家流程和界面不太一样,具体以服务商和官方页面的说明为准。
同一套工具还能顺手干点别的活
openssl 的本事不止签发证书,反过来用它看别人的证书更好使,手里没装任何额外软件也一样能干。想知道某个域名的证书是谁签的、什么时候过期、SAN 里写了哪些名字,在能连外网的 Linux 机器上敲一句 openssl s_client -connect 域名加冒号 443 -servername 域名,把返回内容里的证书段复制出来,再配合 openssl x509 -noout -text 看一眼,签发机构、有效期、SAN 扩展项列得清清楚楚,连证书链里缺了哪一环都能一眼看出来。
排查“证书过期了没有”“证书链装全了没有”这类问题,比在各种在线检测网站之间来回切页面省事,也不受网络波动影响。这招还适合写进定时检查脚本里,让机器每天替你盯一眼到期时间,比你自己记在小本子上靠谱得多,等哪天真的快到期了,提前几天动手换,总比被访客或者客户先发现强。
绕一圈总结下:自签名证书这件事,核心就一条命令加三个细节。命令是 openssl req -x509 那一串,细节是 SAN 扩展必须写全、cert.pem 要导入受信任的根证书颁发机构、key.pem 权限收紧到 600。剩下的判断标准同样干脆,自己人和自己能管的机器上用,随便用;公网正式站,老老实实换成 DV 证书,免费的就够使,别为省这点功夫把访客全劝退。把这套流程记进自己的运维笔记,下次再遇到内网系统要上 HTTPS,从生成到导入一气呵成,几分钟就能收工,也不用在群里到处求人。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!