问题
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