New Chat
Ctrl
K
Kimi+
Chat History

鸿蒙系统uni.request请求失败原因及解决

有 Uniapp 用户问鸿蒙上请求有问题,内容是 产品分类: uniapp/App PC开发环境操作系统: WindowsPC开发环境操作系统版本号: Windows 11HBuilderX类型: 正式HBuilderX版本号: 4.66手机系统: HarmonyOS NEXT手机系统版本号: HarmonyOS 5.0.1手机厂商: 华为手机机型: Nova13页面类型: vuevue版本: vue3打包方式: 离线项目创建方式: HBuilderX 机密信息(只有自己和管理员可见): fun:8DE9B8B467DDE857CC96A7B3027CBBCD 示例代码: uni.request({ url: " ", data: { key: aesEncrypt("uiduser"), fun: fun, uid: systemInfo.value.deviceId + "|" + systemInfo.value.appVersion, }, success: (res) => { }, fail: (e) => { console.log("失败:",e); }, }); 操作步骤: 网站更新证书,重新请求接口 预期结果: 证书OK的情况下应该请求成功 实际结果: 报错"request:fail SSL peer certificate or SSH remote key was not OK" bug描述: 使用uni.request进行网络请求,证书商是DigiCert,在鸿蒙系统内置的根证书库中。 一个月之前是访问是没有问题的,前段时间证书过期,更新了一个,使用鸿蒙的浏览器打开网址证书是没有问题的,但是用uni.request请求的时候就会报错"request:fail SSL peer certificate or SSH remote key was not OK" 请你推测问题是什么?
先把结论放在前面:
DigiCert 的新证书本身没问题,浏览器能正常访问,但 uni.request 底层用的是 Ark 引擎自带的 libcurl,它对证书链的校验规则比浏览器 更严格。
99 % 的概率是 服务器在 TLS 握手时少发了中间证书(Intermediate CA),浏览器会自动补齐,而 libcurl 不会,于是报
request:fail SSL peer certificate or SSH remote key was not OK

如何验证

  1. 在电脑上用
    openssl s_client -connect svc.wlsp.org.cn:443 -showcerts
    如果输出里只有一张服务器证书,而没有 “DigiCert TLS Hybrid ECC …” 或 “DigiCert Global Root …” 之类的中间证书,就坐实了“证书链不完整”。
  2. 用鸿蒙自带浏览器的 DevTools → Security 面板也能看到链是否完整。

解决办法(任选其一)

  • 服务器端(根治):
    让运维把完整的证书链(服务器证书 + 中间证书)合并成一个 .cer,再部署到 Nginx / IIS / Tomcat。
    DigiCert 官网有“DigiCertCA.crt”可下载。
  • 客户端(临时绕过,不推荐长久使用):
    在 manifest.json → 鸿蒙 → network → domain 里把 svc.wlsp.org.cn 设为 allow-invalid-cert: true,或者在代码里用 sslVerify:false(Next 上目前只能用离线打包在原生层改)。
  • 应用层兜底:
    把接口域名换成 CDN / API 网关,或改用 IP + 自签证书并在应用里手动信任。

为什么浏览器行、uni.request 不行

浏览器有自己的 AIA 下载逻辑,发现缺中间证书会自动去拉;libcurl 在鸿蒙 Ark 环境下默认 不做 AIA,于是校验失败。
把服务器证书链补全后,uni.request 会立即恢复正常。
我试了一下 openssl s_client -connect svc.wlsp.org.cn:443 -showcerts。返回值是这个 ``` Connecting to 198.18.1.105 CONNECTED(00000005) depth=0 C=CN, ST=湖北省, L=武汉市, O=武汉市自然资源保护利用中心, CN=*.wlsp.org.cn verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 C=CN, ST=湖北省, L=武汉市, O=武汉市自然资源保护利用中心, CN=*.wlsp.org.cn verify error:num=21:unable to verify the first certificate verify return:1 depth=0 C=CN, ST=湖北省, L=武汉市, O=武汉市自然资源保护利用中心, CN=*.wlsp.org.cn verify return:1 --- Certificate chain 0 s:C=CN, ST=湖北省, L=武汉市, O=武汉市自然资源保护利用中心, CN=*.wlsp.org.cn i:C=US, O=DigiCert, Inc., CN=GeoTrust G2 TLS CN RSA4096 SHA256 2022 CA1 a:PKEY: RSA, 2048 (bit); sigalg: sha256WithRSAEncryption v:NotBefore: Jun 5 00:00:00 2025 GMT; NotAfter: Jul 4 23:59:59 2026 GMT -----BEGIN CERTIFICATE----- MIIHpzCCBY+gAwIBAgIQB0DJMDHXcXkdjGieoR8mVjANBgkqhkiG9w0BAQsFADBb MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xMzAxBgNVBAMT Kkdlb1RydXN0IEcyIFRMUyBDTiBSU0E0MDk2IFNIQTI1NiAyMDIyIENBMTAeFw0y NTA2MDUwMDAwMDBaFw0yNjA3MDQyMzU5NTlaMH8xCzAJBgNVBAYTAkNOMRIwEAYD VQQIDAnmuZbljJfnnIExEjAQBgNVBAcMCeatpuaxieW4gjEwMC4GA1UECgwn5q2m 5rGJ5biC6Ieq54S26LWE5rqQ5L+d5oqk5Yip55So5Lit5b+DMRYwFAYDVQQDDA0q Lndsc3Aub3JnLmNuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCVm czt1LEzTcSGBk5njQjbrrm5DQ2Y7AK+6PstutAqgak2KEIoVQ2Gn2b/Rxh37ANKo ZHPbxSVqiRxoX5JrEjPcXW/qYXhF4plA3PNbL0qhPrzFFTfccn59DB5OIqd7zt2A MJlspoMzBlisRhCSwmoeX6KQxD/EZzpGACrl/RSM8RVT3h5tf1UY6O6fUnmkeFZB 5w7SdVEriDmqZ16AJFH4pdjSwbrcnOUf7DpC1MiDw9A5QIBEoznCGd9qRUsGpvyG wWOMYsbc0UrE83vNFS+5Zpy37YwrNJvymmUZ1GxhdkyQr69/ustH0oa9ECwvWTTP RYfjRedDl8JcuiKgIQIDAQABo4IDQTCCAz0wHwYDVR0jBBgwFoAUQU6OaZ30biXs eBQcftfNHZnP+WswHQYDVR0OBBYEFOYxBpZVjiP8cesj4nQSh5y5zKJ/MCUGA1Ud EQQeMByCDSoud2xzcC5vcmcuY26CC3dsc3Aub3JnLmNuMD4GA1UdIAQ3MDUwMwYG Z4EMAQICMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQ UzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwuZGlnaWNlcnQuY24vR2VvVHJ1 c3RHMlRMU0NOUlNBNDA5NlNIQTI1NjIwMjJDQTEuY3JsMIGDBggrBgEFBQcBAQR3 MHUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNuME4GCCsGAQUF BzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jbi9HZW9UcnVzdEcyVExTQ05S U0E0MDk2U0hBMjU2MjAyMkNBMS5jcnQwDAYDVR0TAQH/BAIwADCCAX4GCisGAQQB 1nkCBAIEggFuBIIBagFoAHYA1219ENGn9XfCx+lf1wC/+YLJM1pl4dCzAXMXwMjF aXcAAAGXPZxTxwAABAMARzBFAiAsfN1Ov0DqX13Hn60lT5eIX2n6HE7iJ4Xun6tE JdMMfAIhAOVMVmTFAOgnJt4pgrac9szyxZrdNzDd3Ua+U125o5NAAHYAwjF+V0UZ o0XufzjespBB68fCIVoiv3/Vta12mtkOUs0AAAGXPZxTdQAABAMARzBFAiEAskuO /+ulbfJs6eJh8fLJzVq8cwhVz5+dKNaUL5iSv2UCIG0tkP0UJ2Ltwf9kB6mXuTRC FUu3tsT0I8ONrHBLfx0VAHYAlE5Dh/rswe+B8xkkJqgYZQHH0184AgE/cmd9VTcu GdgAAAGXPZxTkAAABAMARzBFAiEAlJezHMreR4fs4bNaZaZyKPvLYOss3ZDktg+G C75eA+8CICRQwaEUl/geYWFklJ4gL0BjZa9vKJnM+pHor4Yks2soMA0GCSqGSIb3 DQEBCwUAA4ICAQCHYn1q/joSQlhMxSUaYLmAeMVl/m2+ZOJEx5VMEugL94MPq7Cv mgrByhdqdN3uoqOufADWiaiulzxSp4wkGC/2IAK9W+51QFMa+i0Wl25hhGf1tuy2 LypEMFG9Xz9p2MWsYzzcO0nqKIDSCS71lpcaon1ATwRiDQIITgC3aVexd9CWUgim ZgDaz96r7GiPRIRE20XeONGSqhuRV3wSgLpUykyuI4fzgqmQJzdEyJWL8W5pTw3m PHqtlBs8fdOyNhPi4wZv0uOBrynL64Toi2jdlAP8ld6DGoSr9SWUyS4odaeXJXZj xB9IR7UGGDMAFKUUcv68duz8mfpLo1gy9r8ANqGrc+oVUQKSysVmkwf9AtLZBPpI kll5DT+T1df+XIKJSzLoceqfRUE8Yg08gf60zw+F6AhfzQUio03cv4UMuMFRu1bD WyNmkTpxiTvzoFoxV40bTpST4JkhOkNhXB8Vyb/4ZLH6oQ+fy3mNI9r8Tnhd/YAw hDVv4wos8ohkWSRWspJUahSZsxFnRHdipkqrV6x7fH6d0UKHEpc5GQm3yNGfIdHH 1cj36fgZy2+SSAPhOZ+g9U3ZyftCZ8XDgUYlftbaOObhDuPhkIOnBfUOtHddCFDD iPW0w/665iWs+a/uIIa3dI/Hu97qsKUVptLt6SqBP0RXR3wmwRYaSfjOcA== -----END CERTIFICATE----- --- Server certificate subject=C=CN, ST=湖北省, L=武汉市, O=武汉市自然资源保护利用中心, CN=*.wlsp.org.cn issuer=C=US, O=DigiCert, Inc., CN=GeoTrust G2 TLS CN RSA4096 SHA256 2022 CA1 --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: rsa_pss_rsae_sha256 Peer Temp Key: X25519, 253 bits --- SSL handshake has read 2624 bytes and written 1641 bytes Verification error: unable to verify the first certificate --- New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Protocol: TLSv1.2 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 Session-ID: 12EBC2319B0CA4C538CECC926B2FB0ECD3B661483EA4D578782F2967965AFE58 Session-ID-ctx: Master-Key: E8679FA6A72C30CA43EA0CCD133B8FED684348C01F993E268E844DFD24006D5E852E42A47F671605964CAB94878C93FE PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 7200 (seconds) TLS session ticket: 0000 - cd f7 cd 41 e2 68 6d fd-59 a8 c7 36 27 38 95 17 ...A.hm.Y..6'8.. 0010 - d6 ed dc fe 45 1c c3 b6-a5 5d 86 a9 d7 85 2f fc ....E....]..../. 0020 - 55 75 9e 59 00 a4 1a 70-47 6f 58 be 24 bf b0 98 Uu.Y...pGoX.$... 0030 - dd 09 dd 3d a4 92 88 2e-6c bf 49 72 bd 31 02 a5 ...=....l.Ir.1.. 0040 - cb b4 27 1d 2d 28 3d ab-4d 61 01 4c 9d 41 6e 66 ..'.-(=.Ma.L.Anf 0050 - 7c 99 da 19 fc 9d 43 f0-63 4e f0 fb c0 d4 15 e8 |.....C.cN...... 0060 - 7f d8 51 34 f0 ff ca bd-67 91 14 e6 8b 0f 00 03 ..Q4....g....... 0070 - e0 e9 46 d4 32 7f 96 49-93 4f 33 1d 59 46 d7 53 ..F.2..I.O3.YF.S 0080 - 9e 95 e7 0b 1a 59 2d 6c-b1 98 c8 fa 8c 2f ad ad .....Y-l...../.. 0090 - dc 73 74 8c 3e ef bb 0f-9e 0e 1f 9c c7 a5 44 86 .st.>.........D. 00a0 - 0b f7 12 06 ee 26 05 cd-91 f8 79 8d 8f 2c 5d 9a .....&....y..,]. 00b0 - 0e 48 0e 7b 25 98 1d 19-21 3b 09 40 d4 c4 81 8f .H.{%...!;.@.... Start Time: 1752491171 Timeout : 7200 (sec) Verify return code: 21 (unable to verify the first certificate) Extended master secret: yes --- ```
问题已经坐实——服务器没有把中间证书一起下发,导致 TLS 链不完整:
  • openssl 返回
    verify error:num=21:unable to verify the first certificate
  • 证书链里只有 1 张叶子证书(depth 0),缺了
    GeoTrust G2 TLS CN RSA4096 SHA256 2022 CA1 → … → 根证书
浏览器会自动去拉缺失的中间证书,所以浏览器 OK;
uni.request 底层用的 libcurl 默认不启用 AIA,于是握手阶段就报:
SSL peer certificate or SSH remote key was not OK

立即修复方案(服务器端,根治)

  1. 到 DigiCert 控制台下载 “DigiCert TLS Hybrid ECC SHA384 2020 CA1”(或你实际用到的 GeoTrust G2 中间证书)的 .crt。
  2. 把
    Copy
    服务器证书
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    中间证书
    -----END CERTIFICATE-----
    合并成一个文件(顺序不能反)。
  3. 重新部署到 Nginx / IIS / Tomcat,reload 服务。
  4. 再跑
    openssl s_client -connect svc.wlsp.org.cn:443 -showcerts
    应该看到 chain 长度 ≥2,且
    Verify return code: 0 (ok)
    此时 uni.request 即可正常访问,无需改 App 代码。

临时绕过(仅调试阶段)

如果服务器暂时无法改,可以在离线打包的鸿蒙原生层把 sslVerify 设为 false,或把域名加入 allow-invalid-cert 名单。但正式环境 必须补全证书链,否则上架审核会被拒。

一句话总结:
把缺失的中间证书补发到服务器,问题解决。