Comment réparer UNITYTLS_X509VERIFY_NOT_DONE

Oct 23 2020

J'ai vu plusieurs réponses à des erreurs similaires, mais pas mon erreur spécifique. Le meilleur exemple est la réponse de Remy à UNITYTLS_X509VERIFY_FLAG_NOT_TRUSTED

Mon erreur est la suivante: TlsException: Handshake failed - error code: UNITYTLS_INTERNAL_ERROR, verify result: UNITYTLS_X509VERIFY_NOT_DONE

  • API Web Node.js / MongoDB
  • NGINX avec CertBot
  • SSL LetsEncrypt avec des certificats chaînés dans fullchain.pem

NGINX par défaut

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

Selon Unity Docs, j'ai utilisé la CertificateHandlerclasse

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

    }
}

Ma méthode d'inscription

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";
    }
}

Réponses

LewisCortright Oct 25 2020 at 04:32

Cela n'avait rien à voir avec l'autorité de certification ou NGINX. J'ai décidé de mettre en place un formulaire frontal pour tester cette erreur dans Chrome et dès que je l'ai fait, la réponse m'a frappé au visage. J'ai oublié de définir les variables d'environnement sur le serveur de production et j'ai obtenu net::ERR_SSL_PROTOCOL_ERROR. Depuis Unity a renvoyé une erreur que je ne connaissais pas, je ne savais pas comment la gérer.

J'avais mon fichier app.js à la recherche du process.env.NODE_ENVpour qu'il puisse être défini, protocol = 'https'mais je ne l' avais pas défini. Dès que je l'ai fait Node.js utilisé à la https.createServer(app)place de http.crateServer(app)et tout va bien.