Uzak taraf taşıma akışını kapattığı için kimlik doğrulama başarısız oldu


87

OpenSSL sunucusuna sertifika kimlik doğrulaması ile bağlanmak için bir TCP istemcisi geliştiriyorum. Sunucu ekibi tarafından paylaşılan .crt ve .key dosyalarını kullanıyorum. Bu sertifikalar OpenSSL komutları tarafından oluşturulur.

Ben kullanıyorum SslStreamarayarak TCP istemci kimlik doğrulaması için nesneyi SslStream.AuthenticateAsClientsunucusunu geçirerek yöntemi IP, SslProtocols.Ssl3ve X509CertificateCollection.

Aşağıdaki hatayı alıyorum:

Uzak taraf taşıma akışını kapattığı için kimlik doğrulama başarısız oldu


2
Bu görünüm sonrası POODLE günlerde bir sorun gibi: SslProtocols.Ssl3. Belki denemelisin SslProtocols.Tls. .Net 4.5 ve üzeri sürümlerde Tls11veya kullanabilirsiniz Tls12. Bkz. SslProtocols Numaralandırması . Başka sorunlarınız olabilir.
jww


Teşekkürler. Sorunum, Windows sertifika deposundan sertifika konu adını aramak yerine sertifikanın fiziksel yolundan ve paroladan eklenerek çözüldü.
Odelu

Şimdi sonucu tüm SslProtocols'lardan (SSL3, Tls1 ve Tls2) alabiliyorum.Cevabınız için
teşekkürler

@Odelu, sorunu nasıl düzelttin? İstemci tarafında mı yoksa sunucu tarafında mı?

Yanıtlar:


155

SecurityProtocol'u TLS 1.1 ile sınırlandırmamanızı tavsiye ederim.

Önerilen çözüm kullanmaktır

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls

Diğer bir seçenek, aşağıdaki Kayıt defteri anahtarını eklemektir:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto 

NET 4.6'nın varsayılan olarak doğru protokolü kullanacağını ve her iki çözümü de gerektirmediğini belirtmek gerekir.


6
vay, az önce problemimi çözdün - her tür şeyi deniyordum - ve sonra burada çerçevedeki notu görmeye başladın. Sadece 4.6.1'e geçtim (4.5 kullanıyordu), sorunun çerçevenin yanlış güvenlik protokolü kullanması olacağını umarak - ve tombala, bağlantılarım reddedilmiyor ve verilerimi alıyorum!
Veverke

7
System.Net.ServicePointManager.SecurityProtocol = ...İsteği oluşturmadan önce bunun yürütülmesi gerektiğini söylemek önemlidir .
Tonatio

2

Çerçevem ​​4.6.2 olarak belirlendi. Belki bunun yerine TLS çözümünü kullanmam gerekecek
Luminous

4.7.2 Framework kullanıyorum ayrıca istek gönderdiğim site TLS 1.2 kullanıyor ancak benzeri 10'dan 6 istekte bu hatayı alıyorum. herhangi bir fikir ?
Davit Mikuchadze

16

.Net'in daha eski bir sürümünü kullanmak istiyorsanız, kendi bayrağınızı oluşturun ve yayınlayın.

    //
    // 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);
    }

1
Kendi sınıfını kullanmak zorunda değilsiniz, doğrudan SecurityProtocolType tamsayıları yayınlayabilirsinizServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Yan F.

13

Aşağıdaki kodu eklemek sorunun üstesinden gelmeme yardımcı oldu.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

8
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);
            }

Bu benim için çalıştı


1
Kritik bit, aşağıdaki satırdır: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; Bu cevap harika, çünkü bu satırın tipik kullanım senaryosunda nereye sığması gerektiğini gösteriyor.
Nick Painter

5

Chargify API ile iletişim kurmak için ChargifyNET.dll'yi kullanırken aynı hata mesajıyla karşılaştım. chargify.ProtocolType = SecurityProtocolType.Tls12;Yapılandırmaya eklemek sorunu benim için çözdü.

İşte tam kod pasajı:

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;
}

2

VB.NET için, web talebinizden önce aşağıdakileri yerleştirebilirsiniz:

Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12

Bu, .NET 3.5'teki güvenlik sorunumu çözdü.


0

Bu, bir web isteği uç noktası yalnızca TLS1.2 isteklerini kabul eden başka bir sunucuya geçtiğinde başıma geldi. Çoğunlukla Stackoverflow'da bulunan çok sayıda girişim denedim.

  1. Kayıt Anahtarları,
  2. Eklendi:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; Global.ASX OnStart'a,
  3. Web.config dosyasına eklendi.
  4. .Net çerçevesi 4.7.2 olarak güncellendi. Hala aynı İstisna alınıyor.

Alınan istisna, karşılaştığım asıl soruna adalet getirmedi ve servis operatöründen hiçbir yardım bulamadım.

Bunu çözmek için yeni bir Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 eklemek zorundayım IIS Crypto 2.0 Tool'u buradan aşağıda gösterildiği gibi kullandım.

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.