Saya mengembangkan klien TCP untuk menghubungkan server OpenSSL dengan otentikasi sertifikat. Saya telah menggunakan file .crt dan .key yang dibagikan oleh tim server. Sertifikat ini dibuat oleh perintah OpenSSL.
Saya menggunakan SslStream
objek untuk mengotentikasi klien Tcp dengan memanggil SslStream.AuthenticateAsClient
metode dengan melewati server IP
, SslProtocols.Ssl3
dan X509CertificateCollection
.
Saya mendapatkan kesalahan berikut:
Autentikasi gagal karena pihak jarak jauh telah menutup aliran transportasi
SslProtocols.Ssl3
. Mungkin kamu harus mencobanyaSslProtocols.Tls
. Dalam .Net 4.5 dan yang lebih baru, Anda juga dapat menggunakanTls11
atauTls12
. Lihat Enumerasi SslProtocols . Anda mungkin memiliki masalah lain.Jawaban:
Saya akan menyarankan agar tidak membatasi SecurityProtocol ke TLS 1.1.
Solusi yang disarankan adalah dengan menggunakan
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls
Pilihan lainnya adalah menambahkan kunci Registry berikut:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 Value: SchUseStrongCrypto
Perlu dicatat bahwa .NET 4.6 akan menggunakan protokol yang benar secara default dan tidak memerlukan solusi mana pun.
sumber
System.Net.ServicePointManager.SecurityProtocol = ...
itu harus dijalankan sebelum membuat permintaan.Jika Anda ingin menggunakan versi .net yang lebih lama, buat bendera Anda sendiri dan transmisikan.
// // Summary: // Specifies the security protocols that are supported by the Schannel security // package. [Flags] private enum MySecurityProtocolType { // // Summary: // Specifies the Secure Socket Layer (SSL) 3.0 security protocol. Ssl3 = 48, // // Summary: // Specifies the Transport Layer Security (TLS) 1.0 security protocol. Tls = 192, // // Summary: // Specifies the Transport Layer Security (TLS) 1.1 security protocol. Tls11 = 768, // // Summary: // Specifies the Transport Layer Security (TLS) 1.2 security protocol. Tls12 = 3072 } public Session() { System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls); }
sumber
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Menambahkan kode di bawah membantu saya mengatasi masalah tersebut.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
sumber
using (var client = new HttpClient(handler)) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false); await response.Content.ReadAsStringAsync().ConfigureAwait(false); }
Ini berhasil untuk saya
sumber
Saya mengalami pesan kesalahan yang sama saat menggunakan ChargifyNET.dll untuk berkomunikasi dengan Chargify API. Menambahkan
chargify.ProtocolType = SecurityProtocolType.Tls12;
ke konfigurasi memecahkan masalah bagi saya.Berikut cuplikan kode lengkapnya:
public ChargifyConnect GetChargifyConnect() { var chargify = new ChargifyConnect(); chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"]; chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"]; chargify.URL = ConfigurationManager.AppSettings["Chargify.url"]; // Without this an error will be thrown. chargify.ProtocolType = SecurityProtocolType.Tls12; return chargify; }
sumber
Untuk VB.NET, Anda dapat menempatkan yang berikut ini sebelum permintaan web Anda:
Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols) Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType) ServicePointManager.SecurityProtocol = Tls12
Ini memecahkan masalah keamanan saya di .NET 3.5.
sumber
Ini terjadi pada saya ketika titik akhir permintaan web dialihkan ke server lain yang hanya menerima permintaan TLS1.2. Mencoba begitu banyak upaya yang kebanyakan ditemukan di Stackoverflow seperti
System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; ke Global.ASX OnStart,
Pengecualian yang diterima tidak membuat keadilan untuk masalah sebenarnya yang saya hadapi dan tidak menemukan bantuan dari operator layanan.
Untuk mengatasi ini saya harus menambahkan Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 baru Saya telah menggunakan IIS Crypto 2.0 Tool dari sini seperti yang ditunjukkan di bawah ini.
sumber