The question is answered, right answer was accepted
Unable to call web data ("TlsException: The server stopped the handshake")
Any help is appreciated here, as this bug is breaking my game :(
I'm trying to call a web JSON API to fill some text in my UI. I'm using the code below to get the raw JSON. Up until now it worked like a charm, but now it's broken and throws a handshake error ("TlsException: The server stopped the handshake"). I did not recently make any changes to this script, and it had been working for a good while.
I believe this is an issue with Mono not trusting the certificate for this website, but after some extensive trial-and-error googling I'm still not exactly sure how to fix it. Please note that I copied and pasted the majority of this code from another question on the forums - I am not at all an expert on certificate validation.
Thank you in advance for your help :)
public static string webData;
public Text myText;
void Start () {
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
System.Net.WebClient wc = new System.Net.WebClient();
byte[] raw = wc.DownloadData("https://opentdb.com/api.php?amount=1&type=multiple");
webData = System.Text.Encoding.UTF8.GetString(raw);
}
public bool MyRemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) {
bool isOk = true;
// If there are errors in the certificate chain, look at each error to determine the cause.
if (sslPolicyErrors != SslPolicyErrors.None) {
for (int i=0; i<chain.ChainStatus.Length; i++) {
if (chain.ChainStatus [i].Status != X509ChainStatusFlags.RevocationStatusUnknown) {
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan (0, 1, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
bool chainIsValid = chain.Build ((X509Certificate2)certificate);
if (!chainIsValid) {
isOk = false;
}
}
}
}
return isOk;
}
}
Answer by goddatr · Mar 21, 2018 at 03:25 PM
Maybe try adding this before overriding the ServerCertificateValidationCallback
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Thanks for your help, goddatr. I tried this and received the following error:
C:\Unity\Trivial Combat _CURRENT\Trivial Combat 1.11\Assets\Setup Scripts\WebCall.cs(101,101): Error CS0117: 'System.Net.SecurityProtocolType' does not contain a definition for 'Tls11' (CS0117) (Assembly-CSharp)
At any rate, I've decided to go another route and set up a local database through SQLite. So I'm going to go ahead and close this question.