Unity下使用HTTPS

背景说明


Google表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。
因此在Android P 中使用Http请求会遇到如下错误

W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted

使用OKHttp请求则出现

java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy

此处需要注意的是即便是Web View也是需要https请求。
针对Android而言有一下3中解决方法

  • APP改用https请求
  • targetSdkVersion 降到27以下
  • 在 res 下新增一个 xml 目录,然后创建一个名为:network_security_config.xml 文件(名字自定) ,内容如下,大概意思就是允许开启http请求
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    </network-security-config>

    然后在APP的AndroidManifest.xml文件下的application标签增加以下属性

    <application
    ...
    android:networkSecurityConfig="@xml/network_security_config"
    ...
    />

    Unity使用HTTPS


    #if !UNITY_WSA_10_0 && !UNITY_WINRT_8_1 && !UNITY_WSA && !UNITY_WEBPLAYER
    #define SUPPORT_SSL
    #endif
    ...
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    using System.Threading;
    ...
    #if SUPPORT_SSL
    private bool MyRemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
    bool isOk = true;
    // If there are errors in the certificate chain,
    // look at each error to determine the cause.
    /*if (sslPolicyErrors != SslPolicyErrors.None)
    {
        for (int i = 0; i < chain.ChainStatus.Length; i++)
        {
            if (chain.ChainStatus[i].Status == X509ChainStatusFlags.RevocationStatusUnknown)
            {
                continue;
            }
            chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
            chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
            chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
            // Note: change flags to X509VerificationFlags.AllFlags to skip all security checks
            chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
            bool chainIsValid = chain.Build((X509Certificate2)certificate);
            if (!chainIsValid)
            {
                isOk = false;
                break;
            }
        }
    }*/
    return isOk;
    }
    #endif
    ...
    #if SUPPORT_SSL
    if (m_DownloadUrl.ToLower().StartsWith("https://"))
    {
    ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
    }
    #endif

    针对WWW的GET请求我们也需要进行处理,我们可以使用WebClient().DownloadString的方法来完成

    ...
    #if SUPPORT_SSL
    if (m_DownloadUrl.ToLower().StartsWith("https://"))
    {
    ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
    }
    #endif
    try {
    mes = new System.Net.WebClient().DownloadString(m_DownloadUrl);
    } catch (Exception e) {
    m_Error = e.Message;
    }
    ...

欢迎留言

avatar
  Subscribe  
Notify of