华为老 AC 的 Web 页面打不开,这个问题困扰我很久了。设备还能通过 SSH 管理,但用浏览器打开管理地址,就卡在证书错误上:

ERR_SSL_SERVER_CERT_BAD_FORMAT

看到老设备报这种错,很容易往浏览器兼容性上想。这次把设备实际发出来的证书拿出来检查,才发现问题出在证书本身。

证书还没过期,但里面有一个字段用了 PrintableString 编码,内容却包含这种编码不允许的字符。换一个独立的证书解析库去读,也会报 AttributeValue::PrintableString 错误。

这就解释了为什么单纯信任证书解决不了问题:浏览器连这张证书都没能正常解析,后面的信任校验还没走到。关于这类字符限制,RFC 5280 附录 B里有说明。

另外,旧证书还缺少与管理 IP 匹配的 SAN,也就是证书里的“使用地址”。所以这次换证时,也把管理 IP 补了进去。

找到原因后,处理办法就清楚了:用内部 CA 签发一张新证书,把证书和对应私钥导入 AC,再让 Web 管理服务使用它。管理电脑已经信任这个 CA,所以换完后不用再调整这台电脑的信任设置。

下面按操作顺序写。AC 是 AirEngine9700S-S,软件为 V200R019 系列;IP、账号和文件名都做了替换,文中的 192.0.2.10 是示例地址。老 FW 的命令有些不同,放在后面单独说。

第一步,先留好 SSH 会话,记下原来的配置

Web 已经不好用了,后面的操作都通过 SSH 完成。如果手边有 Console,也可以用 Console。

先把下面几条命令的输出保存下来:

display version
display http server
display ssl policy default_policy
display current-configuration
display saved-configuration

我这台 AC 原来绑定的是 default_policy。你的设备不一定叫这个名字,以 display http server 的结果为准。

后面会新建一个叫 web_mgmt 的策略,原策略先保留。万一切换后有问题,还能通过 SSH 切回去。整个操作做完之前,这条 SSH 会话不要关。

第二步,准备新证书

我这次用内部 CA 签发,设备证书采用 RSA 2048 位密钥、SHA-256 签名,有效期设为一年。最容易漏掉的是 SAN:如果平时用 IP 访问,就要把这个 IP 写进去,不能只填 CN。

下面把签发过程写成 OpenSSL 命令,方便手工操作。如果公司已经有统一的证书申请流程,提交 CSR,让 CA 按这些要求签发即可。

先生成设备私钥和证书申请文件:

openssl req -new -newkey rsa:2048 -sha256 -keyout device.key -out device.csr -subj "/O=Example/CN=192.0.2.10"

按提示设置私钥密码。然后新建一个 device-ext.cnf 文件,内容如下:

basicConstraints = critical,CA:FALSE
keyUsage = critical,digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:192.0.2.10
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer

其中 192.0.2.10 换成实际管理 IP。用域名访问的,则填对应的 DNS SAN。

假设已经有内部 CA,公钥证书叫 mgmt-ca.pem,私钥叫 mgmt-ca.key,在保管 CA 私钥的电脑上签发:

openssl x509 -req -in device.csr -CA mgmt-ca.pem -CAkey mgmt-ca.key -CAcreateserial -out device.pem -days 365 -sha256 -extfile device-ext.cnf

CA 私钥留在签发电脑上,后面不需要上传到设备。这条命令适合说明手工签发过程;已有企业 CA 的,继续走原来的签发和证书管理流程。OpenSSL 签发参数说明

签完先检查一下:

openssl x509 -in device.pem -noout -subject -issuer -dates -text
openssl verify -CAfile mgmt-ca.pem -purpose sslserver -verify_ip 192.0.2.10 device.pem

确认地址、用途和有效期都对。这里按 CA 直接签发写的;有中间 CA 时,还需要提供中间证书链。OpenSSL verify 参数说明

接下来把设备证书和私钥打成 P12 包。这一步有老设备的兼容性问题,我这台 AC 最后使用的是下面这组参数:

openssl pkcs12 -export -inkey device.key -in device.pem -out device-web.p12 -name device-web -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -macalg sha1 -iter 50000

执行时会要求输入私钥密码,再设置 P12 的导出密码。这版 AC 的导入密码最长支持 32 个字符,使用 16~32 位随机字母数字比较方便。

这里虽然出现了 SHA-1 和 3DES,但它们用在 P12 文件的封装上,设备证书的签名仍然是 SHA-256,后面的 HTTPS 也没有配置成 3DES。这个写法是为了兼容旧固件,较新的设备可以按自身支持情况使用现代封装参数。OpenSSL PKCS#12 参数说明

还有一个实际遇到的问题:一开始把 CA 证书也放进 P12,再导入时出现了重复证书错误。后来改成 CA 单独导入,P12 里只放设备证书和私钥,就顺利过去了。因此,上面的命令没有加 -chain 或 -certfile。

第三步,把文件传到 AC

要传的文件只有两个:mgmt-ca.pem 和 device-web.p12。

我用的是 SFTP。已有 SSH 管理账号的情况下,在 AC 上给账号配置文件目录,并临时开启 SFTP:

system-view
aaa
local-user netadmin ftp-directory flash:
quit
sftp server enable

netadmin 换成自己的管理员账号。然后用 WinSCP 等工具,以 SFTP 方式连接设备,端口使用实际 SSH 端口,我这里是 22。把两个文件上传到 flash:/。

这几条命令是在已有 SSH 账号和权限的基础上加的。如果设备还没配置过 SSH/SFTP,需要先按对应版本完成配置。

P12 里带着设备私钥,不要把它当普通附件到处传。上传完成后,可以回读文件、比对哈希,确认传输没有损坏。

第四步,导入证书,把私钥关联起来

下面这些命令在系统视图执行。新建一个 PKI 域,名字叫 web_mgmt:

pki realm web_mgmt
quit

pki import-certificate ca realm web_mgmt pem filename mgmt-ca.pem

pki import rsa-key-pair web_mgmt_key include-cert realm web_mgmt pkcs12 device-web.p12 password <P12_PASSWORD>

pki realm web_mgmt
rsa local-key-pair web_mgmt_key
quit

<P12_PASSWORD> 换成刚才设置的 P12 导出密码,尖括号也去掉。导入 CA 时会显示证书指纹,和自己准备的 CA 证书核对一致后再确认。

这里要留意这一行:

rsa local-key-pair web_mgmt_key

它负责把 PKI 域和导入的私钥关联起来。证书导进去了,不代表这一步可以省略。

导入后可以看一下:

display pki certificate ca realm web_mgmt
display pki certificate local realm web_mgmt

第五步,让 HTTPS 使用新证书

先建 SSL 策略,引用刚才的 PKI 域:

ssl policy web_mgmt type server
pki-realm web_mgmt
version tls1.2
ciphersuite rsa_aes_128_sha256 rsa_aes_256_sha256 ecdhe_rsa_aes128_gcm_sha256 ecdhe_rsa_aes256_gcm_sha384
quit

这是这台 AC 实际验证可用的配置。不同版本支持的密码套件可能有差异,可以通过命令后的 ? 核对。

我在这一步查看策略时,证书状态还是 unloaded。后来确认,策略还没有绑定到 HTTPS,服务尚未加载它;绑定后状态就正常了。

接下来切换。这里会短暂停一下 Web HTTPS 服务,所以继续用刚才保留的 SSH 会话操作:

undo http secure-server enable
http secure-server ssl-policy web_mgmt
http secure-server enable
quit

遇到停止服务或替换策略的确认提示,核对后确认。切完检查:

display http server
display ssl policy web_mgmt
display ap all

策略里应该能看到:

Local certificate load status    : loaded
CA certificate chain load status : loaded

这次只重启了 Web HTTPS 服务,没有重启 AC。检查时 AP 运行时间连续,热备连接也正常。

第六步,打开浏览器验证,再保存配置

在管理电脑上重新打开 AC 地址,查看浏览器收到的是不是新证书,SAN 是否对应当前访问的地址。

如果这台电脑还不信任签发 CA,需要先核对 CA 来源和指纹,再把 CA 公钥证书加入相应的受信任证书存储。有中间 CA 的,也要把链补齐。我用的电脑之前已经信任这个内部 CA,这次没有额外导入。

也可以用 OpenSSL 检查设备实际提供的证书:

openssl s_client -connect 192.0.2.10:443 -CAfile mgmt-ca.pem -verify_ip 192.0.2.10 -verify_return_error -showcerts

这条命令显式指定了 CA,并校验管理 IP;有中间 CA 时仍需提供正确的链。它适合检查握手和证书,浏览器的信任情况还是要实际打开页面确认。OpenSSL s_client 参数说明

最后,Windows 的证书链和地址校验通过,Edge 也能正常显示登录页面了。到这里,这次 BAD_FORMAT 的问题才算解决。单独用 curl -k 得到一个 200,不能作为证书正常的依据,因为 -k 跳过了校验。

还有一个后续细节:这张证书没有 CRL 分发信息,严格检查吊销状态的客户端仍会报 CRYPT_E_NO_REVOCATION_CHECK。这需要在内部 CA 上补齐 CRL 或 OCSP 等相关配置,再按要求签发、验证,和前面的证书格式错误分开处理。

确认页面和设备状态正常后,保存配置:

save

如果 SFTP 和账号文件目录是这次临时加的,恢复原状态。我这里原本没有开启,所以执行:

system-view
undo sftp server enable
aaa
undo local-user netadmin ftp-directory
quit
quit
save

如果原来就在用 SFTP,恢复原配置即可,不要直接关闭。P12 传输副本也可以在确认密钥和证书已经导入持久存储后清理,别删掉设备正在引用的证书文件。

如果切换后有问题,怎么退回去?

前面保留旧策略,就是为了这一步。通过 SSH 切回原来的绑定:

system-view
undo http secure-server enable
http secure-server ssl-policy default_policy
http secure-server enable
quit

default_policy 要换成操作前记录的策略名。回退后检查并保存配置。旧证书本来就有问题,切回去可能仍会遇到原来的浏览器报错,但至少能恢复到变更前的状态。

老防火墙怎么处理?

老 FW 也可以沿着“重新签发、导入、绑定 Web 服务”这条路径处理,不过命令不能直接照搬 AC。

这部分我查了华为旧版 USG 文档,没有在这次现场实测。部分老 USG 是直接指定本地证书文件,而不是像上面的 AC 一样绑定 SSL 策略。

先看设备版本和原配置:

display version
display web-manager
display current-configuration

在系统视图下输入 web-manager security ?,确认当前版本支持什么参数。把原证书名称和 HTTPS 端口记下来,回退时还要用。

然后为 FW 单独签发证书,例如管理地址是 192.0.2.20,SAN 就填这个地址。每台设备使用自己的私钥和证书。按该版本的 PKI 流程完成导入;如果不支持外部私钥导入,就在设备上生成密钥和 CSR,交给 CA 签发,再导回证书。

证书装好后,支持这一命令分支的版本可以这样绑定:

web-manager security server-certificate <LOCAL_CERT_FILE>
web-manager security version tlsv1.2
web-manager security enable port 8443

<LOCAL_CERT_FILE> 是设备上已经安装的本地证书文件名,不是上传的 P12 包名称。8443 是旧版文档里的常见 HTTPS 端口,实际操作保留原来的端口;TLS 版本参数也要核对。如果该版本要求先停止 HTTPS 才能修改,就通过 SSH 按对应流程停服、修改、重新开启。

这组命令可以在华为 USG6000 典型配置案例,第 8 页和USG 管理指南,第 250–252 页找到。链接是华为原文档的第三方镜像。

完成后访问对应的 HTTPS 地址,检查新证书和登录页面,再保存配置。如果失败,就按之前记录的证书绑定和端口恢复。

这次 AC 换证后,终于能用浏览器正常打开管理页了。至于以前每次打不开是不是同一个原因,已经没法逐一确认;但至少这次,证书里的具体错误找到了,换证后的结果也验证过了。

标签: 故障排查, HTTPS证书, PKI, OpenSSL, SSL/TLS配置