Unity3d UnityWebRequest调用接口报错Curl error 60: Cert verify failed: UNITYTLS_X509VERIFY_FLAG_EXPIRED解决办法

问题

Unity3d使用UnityWebRequest组件调用https(类似https://xxx.com/apipath)接口数据,然后报错

Curl error 60: Cert verify failed: UNITYTLS_X509VERIFY_FLAG_EXPIRED

SSL CA certificate error

在这里插入图片描述

大致的意思是证书验证失败 和 SSL CA证书错误。

尝试使用Postman进行测试,得到也是类似的错误:
在这里插入图片描述

和后台接口提供人员沟通了一下,他给的答案是

postman关闭ssl

HttpClient配置SSL绕过https证书

,他没搞过Unity3d的,所以让我自己去研究了。
我尝试关闭了Postmam的SSL certificate verification选项后果真可以正常调用接口请求数据了。

Postman关闭ssl方法:
在这里插入图片描述

解决方法

弄清楚了问题的根源就好说了,要解决这个问题其实就是如何让UnityWebRequest绕过或者忽略ssl证书的验证即可。
解决方式是重写CertificateHandler的验证函数(ValidateCertificate)使其不进行验证永远返回true即可(建议仅有此问题的才使用该 CertificateHandler)。

重写的代码:

using UnityEngine.Networking;

public class WebReqSkipCert : CertificateHandler
{
    
    
    protected override bool ValidateCertificate(byte[] certificateData)
    {
    
    
        return true;
    }
}

这里的类WebReqSkipCert 继承了CertificateHandler 然后仅重写了ValidateCertificate(byte[] certificateData)函数让其永远返回true,实现跳过ssl验证的功能。

该类的使用方法:

  UnityWebRequest www = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
  www.certificateHandler = new WebReqSkipCert();
  www.timeout = 5000;

这样就算是解决了该报错的问题,个人认为还是弄弄接口服务器的证书可能更能根本解决这个问题,但如果他们不弄的话,我们这前端就只能卑微的打这种很勉强的补丁了,哈哈,惨~~~
咨询了后端的朋友,这种情况可能是用的私有证书或者未使用域名而是IP会有这种情况,而且这种进接口在浏览器上也会有不安全提示:
在这里插入图片描述

解决方法参考了 https://blog.csdn.net/final5788/article/details/105506603

猜你喜欢

转载自blog.csdn.net/qq_33789001/article/details/128128713