Как разрешить поддержку TLS, недоступную в Mono.Security.dll в Linux (Ubuntu) с C#? - PullRequest
0 голосов
/ 19 января 2020

В настоящее время я использую C# для разработки некоторого приложения, используемого на платформе Ubuntu 18.04 x64. Ничего особенного, но я использую класс System.Security.Cryptography.X509Certificates.X509Certificate2 для чтения сертификата publi c, как показано ниже.

byte[] PubKeyData           = File.ReadAllBytes("signCert.der");
X509Certificate2 _cert      = new X509Certificate2(PubKeyData);

Хорошо читается в Ubuntu. Но всякий раз, когда он используется вместе с Mono.Security.dll, каким-то новым X509Certificate2 () выдает ошибку, как показано ниже.

Type: System.NotSupportedException
Message:  TLS Support not available.
Source: System
HelpLink: 
Stacktrace: 
  at Mono.Net.Security.MonoTlsProviderFactory.InitializeInternal () [0x00037] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at Mono.Net.Security.MonoTlsProviderFactory.GetProviderInternal () [0x00010] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at Mono.Net.Security.MonoTlsProviderFactory.GetProvider () [0x00000] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at Mono.Net.Security.NoReflectionHelper.GetProvider () [0x00000] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at Mono.Security.Interface.MonoTlsProviderFactory.GetProvider () [0x00000] in <63c83801d42d495da761ba8ee525eba8>:0 
  at Mono.SystemCertificateProvider.EnsureInitialized () [0x00020] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at Mono.SystemCertificateProvider.get_X509Pal () [0x00000] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at Mono.SystemCertificateProvider.Import (System.Byte[] data, Mono.CertificateImportFlags importFlags) [0x00010] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at System.Security.Cryptography.X509Certificates.X509Helper.Import (System.Byte[] rawData) [0x00005] in <c453bf849bb84e719dbec0475e99db95>:0 
  at System.Security.Cryptography.X509Certificates.X509Certificate..ctor (System.Byte[] data) [0x00023] in <c453bf849bb84e719dbec0475e99db95>:0 
  at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor (System.Byte[] rawData) [0x00000] in <4d8f95b7df544b3fa1a27dda924b4424>:0 
  at MyApp.Controllers.Certificate.LoadCertificate (System.Byte[] PubKeyData, System.Byte[] PriKeyData, System.IO.FileInfo PubFileInfo, System.IO.FileInfo PriFileInfo) [0x006c5] in /home/user/Documents/Projects/MyApp/Common/AuthApp/Controllers/Certificate.cs:675 
  at MyApp.Controllers.Certificate..ctor (System.String PubKeyPath, System.String PriKeyPath) [0x00079] in /home/user/Documents/Projects/MyApp/Common/MyApp/Controllers/Certificate.cs:83 
  at MyApp.Controllers.Certificate+Location+<Get>d__0.MoveNext () [0x000bb] in /home/user/Documents/Projects/MyApp/Common/AuthApp/Controllers/Certificate.cs:1116 
  at MyApp.Client.Ubuntu.Views.frmCertificate.LoadCertificate () [0x000d4] in /home/user/Documents/Projects/MyApp/Client/AuthApp.Client.Ubuntu/Views/frmCertificate.cs:142 
  at MyApp.Client.Ubuntu.Views.frmCertificate.frmCertificate_Load (System.Object sender, System.EventArgs e) [0x00002] in /home/user/Documents/Projects/MyApp/Client/AuthApp.Client.Ubuntu/Views/frmCertificate.cs:43 
  Inner [2020-01-19 15:45:06.456.689281] Exception Found==============================
  Type: System.TypeLoadException
  Message:  Type Mono.Btls.MonoBtlsProvider has invalid vtable method slot 5 with method none
  Source: System
  HelpLink: 
  Stacktrace: 
  at Mono.Net.Security.MonoTlsProviderFactory.InitializeInternal () [0x00023] in <4d8f95b7df544b3fa1a27dda924b4424>:0

Я нашел причину, но конд не может ее устранить.

Мой тест # 1) Всякий раз, когда Mono.Security.dll находится в моей папке Debug вместе, и когда я вызываю новый X509Certificate2 (PubKeyData), мое приложение выдает эту ошибку. Если я не использую какой-либо из классов Mono.Security, он не отсылает Mono.Security.dll в мою папку Debug, и ошибка не возникает.

Мой тест № 2) Я ссылался на Mono.Security.dll и использовал некоторые его коды, но остановился на новом X509Certificate2 (PubKeyData). Когда срабатывает отладчик, в новой строке X509Certificate2 (PubKeyData) я удалил файл Monon.Security.dll из папки Debug, и он не выдал ошибку.

Мой тест № 3) В Windows 7, 10, даже Mono.Security.dll находится в папке Debug вместе, это не выдаст ошибку. Он просто работает нормально.

Это очень странная проблема для меня.

Кто-нибудь сталкивался с подобной ошибкой раньше?

...