有 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 不会,于是报
DigiCert 的新证书本身没问题,浏览器能正常访问,但 uni.request 底层用的是 Ark 引擎自带的 libcurl,它对证书链的校验规则比浏览器 更严格。
99 % 的概率是 服务器在 TLS 握手时少发了中间证书(Intermediate CA),浏览器会自动补齐,而 libcurl 不会,于是报
request:fail SSL peer certificate or SSH remote key was not OK 如何验证
- 在电脑上用
openssl s_client -connect svc.wlsp.org.cn:443 -showcerts如果输出里只有一张服务器证书,而没有 “DigiCert TLS Hybrid ECC …” 或 “DigiCert Global Root …” 之类的中间证书,就坐实了“证书链不完整”。 - 用鸿蒙自带浏览器的 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,于是握手阶段就报:
uni.request 底层用的 libcurl 默认不启用 AIA,于是握手阶段就报:
SSL peer certificate or SSH remote key was not OK 立即修复方案(服务器端,根治)
- 到 DigiCert 控制台下载 “DigiCert TLS Hybrid ECC SHA384 2020 CA1”(或你实际用到的 GeoTrust G2 中间证书)的
.crt。 - 把Copy
服务器证书 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- 中间证书 -----END CERTIFICATE-----合并成一个文件(顺序不能反)。 - 重新部署到 Nginx / IIS / Tomcat,reload 服务。
- 再跑
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 名单。但正式环境 必须补全证书链,否则上架审核会被拒。一句话总结:
把缺失的中间证书补发到服务器,问题解决。
把缺失的中间证书补发到服务器,问题解决。