
前阵子给一台ESXi主机做了一次HTTPS访问改造用阿里云免费SSL证书替换掉了VMware默认的自签证书。整个过程比想象中简单但坑也不少。写这篇东西把我从证书申请、格式检查、上传替换到验证的完整流程梳理一遍也把遇到过的几个报错一起列出来。如果你手里也有一台ESXi现在每次打开管理界面浏览器都会提示“证书无效”或者说你想看到那把“小绿锁”这篇文章应该能帮你省掉不少试错成本。说句实在话ESXi默认的管理方式并不算安全浏览器访问IP地址时总会弹证书告警看起来非常不专业。更现实的问题是随着虚拟化环境里跑了越来越多的业务管理界面的访问安全性就越来越不该被忽略。阿里云免费SSL证书现在申请起来很快DNS验证通过后几分钟就能签发个人折腾和中小企业使用都够用根本不花钱。1. 先搞清楚这套方案的整体思路1.1 ESXi默认证书为什么会被浏览器嫌弃VMware ESXi安装完成之后系统会生成一张自签名证书。自签证书不是由受信任的CA机构颁发的所以浏览器、操作系统、客户端工具都不会主动信任它。你访问https://192.168.1.10/ui这类地址时Chrome也好、Edge也好都会先给你一个大大的警告页面告诉你“您的连接不是私密连接”或者“证书不受信任”。如果你只是自己测试环境里点两下可能觉得无所谓但这个告警背后有实际影响一些基于API的自动化脚本、vCenter注册流程、vSphere SDK连接都可能因为证书不受信任而拒绝通信。就算只是日常维护每次登录都要多点一步“继续前往”时间久了也烦。而且自签证书一旦涉及公网暴露很容易被人利用中间人攻击明文流量和握手过程都存在风险。ESXi本身支持替换证书官方设计的证书管理机制就是从VMCA签发证书切换到用户自定义证书。我们要做的就是把一张受信任CA签发的正式证书替换掉ESXi系统里生成的临时证书。浏览器再次访问时证书链可以被验证到根CA地址栏自然就干净了。1.2 为什么推荐阿里云免费证书而不是自己搭CA有人可能会问既然只是内网访问自己搭一个CA服务器然后分发根证书不就行了技术上可行但实际操作起来维护成本一点都不低。你需要在Windows Server或者OpenCA上维护CA服务需要给每一台客户端电脑安装导入根证书还要处理证书吊销列表和过期轮换。个人玩家维护一台ESXi做这种工程明显不划算。阿里云免费证书解决的是“信任链”问题。它由阿里云合作的CA机构签发全球主流的浏览器和操作系统都预置了对应的根证书不需要你在客户端做任何额外配置。申请流程也足够简化DNS验证基本全自动比找CA机构人工审核省太多时间。对于一般的小型虚拟化环境、家庭实验室、分公司机房用免费DV证书完全够。当然免费证书也有它的限制比如目前阿里的免费证书主要是单域名证书不支持通配符域名有效期一般也比付费证书短。这个后面会专门讲对ESXi应用场景来说影响不大我们本来也只是给一个主机名做证书。1.3 整体流程与技术可行性整个任务的链路并不复杂概括下来就是准备一个域名、把域名解析到ESXi、在阿里云申请证书、下载证书文件、把证书和私钥上传到ESXi、替换默认证书、验证HTTPS访问。核心难点其实只有两个一个是证书文件格式是否正确另一个是替换操作是否做成持久化。ESXi支持的证书格式是PEM。阿里云下载的Nginx格式证书压缩包里正好是PEM格式的证书文件和KEY格式的私钥文件天然适配。ESXi的UI管理界面也提供了证书替换功能如果你不想碰命令行纯界面操作就能完成。喜欢脚本化操作的同学ESXi Shell里也保留了证书管理命令也支持全命令行替换。两种方式我们都会讲到你可以根据自己的习惯选一种执行。2. 动手前必须做好的准备工作2.1 域名解析和访问规划证书跟域名是一一绑定的所以第一步必须确定一个你拥有控制权的域名。比如我的情况是准备让ESXi通过esxi.example.com这个地址访问那就需要让这个域名解析到ESXi的IP。如果ESXi是在内网你就在内网DNS服务器上加一条A记录指向ESXi的管理IP。如果没有内网DNS还有一种简单做法直接修改你本地电脑的hosts文件把域名指向ESXi IP。这也能满足证书验证要求前提是浏览器访问时用的域名必须和证书里的域名完全一致。如果ESXi需要公网访问那就需要在公网DNS服务商那里添加A记录同时在路由器上把443端口映射到ESXi的管理IP。注意一点ESXi管理端口默认就是443公网端口映射的时候尽量不要改成其他端口否则你访问时就得手动带端口证书验证的逻辑也会略麻烦。这里有个特别容易踩的坑证书域名、访问域名、ESXi主机名三者必须统一。很多人在阿里云申请了esxi.example.com的证书结果ESXi登录界面还是通过IP访问那浏览器一样会提示证书不匹配。最省心的方法就是先把ESXi的DNS主机名设置为完整域名然后通过域名访问。2.2 阿里云免费SSL证书申请步骤申请证书环节其实在阿里云控制台里看一遍就会了我按自己操作的路径完整写一遍登录阿里云控制台顶部搜索框输入“数字证书管理服务”点击进入。在“SSL证书”菜单下选择“免费证书”或“个人测试证书”。现在阿里云的免费证书产品名称偶尔会调整但入口基本都在这个区域。点击“创建证书”或“申请证书”填写一个主域名比如esxi.example.com。选择验证方式强烈建议选“DNS验证”。提交申请之后系统会给出一个TXT记录值格式类似_dnsauth.esxi主机记录对应一个随机字符串。到你的域名DNS服务商后台添加一条TXT解析记录。等1到3分钟回到阿里云控制台点击“验证”状态会变成“已签发”。签发完成后点击“下载”选择服务器类型为“Nginx”下载zip压缩包。压缩包里面有两个文件一个后缀是.pem一个后缀是.key。.pem是证书文件.key是私钥文件这两个文件就是我们接下来要用的关键材料。需要提醒的是阿里云免费证书的配额逻辑是以自然年为周期的每年能申请的免费证书数量有限额。另外证书有效期通常只有12个月也有部分产品调整成了3个月。申请前最好在控制台看清楚说明另外我是建议把续期日历提醒设上不然到期那天才发现管理界面又开始挂了。2.3 证书文件的格式检查与匹配校验下载下来的证书文件和私钥不要不检查就直接传到ESXi上很多导入失败的问题都是因为前期没做好校验。我每次拿到证书都会先在本地跑一遍OpenSSL。先用下面两条命令分别打印证书和私钥的公钥指纹openssl x509 -in esxi.example.com.pem -pubkey -noout | openssl md5 openssl pkey -in esxi.example.com.key -pubout | openssl md5如果两边的MD5值完全一致说明证书和私钥是匹配的可以放心使用。如果不一样那说明文件选错了或者从阿里云下载时就出了岔子就别往后操作了直接重新下载。再看一眼证书的详细信息确认有效期、域名、扩展内容openssl x509 -in esxi.example.com.pem -text -noout重点看Subject和Subject Alternative Name里面应该包含你要用的域名。再看Validity里的起始和结束日期提前确认不是快过期的状态。还有一个容易被忽略的问题证书链。阿里云下载的Nginx格式.pem文件有些版本只包含服务器证书本身不包含中间CA证书。如果ESXi替换后提示“不受信任”或者浏览器报链不完整就需要把中间CA合并到同一个.pem文件里。最简单的办法是打开证书文件确认文件里是否存在BEGIN CERTIFICATE出现多次。如果只有一层且导入后有问题可以尝试从阿里云下载时选择“其他”格式或者在下载压缩包里寻找中间证书文件合并后再导入。3. 完整实操从证书申请到HTTPS访问3.1 把证书文件安全送到ESXi主机现在我们手里有了esxi.example.com.pem和esxi.example.com.key接下来要做的就是传输到ESXi主机里。ESXi默认不开启SSH先到主机界面开启SSH服务。操作路径是登录Host Client在左侧导航栏选中主机进入“操作”菜单找到“服务”点击“启用安全ShellSSH”。启用之后就可以用scp命令直接传文件了。scp esxi.example.com.pem root192.168.1.10:/tmp/ scp esxi.example.com.key root192.168.1.10:/tmp/传完之后建议用SSH登录到ESXi主机上检查文件是否完整ls -lh /tmp/esxi.example.com.pem /tmp/esxi.example.com.key如果权限不安全顺手改一下私钥文件不需要太开放chmod 644 /tmp/esxi.example.com.pem chmod 600 /tmp/esxi.example.com.key这里提醒一句SSH服务用完之后记得重新关掉尽量不要让ESXi长期开放SSH端口。等整个证书替换做完就立刻去关闭。3.2 在ESXi管理界面上替换证书最稳妥、也最推荐新手操作的是直接在Host Client的界面里完成证书替换。登录ESXi的UI界面地址可以用IP访问比如https://192.168.1.10/ui。登录之后左侧选中你的主机然后点“管理”Manage选项卡。在“管理”下面找“安全”Security再点“证书”Certificates。页面会显示当前系统正在使用的证书信息包括颁发者、到期时间等。在证书信息页面找到“证书操作”下拉按钮点击并选择“替换证书”。页面会弹出替换窗口分别选择本地的.pem文件和.key文件。如果你在前面检查时发现证书链不完整而界面里提供了CA证书上传框就把中间CA也一起上传。点击“替换证书”ESXi会开始执行替换过程中可能会提示“管理服务将重新启动”之类的信息。确认后等待片刻界面会自动刷新。替换完之后千万别急着点页面上的任何东西。ESXi的管理代理需要一点时间重启通常是几秒钟到半分钟。看到登录页面重新出现后再关闭当前浏览器标签页重新用域名访问https://esxi.example.com/ui。有一定概率替换过程顺利完成但是UI界面还停留在旧状态。这时候不用管刷新一下页面再用https://esxi.example.com访问地址栏应该就是一把锁了。3.3 喜欢命令行的同学可以这样操作如果你恰好和我一样更喜欢脚本化、少点鼠标的管理方式也可以用ESXi Shell里的证书管理命令。前提仍然是开启了SSH并且已经用scp把文件传到了/tmp。登录ESXi的SSH终端先确认证书管理工具的位置find / -name vmware-cert-mgr 2/dev/null在ESXi 6.x及以后版本一般情况下路径是/usr/lib/vmware/sbin/vmware-cert-mgr。直接执行替换命令/usr/lib/vmware/sbin/vmware-cert-mgr --replace --cert /tmp/esxi.example.com.pem --key /tmp/esxi.example.com.key如果你的证书链确实需要单独提供可以加上--chain参数指定CA链文件/usr/lib/vmware/sbin/vmware-cert-mgr --replace --cert /tmp/esxi.example.com.pem --key /tmp/esxi.example.com.key --chain /tmp/chain.pem命令执行完成后有两种选择一种是重启整个ESXi主机另一种是只重启管理服务。最省心也最彻底的是重启主机命令是reboot如果不想重启物理主机可以尝试重新启动管理代理services.sh restart不过实测下来services.sh restart有时候会导致连接断掉而且个别模块不会彻底刷新证书状态。所以我个人大多数情况下还是直接重启ESXi虽然多花两三分钟但换来了干净稳定的状态。重启完成后重新用域名访问如果SSL证书状态显示正常就说明替换成功了。3.4 验证HTTPS访问结果证书替换完不要只看一眼浏览器地址栏就收工。我习惯做三层验证第一层浏览器访问验证。用无痕窗口打开https://esxi.example.com/ui看浏览器是否直接进入登录页面不再出现证书告警。如果看到一把锁点击锁图标能看到“连接是安全的”以及证书详情这就说明证书链验证通过了。第二层命令行验证。在本地电脑上执行OpenSSL客户端测试直接检查ESXi的443端口返回的证书信息echo | openssl s_client -connect esxi.example.com:443 -servername esxi.example.com 2/dev/null | openssl x509 -noout -subject -issuer -dates输出结果里subject应该显示CNesxi.example.comissuer应该是阿里云对应的CA机构日期覆盖当前时间。这一层验证能确认服务器端真正返回的是新证书。第三层vCenter或者API层面验证。如果你环境里还有vCenter或者其他使用SDK的脚本重新测试一下连接是否正常。由于证书已经受信任原来报“unrecognized certificate”的脚本通常不会再报错。4. 常见问题与排查技巧实录4.1 浏览器仍然提示“不安全”或证书错误这是最常见的问题但原因通常集中在几个点上。我整理了一张速查表基本可以覆盖95%的场景。现象可能原因排查思路浏览器显示域名/IP不匹配访问的域名和证书域名不一致确认访问地址必须是esxi.example.com而不是IP证书不受信任证书链不完整或中间CA缺失打开证书文件检查是否包含完整链必要时合并中间CA有证书但一直提示“正在连接”ESXi管理代理未完全重启等1分钟刷新页面或重启ESXi主机第一次访问正常重启后老毛病又犯旧证书未彻底清理或证书替换未持久化检查证书列表重新执行替换并重启主机浏览器提示“时钟问题”主机时间与授权时间偏差在ESXi里配置NTP同步时间证书链不完整这一点尤其值得展开。ESXi在验证自建证书时会把服务器证书一直验证到根CA。如果中间少了一环系统就会认为证书不可信。阿里云有些下载包的证书文件只包含叶子证书这时候打开证书文件如果只看到BEGIN CERTIFICATE出现一次就建议把中间证书追加到同一个文件后面或者使用证书下载包里附带的“chain”文件。4.2 导入时报“证书和私钥不匹配”这个报错在UI导入时特别容易遇到。原因一般是文件选错了或者私钥格式不对。阿里云下载包里的.key文件通常是标准的PEM格式但如果你中途用文本编辑器打开过或者在Windows上复制粘贴时丢了空行就可能导致文件损坏。在本地执行一次指纹校验确认证书公钥和私钥公钥一致openssl x509 -in esxi.example.com.pem -pubkey -noout | openssl md5 openssl pkey -in esxi.example.com.key -pubout | openssl md5两个结果必须完全相同。如果不同从阿里云重新下载或者检查私钥文件开头是否以-----BEGIN PRIVATE KEY-----格式开头。如果私钥被加密过开头可能是ENCRYPTED PRIVATE KEY需要先解密因为ESXi不会要你输入私钥密码。4.3 替换证书后重启ESXi证书又被还原这个问题我踩过不只一次十有八九是证书替换只改到了内存没有写进持久化配置。体现在界面上刚替换完是正常的重启主机之后又变回VMware自签证书。出现这种情况优先检查你替换时用的命令是否有返回错误。如果使用的是UI替换确认替换过程中没有中途关闭页面。如果使用的是命令行替换完成后一定要等命令完全退出再执行重启。另外注意ESXi实际上有多个证书存储位置比如主机证书、管理平面证书等。UI上的“证书操作”默认替换的是系统服务证书理论上就是正确的入口。如果重启后恢复原样可以尝试用命令行方式再执行一次然后重启确认。我后来养成了一个习惯替换完证书之后先重启一次ESXi确认证书依然是新证书再继续做其他配置。避免辛辛苦苦配了半天最后发现证书其实没有真正持久化。4.4 免费证书续期提醒与自动化检测阿里云免费证书有效期不像付费证书那么长在到期前一定要重新申请、续期、再导入。我没有完全依赖邮箱提醒因为有时候提醒邮件确实会被忽略掉。我一般是在自己的电脑上配一个简单的定时任务提前检测证书到期时间。比如用下面这条命令拿到证书的结束时间echo | openssl s_client -connect esxi.example.com:443 -servername esxi.example.com 2/dev/null | openssl x509 -noout -enddate然后对照当前日期判断是否需要续期。虽然免费证书到期前阿里云会发短信提醒但自己掌握主动权始终更稳妥。等到证书快到期时再走一次“申请新证书-下载-上传-替换”流程即可。整个过程十几分钟基本不费事。5. 后续还可以做的安全加固与扩展5.1 顺手关掉不用的服务证书替换完成之后第一件事是关闭SSH服务。如果没有特殊需求不建议让ESXi长期开放SSH。这个端口很容易被扫描爆破哪怕密码策略做得再好暴露一个不必要的管理入口也是负资产。路径还是在Host Client的“操作”菜单里找到“服务”点击“禁用安全ShellSSH”。如果你平时还需要命令行管理那就设置防火墙规则只允许特定管理网段访问22端口。另外ESXi的443管理端口不建议直接暴露到公网。如果确实需要在外部访问优先考虑通过防火墙或堡垒机做来源IP限制而非完全裸奔。更保守的做法是彻底关闭公网映射只在内网访问配合跳板机二次认证。5.2 多台ESXi主机的证书管理思路如果实验室或者公司环境里有不止一台ESXi可以考虑给每台主机申请一张独立的免费证书自己做一个表格记录主机名、证书域名、到期时间和替换日期。因为免费证书不能做通配符一个域名证书只能绑一台主机强行多个IP共用一张证书反而会引发匹配问题。如果你的环境已经引入了vCenter情况会复杂一点。vCenter本身也有自己的证书体系ESXi主机的证书会被vCenter纳管。如果vCenter已经在管理这些主机证书替换可能需要通过vCenter的证书管理界面统一操作避免两边的证书不一致。这里要特别提醒在纯ESXi独立主机场景下UI替换没问题但一旦接入了vCenter务必确认ESXi主机证书能被vCenter信任否则主机显示“已断开”或者“证书无效”的状态会很折腾。5.3 把HTTPS证书这件事扩展到其他服务ESXi换好证书后你会发现这种“给管理界面换正式证书”的思路完全可以复用到其他服务上。比如内部搭的GitLab、Nginx、OSS、对象存储、监控面板只要你有域名都可以用同款流程申请证书并配置。多台机器统一使用受信任证书整个内网的安全体验会提升一大截。如果你后续想更省事也可以研究一下脚本化的证书续期方案把申请、上传、替换做成一条命令。阿里云有对应的API和SDK可以调用OpenAPI签发证书再通过SSH或HTTP推送到目标主机。不过免费证书本身有签发次数限制自动化之前记得看清楚配额。我个人在实际操作中的体会是ESXi的HTTPS改造这件事本身并不难难点全在细节。只要把域名、证书链、重启这三个环节搞透基本上就能一次成功。建议所有做虚拟化运维的朋友们无论如何都别再用默认的自签证书顶着生产环境跑改造成本真的很低但安全感是完全不同的量级。