Unity - 由于CryptographicException,无法发送HTTPS请求

Edu*_*lho 6 mono ssl https certificate unity-game-engine

我正在尝试向我的远程服务器发送https请求,但我总是遇到以下异常:

Exception: System.IO.IOException: The authentication or decryption has failed. ---> System.ArgumentException: certificate ---> System.Security.Cryptography.CryptographicException: Unsupported hash algorithm: 1.2.840.113549.1.1.11
  at Mono.Security.X509.X509Certificate.VerifySignature (System.Security.Cryptography.RSA rsa) [0x00000] in <filename unknown>:0 
  at Mono.Security.X509.X509Certificate.VerifySignature (System.Security.Cryptography.AsymmetricAlgorithm aa) [0x00000] in <filename unknown>:0 
  at System.Security.Cryptography.X509Certificates.X509Chain.IsSignedWith (System.Security.Cryptography.X509Certificates.X509Certificate2 signed, System.Security.Cryptography.AsymmetricAlgorithm pubkey) [0x00000] in <filename unknown>:0 
  at System.Security.Cryptography.X509Certificates.X509Chain.Process (Int32 n) [0x00000] in <filename unknown>:0 
  at System.Security.Cryptography.X509Certificates.X509Chain.ValidateChain (X509ChainStatusFlags flag) [0x00000] in <filename unknown>:0 
  at System.Security.Cryptography.X509Certificates.X509Chain.Build (System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Security.Cryptography.X509Certificates.X509Chain.Build (System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) [0x00000] in <filename unknown>:0 
  at System.Net.Security.SslStream+<BeginAuthenticateAsClient>c__AnonStorey7.<>m__A (System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Int32[] certErrors) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.SslClientStream.OnRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] errors) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.SslStreamBase.RaiseRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] errors) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.SslClientStream.RaiseServerCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] certificateErrors) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:Process ()
  at Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
Run Code Online (Sandbox Code Playgroud)

起初我认为这是一个证书验证问题,所以我在发送请求之前添加了以下代码:

ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, ssl) => true;
Run Code Online (Sandbox Code Playgroud)

事实证明,ServerCertificateValidationCallback甚至没有被调用,并且异常与"普通SSL"或"SSL密码"有关.

请注意我的远程服务器URL是https://_my_app_.herokuapp.com/_path_.奇怪的是,如果我将URL更改为任何其他https服务器,https://www.google.com或者https://www.facebook.com我没有得到Exception并且请求成功.

看起来Unity使用的Mono实现不支持heroku的密码套件(我可以保证,因为我最近开发了一个能够连接到同一服务器的MonoTouch应用程序).

是客户端还是服务器问题?我应该在客户端添加一些hacky代码还是应该更改服务器的配置?

Edu*_*lho 2

我找不到原因,但找到了问题的解决方案。

我使用UnityHTTP - 一个“基于 TcpClient 的 HTTP 库” - 来执行 HTTP 请求。通过切换到 Unity 的WWW 类,发送到我的 heroku 服务器的所有https请求都成功了。我发现,当使用UnityHTTPUnity 库时,它尝试crossdomain.xml在 843 端口上执行验证,同时使用时WWW class在端口 80 上执行此类验证。

MaybeUnityHTTP的实现处理当前与 Heroku 服务器不兼容的低级内容,我不会进一步调查这一点,但UnityHTTP无论如何我都会在 的 github 存储库上打开一个问题。