2016-03-28 16 views
11

Khi tôi cố gắng sử dụng Invoke-WebRequest tôi nhận được một số lỗi lạ:SSL Gọi-WebRequest không thành công?

Invoke-WebRequest -Uri "https://idp.safenames.com/" 

Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. 

Tôi không chắc chắn những gì gây ra nó, vì bản thân trang web có vẻ tốt đẹp.

Ngay cả với tất cả các chức năng "bỏ qua lỗi ssl" xung quanh stackoverflow, nó vẫn không hoạt động, làm cho tôi tự hỏi nếu nó liên quan đến SSL ở tất cả.

+0

Hãy thử thiết lập user agent của bạn đến một trình duyệt thông thường với 'mệnh -UserAgent' một mét. Có thể trang web đang chặn các kết nối từ "bot". – briantist

+0

@briantist Nghĩ về nó, nhưng không, ngay cả với useragent thích hợp này không thành công. – iTayb

Trả lời

20

BaconBits notes, phiên bản .NET> 4.5 sử dụng SSLv3 và TLS 1.0 theo mặc định.

Bạn có thể thay đổi hành vi này bằng cách thiết lập chính sách SecurityProtocol với lớp ServicePointManager:

PS C:\> $AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12' 
PS C:\> [System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols 
PS C:\> (Invoke-WebRequest -Uri "https://idp.safenames.com/").StatusCode 
200 

này sẽ áp dụng cho tất cả các yêu cầu trong AppDomain (vì vậy nó chỉ áp dụng cho các trường hợp hiện tại của ứng dụng host)

+0

Tôi đang làm gì sai? Tôi nghiêm túc không thể nói ... http://imgur.com/FgHqF1o –

+0

Powershell 4.0 hoặc 4 0 -1 -1 khi sử dụng truy vấn psversiontable.psversion –

+0

Hành vi repro trên 2 hộp cửa sổ khác nhau, win8.1 & 10 –

5

Dựa trên this scan, có vẻ như URI đó không hỗ trợ bất kỳ điều gì thấp hơn TLS 1.1.

Bạn đang sử dụng phiên bản Windows nào? Nếu bạn đang sử dụng PowerShell phiên bản 4.0 trở xuống, bạn sẽ không thể thương lượng kết nối TLS 1.1 hoặc 1.2 vì .Net Framework không hỗ trợ TLS 1.1 hoặc 1.2 cho đến .Net Framework 4.5. PowerShell v4.0 là .Net 4.0. Điều đó có nghĩa là các lớp System.Net.WebRequest nằm bên dưới không thể thương lượng một kết nối. Tôi tin PowerShell v5.0 là .Net 4.5 hoặc .Net 4.6, nhưng tôi không có ứng dụng khách Win 10 để kiểm tra số $PSVersionTable ngay bây giờ.

Bạn có thể làm cho nó hoạt động bằng cách mã hóa các cuộc gọi đến WebRequest theo cách thủ công và chỉ định giao thức là [System.Net.SecurityProtocolType]::Tls12 hoặc [System.Net.SecurityProtocolType]::Tls11, nhưng tôi không chắc liệu điều đó có khả thi hay không. Đó là nghĩa vụ phải làm việc nếu. Net 4.5 được cài đặt từ những gì tôi nhìn thấy, nhưng, một lần nữa, tôi đã không bao giờ thử nó.

Để tham khảo, tôi nhận được kết quả chính xác giống như bạn trên Windows 7 x64/Powershell v4.0 và tôi đã có .Net 4.5 được cài đặt, nhưng tôi chưa bao giờ thử mã hóa thủ công WebRequest. Tôi cũng nhận được một lỗi nếu tôi sử dụng wget cho Windows 1.11.4 từ here (OpenSSL 0.9.8b, trước TLS 1.1 và 1.2), nhưng nó hoạt động tốt nếu tôi sử dụng wget cho Windows 1.17.1 từ here (hiện tại, nhiều hơn hoặc ít hơn).

+0

Hữu ích, nhưng .... Câu hỏi ban đầu đã nói 'Tôi không chắc chắn điều gì đang gây ra nó 'Dạy một người để câu cá ... Làm thế nào để chúng tôi * biết * rằng đó là vấn đề TLS? Tôi đã có tình trạng này và không thể, cho cuộc sống của tôi, nhận được bất cứ điều gì từ WebException nói rằng "lỗi trong đàm phán TLS". Tệ hơn nữa, vấn đề chỉ xuất hiện trong các bài kiểm tra tự động, không phải kiểm tra thủ công. Về phía khách hàng, tôi có thể nhận được thông báo cho biết "khách hàng đã cố gắng thương lượng với TLS 1.0 và máy chủ đã từ chối nó." Hoặc MỘT SỐ lời giải thích giả tiếng Anh cho lỗi, ngoài "Đã xảy ra lỗi không mong muốn khi gửi". – Cheeso

+0

@Cheeso Bạn thường sẽ không nhận được một lỗi hữu ích ở đây vì máy chủ không trả lại lỗi cho máy khách. Nó chỉ chấm dứt kết nối. Tất cả khách hàng đều biết rằng kết nối đã kết thúc hoặc đã bị từ chối. Bạn sẽ cần phải xem thông tin liên lạc với Wireshark, điều này không vui với TLS. –

2

này có thể được thay đổi vĩnh viễn cũng

# set strong cryptography on 32 bit .Net Framework (version 4 and above) 
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 
# set strong cryptography on 64 bit .Net Framework (version 4 and above) 
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 
Các vấn đề liên quan