Как исправить UNITYTLS_X509VERIFY_NOT_DONE

Oct 23 2020

Я видел несколько ответов на похожие ошибки, но не на мою конкретную ошибку. Лучший пример - это ответ Реми на UNITYTLS_X509VERIFY_FLAG_NOT_TRUSTED.

Моя ошибка заключается в следующем: TlsException: Handshake failed - error code: UNITYTLS_INTERNAL_ERROR, verify result: UNITYTLS_X509VERIFY_NOT_DONE

  • Веб-API Node.js / MongoDB
  • NGINX с CertBot
  • SSL LetsEncrypt с привязанными сертификатами в fullchain.pem

NGINX по умолчанию

listen [::]:443 ssl ipv6only=on #managed by Certbot
listen 443 ssl
ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mysite.com/privatekey.pem # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem # managed by Certbot

Согласно Unity Docs я использовал CertificateHandlerкласс

    internal class RequestCertificate : CertificateHandler
{

    private static string PUB_KEY = "SOME public key";


    protected override bool ValidateCertificate(byte[] certificateData)
    {
        X509Certificate2 certificate = new X509Certificate2(certificateData);
        string pk = certificate.GetPublicKeyString();
        if (pk.Equals(PUB_KEY))
        {
            Debug.Log("Validate Certificate");

            return true;
        }
        else
        {
            Debug.Log("Not Validate Certificate");

            return false;
        }

    }
}

Мой метод регистрации

protected IEnumerator Register()
{
    List<IMultipartFormSection> wwwForm = new List<IMultipartFormSection>();
    wwwForm.Add(new MultipartFormDataSection("name", uName.text));
    wwwForm.Add(new MultipartFormDataSection("email", uEmail.text));
    wwwForm.Add(new MultipartFormDataSection("screenName", uScreenName.text));
    wwwForm.Add(new MultipartFormDataSection("password", uConPass.text));

    UnityWebRequest www = UnityWebRequest.Post(EndPointManager.API_URL + "users/store-user", wwwForm);
    www.certificateHandler = new RequestCertificate();
    Debug.Log(www.certificateHandler.GetHashCode());
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error); // OUTPUT: Unable to complete SSL connection
        debugText.text += $"\n HTTP ERROR: {www.error} \n";
    }
    else
    {
        debugText.text += "Success";
    }
}

Ответы

LewisCortright Oct 25 2020 at 04:32

Это не имело ничего общего с центром сертификации или NGINX. Я решил создать интерфейсную форму, чтобы проверить эту ошибку в Chrome, и как только я это сделал, ответ пришел мне прямо в лицо. Я забыл установить переменные среды на производственном сервере и получил net::ERR_SSL_PROTOCOL_ERROR. Поскольку Unity вернула ошибку, с которой я не был знаком, я не знал, как с ней справиться.

У меня был файл app.js, который искал, process.env.NODE_ENVчтобы он мог установить, protocol = 'https'но не установил его. Как только я сделал Node.js, использовал https.createServer(app)вместо http.crateServer(app)и все хорошо.