#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
, так что больше ничего не нужно делать.