【Unity】使用UnityWebRequest将Http升级到Https / 【报错】Curl error 51: Cert verify failed

1,636 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  • GET请求会向服务器发送索取数据的请求,从而获取信息。只是用来查询数据,不会修改、增加数据,无论进行多少次操作结果一样。
  • PUT请求是向服务器发送数据的,从而改变信息。用来修改数据的内容,但不会增加数据的种类,无论进行多少次操作结果一样。
  • POST请求同PUT请求类似,向服务器发送数据。但是会改变数据的种类等资源,会创建新的内容。
  • DELETE请求删除某一个资源。
  • ··· ···

以PUT为例,测试Http升级Https:

Http测试代码:

    private void PutTest(string url,string parame)
    {
        UnityWebRequest webRequest = new UnityWebRequest(url,UnityWebRequest.kHttpVerbPUT);

        byte[] databyte = Encoding.UTF8.GetBytes(parame);
        webRequest.uploadHandler = new UploadHandlerRaw(databyte);
        webRequest.downloadHandler = new DownloadHandlerBuffer();

        webRequest.timeout = 5;
        webRequest.SetRequestHeader("Content-Type","text/json;charset=utf-8");
        webRequest.SendWebRequest();
    }

如果直接把Url从"http"改为"https",

会有报错:"Curl error 51: Cert verify failed: UNITYTLS_X509VERIFY_FLAG_NOT_TRUSTED",证书验证失败,因为没有指定证书,使用的平台使用默认证书验证,导致失败

可以通过设置WebRequest.certificateHandler来指定证书,CertificateHandler类的ValidateCertificate函数返回值是false。自定义子类继承CertificateHandler,重写ValidateCertificate函数,就可以成功验证证书了

重写证书:

public class WebRequestCertificate : CertificateHandler
{
    protected override bool ValidateCertificate(byte[] certificateData)
    {
        //return base.ValidateCertificate(certificateData);
        return true;
    }
}

Https测试代码:

    private void PutTest(string url,string parame)
    {
        UnityWebRequest webRequest = new UnityWebRequest(url,UnityWebRequest.kHttpVerbPUT);

        byte[] databyte = Encoding.UTF8.GetBytes(parame);
        webRequest.uploadHandler = new UploadHandlerRaw(databyte);
        webRequest.downloadHandler = new DownloadHandlerBuffer();
        webRequest.timeout = 5;

        //拥有对CertificateHandler对象的引用,该对象可管理此UnityWebRequest的证书验证
        webRequest.certificateHandler = new WebRequestCertificate();

        webRequest.SetRequestHeader("Content-Type","text/json;charset=utf-8");
        webRequest.SendWebRequest();
    }

CertificateHandler: 负责拒绝或接受在 https 请求上接收到的证书。注意:自定义证书验证目前仅针对以下平台实施 - Android、iOS、tvOS 和桌面平台。

UnityWebRequest.certificateHandler: 拥有对 CertificateHandler 对象的引用,该对象可管理此 UnityWebRequest 的证书验证。

将此属性设置为"null"可使平台使用默认证书验证。一些平台将根据根证书授权商店来验证证书。其他平台则会完全绕过证书验证。 实测Unity中如果不设置UnityWebRequest.certificateHandler的值,无法使用https(http正常使用)。