Xác thực không thành công vì bên từ xa đã đóng luồng truyền tải


87

Tôi đang phát triển một ứng dụng khách TCP để kết nối máy chủ OpenSSL với xác thực chứng chỉ. Tôi đã sử dụng các tệp .crt và .key được chia sẻ bởi nhóm máy chủ. Các chứng chỉ này được tạo bởi các lệnh OpenSSL.

Tôi đang sử dụng SslStreamđối tượng để xác thực client TCP bằng cách gọi SslStream.AuthenticateAsClientphương pháp bằng cách thông qua máy chủ IP, SslProtocols.Ssl3X509CertificateCollection.

Tôi nhận được lỗi sau:

Xác thực không thành công vì bên từ xa đã đóng luồng truyền tải


2
Ngoại hình này giống như một vấn đề trong những ngày sau Poodle: SslProtocols.Ssl3. Có lẽ bạn nên thử SslProtocols.Tls. Trong .Net 4.5 trở lên, bạn cũng có thể sử dụng Tls11hoặc Tls12. Xem SslProtocols Enumeration . Bạn có thể gặp các vấn đề khác.
jww


Cảm ơn. Vấn đề của tôi được giải quyết bằng cách đính kèm chứng chỉ từ đường dẫn vật lý của chứng chỉ và mật khẩu thay vì tìm kiếm tên chủ đề chứng chỉ từ cửa sổ chứng chỉ windows.
Odelu

Bây giờ tôi có thể nhận được kết quả từ tất cả các SslProtocols (SSL3, Tls1 và Tls2). Cảm ơn bạn đã trả lời
Odelu

@Odelu, bạn đã khắc phục sự cố như thế nào? Về phía máy khách hay phía máy chủ?

Câu trả lời:


155

Tôi khuyên bạn không nên hạn chế SecurityProtocol thành TLS 1.1.

Giải pháp được khuyến nghị là sử dụng

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

Một tùy chọn khác là thêm khóa đăng ký sau:

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

Cần lưu ý rằng .NET 4.6 sẽ sử dụng đúng giao thức theo mặc định và không yêu cầu giải pháp nào cả.


6
wow, bạn vừa giải quyết được vấn đề của tôi - tôi đang thử tất cả các loại - và sau đó kết thúc ở đây khi thấy ghi chú trên khuôn khổ. Chỉ cần chuyển nó sang 4.6.1 (đang sử dụng 4.5), hy vọng vấn đề sẽ là khung công tác có thể đang sử dụng giao thức bảo mật sai - và bingo, các kết nối của tôi không bị từ chối và tôi đang lấy dữ liệu của mình!
Veverke

7
Điều quan trọng cần nói là System.Net.ServicePointManager.SecurityProtocol = ...phải được thực thi trước khi tạo yêu cầu.
Tonatio

2
bản cập nhật phiên bản khung mục tiêu đó lên 4.6.1 đã cứu mạng tôi :-)
Awais

Khung của tôi được đặt ở 4.6.2. Có lẽ tôi sẽ phải sử dụng giải pháp TLS thay thế
Luminous

Tôi đang sử dụng Khung 4.7.2 cũng là trang web mà tôi đang gửi yêu cầu đang sử dụng TLS 1.2 nhưng giống như ở 6 yêu cầu từ 10, tôi gặp lỗi này. bất kỳ ý tưởng?
Davit Mikuchadze

16

Nếu bạn muốn sử dụng phiên bản .net cũ hơn, hãy tạo cờ của riêng bạn và truyền 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
Bạn không phải sử dụng lớp của riêng mình, bạn có thể truyền trực tiếp số nguyên sang SecurityProtocolTypeServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Yan F.

13

Thêm mã bên dưới đã giúp tôi khắc phục sự cố.

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

Điều này đã làm việc cho tôi


1
Bit quan trọng là dòng sau: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; Tuy nhiên, câu trả lời này rất tuyệt vì nó cho thấy dòng đó sẽ phù hợp với trường hợp sử dụng điển hình ở đâu.
Nick Painter

5

Tôi đã gặp phải thông báo lỗi tương tự khi sử dụng ChargifyNET.dll để giao tiếp với API Chargify. Việc thêm chargify.ProtocolType = SecurityProtocolType.Tls12;vào cấu hình đã giải quyết được vấn đề cho tôi.

Đây là đoạn mã hoàn chỉnh:

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

Đối với VB.NET, bạn có thể đặt những thứ sau trước yêu cầu web của mình:

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

Điều này đã giải quyết vấn đề bảo mật của tôi trên .NET 3.5.


0

Điều này đã xảy ra với tôi khi một điểm cuối yêu cầu web được chuyển sang một máy chủ khác chỉ chấp nhận các yêu cầu TLS1.2. Đã cố gắng rất nhiều lần hầu như chỉ được tìm thấy trên Stackoverflow như

  1. Khóa đăng ký,
  2. Đã thêm:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; lên Global.ASX OnStart,
  3. Đã thêm vào Web.config.
  4. Đã cập nhật .Net framework lên 4.7.2 Vẫn nhận được cùng Exception.

Ngoại lệ nhận được không tạo ra sự công bằng cho vấn đề thực tế mà tôi đang gặp phải và không tìm thấy sự trợ giúp nào từ nhà điều hành dịch vụ.

Để giải quyết vấn đề này, tôi phải thêm Bộ mật mã mới TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 Tôi đã sử dụng Công cụ IIS Crypto 2.0 từ đây như hình dưới đây.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.