Изменение UnityWebRequest на https

#unity3d #ssl

#unity-game-engine #ssl

Вопрос:

У меня была рабочая инфраструктура приложения Unity для Android и api сайта, работающих под http .

Недавно я переключил сервер и подал заявку ssl certificate . Теперь мой api находится под https контролем.

В приложении Unity я использую UnityWebRequest для связи со своим api. Логическим изменением после переключения на https будет изменение всех получателей api в приложении с http на https . Я сделал это, но мой api ведет себя странно. (Постоянно выдаю свой собственный статус ошибки в качестве ответа, в то время как на старом сервере без сертификата выдаю хороший ответ.)

Есть ли что-нибудь дополнительное, что мне нужно изменить с переключением на https ?

Ответ №1:

Обычно 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;
    }
} 
  

Или попробуйте этот пример из документации с вашим открытым ключом

 // 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));
    }
}
  

И добавьте его в свой запрос

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

    yield return www.SendWebRequest();
    
    //...
}
  

Примечание: Пользовательская проверка сертификата в настоящее время реализована только для следующих платформ — Android, iOS, tvOS и настольных платформ.

Итак, на Android все должно быть в порядке.

CertificateHandler По умолчанию автоматически удаляется вместе с UnityWebRequest , так что больше ничего не нужно делать.