UnityWebRequest 更改为 https

ssw*_*qaa 7 ssl unity-game-engine

我有统一的 android 应用程序和站点 api 在http.

最近换了服务器,申请了ssl certificate。现在我的 api 在https.

在统一应用程序中,我UnityWebRequest用来与我的 api 进行通信。切换到 后的逻辑变化是https将应用程序中的所有 api 地址从http更改为https。我这样做了,但是我的 api 表现得很奇怪。(一直将我自己的错误状态作为响应,而在没有证书的旧服务器上给出良好的响应。)

切换到 时我需要改变https什么吗?

der*_*ugo 9

通常 Unity 会自动处理证书并根据已知的根证书对其进行验证,或者根据平台完全忽略它们:

UnityWebRequest.certificateHandler:
设置此属性null使平台使用默认证书验证。某些平台将根据根证书颁发机构存储验证证书。其他平台将完全绕过证书验证。

但是,如果 Unity 决定第一个,使用自签名证书将失败。


因此,对于https自签名证书,您可能必须实现CertificateHandler实现方法的ValidateCertificate

您可以简单地通过接受所有证书来绕过证书(这更容易,但当然会使https这种毫无意义)

public class BypassCertificate : CertificateHandler
{
    protected override bool ValidateCertificate(byte[] certificateData)
    {
        //Simply return true no matter what
        return true;
    }
} 
Run Code Online (Sandbox Code Playgroud)

或者使用您的公钥尝试文档中的此示例

// Based on https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#.Net
class AcceptAllCertificatesSignedWithASpecificPublicKey : CertificateHandler
{
    // Encoded RSAPublicKey
    private static string PUB_KEY = "30818902818100C4A06B7B52F8D17DC1CCB47362" +
        "C64AB799AAE19E245A7559E9CEEC7D8AA4DF07CB0B21FDFD763C63A313A668FE9D764E" +
        "D913C51A676788DB62AF624F422C2F112C1316922AA5D37823CD9F43D1FC54513D14B2" +
        "9E36991F08A042C42EAAEEE5FE8E2CB10167174A359CEBF6FACC2C9CA933AD403137EE" +
        "2C3F4CBED9460129C72B0203010001";

    protected override bool ValidateCertificate(byte[] certificateData)
    {
        X509Certificate2 certificate = new X509Certificate2(certificateData);

        string pk = certificate.GetPublicKeyString();

        return pk.Equals(PUB_KEY));
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到您的请求中

using(var www = UnityWebRequest.Get("https://example.com"))
{
    //www.certificateHandler = new BypassCertificate();
    // Or
    www.certificateHandler = new AcceptAllCertificatesSignedWithASpecificPublicKey();

    yield return www.SendWebRequest();
    
    //...
}
Run Code Online (Sandbox Code Playgroud)

注意:自定义证书验证目前仅针对以下平台实施 - Android、iOS、tvOS 和桌面平台。

所以在Android上你应该没问题。

CertificateHandler默认情况下自动处理一起UnityWebRequest,所以没有更多的事情要做。