Cách khắc phục UNITYTLS_X509VERIFY_NOT_DONE
Tôi đã thấy một số câu trả lời cho các lỗi tương tự, nhưng không phải lỗi cụ thể của tôi. Ví dụ tốt nhất là câu trả lời của Remy cho UNITYTLS_X509VERIFY_FLAG_NOT_TRUSTED
Lỗi của tôi như sau: TlsException: Handshake failed - error code: UNITYTLS_INTERNAL_ERROR, verify result: UNITYTLS_X509VERIFY_NOT_DONE
- Web API Node.js / MongoDB
- NGINX với CertBot
- SSL LetsEncrypt với Chained Certs trong fullchain.pem
NGINX mặc định
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
Theo Unity Docs, tôi đã sử dụng CertificateHandlerlớp học
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;
}
}
}
Phương thức đăng ký của tôi
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";
}
}
Trả lời
Điều này không liên quan gì đến tổ chức phát hành chứng chỉ hoặc NGINX. Tôi quyết định thiết lập biểu mẫu giao diện người dùng để kiểm tra lỗi này trong Chrome và ngay sau khi tôi làm vậy, câu trả lời đã đập vào mặt tôi. Tôi đã quên thiết lập các biến môi trường trên máy chủ sản xuất và nhận được net::ERR_SSL_PROTOCOL_ERROR. Do Unity trả về một lỗi mà tôi không quen nên tôi không biết phải xử lý như thế nào.
Tôi đã tìm kiếm tệp app.js process.env.NODE_ENVđể nó có thể thiết lập protocol = 'https'nhưng chưa đặt được. Ngay sau khi tôi đã sử dụng Node.js https.createServer(app)thay vì http.crateServer(app)và tất cả đều tốt.