UnityWebRequest изменить на https - PullRequest
4 голосов
/ 12 марта 2019

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

Недавно я переключил сервер и применил ssl certificate. Теперь мой API ниже https.

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

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

1 Ответ

1 голос
/ 12 марта 2019

Обычно Unity обрабатывает сертификат автоматически и проверяет его по известным корневым сертификатам или полностью игнорирует их в зависимости от платформы:

UnityWebRequest.certificateHandler:
Если для этого свойства установлено значение null, платформа будет использовать проверку сертификата по умолчанию.Некоторые платформы проверяют сертификаты в хранилище корневого центра сертификации.Другие платформы просто обойдут проверку сертификата полностью.

Использование самозаверяющего сертификата , однако, завершится неудачей, если Unity решит за первое.


Таким образом, для https с самозаверяющим сертификатом вам, возможно, придется реализовать CertificateHandler, который реализует метод ValidateCertificate.

Вы можете либо просто обойти сертификат, приняв их all (что проще, но, конечно, сделает 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 AcceptAllCertificatesSignedWithASpecificKeyPublicKey : 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();
        if (pk.Equals(PUB_KEY))
            return true;

        // Bad dog
        return false;
    }
}

И добавьте его к вашему запросу

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

    yield return www.SendWebRequest();

    //...
}

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...