WCF 오류 "HTTP.SYS를 사용하여 HTTPS의 경우 서버 인증서가 제대로 구성되지 않았기 때문일 수 있습니다."


80

Windows 서비스에서 웹 서버에서 실행중인 WCF 서비스로의 WCF 호출을 사용하는 데 문제가 있습니다. 이 통화는 몇 주 동안 작동했지만 갑자기 작동을 멈 췄고 그 이후로 작동하지 않았습니다.

내가 얻는 예외는 다음과 같습니다.

일반 오류 발생 System.ServiceModel.CommunicationException : HTTP 요청을 만드는 동안 오류가 발생했습니다.

그리고 그것은 말한다

이는 HTTPS의 경우 서버 인증서가 HTTP.SYS로 올바르게 구성되지 않았기 때문일 수 있습니다. 이는 클라이언트와 서버 간의 보안 바인딩 불일치로 인해 발생할 수도 있습니다.

내가 양쪽에서 사용하는 보안은 어떤 종류의 암호화도없이 wsHttpBinding입니다. 또한 HTTPS가 아닌 HTTP를 사용하기 때문에 HTTPS에 대해 불평하는 이유를 모르겠습니다.

나머지 내부 예외 스택은 다음과 같습니다.

SystemNet.WebException : 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다. ---> System.IO.IOException : 전송 연결에 데이터를 쓸 수 없습니다. 잘못된 인수가 제공되었습니다. ---> System.Net.Sockets.SocketException : System.Net.Sockets.Socket.MultipleSend (BufferOffsetSize [] buffers, SocketFlags socketFlags)의 System.Net.Sockets.NetworkStream.MultipleWrite (BufferOffsetSize []에 잘못된 인수가 제공되었습니다. 버퍼)

또한이 문제가 발생하는 내 프로그램의 지점은 웹 서비스 호출의 "실행"줄에 있습니다. 즉, 웹 서비스를 호출하고 래핑 된 DataContract 개체를 전달하는 즉시 폭파.

이 서비스가 수행하는 모든 작업은 많은 양의 XML (클라이언트 측 호출에 .NET 개체로 전달됨)을 전달한 다음 일부 작업을 수행하는 것입니다. 아마도 약 100-200k의 XML이 전송되고 있습니다. 양쪽 끝의 데이터 크기에 대한 제한을 6 메가 이상으로 늘 렸지만 도움이되지 않는 것 같습니다.

어떤 아이디어?


이 문제에 대한 추가 정보 :

클라이언트 환경을 로컬로 복제 할 때 다음과 같이 변경하지 않으면 많은 양의 XML을 업로드 할 수 없습니다. 1. 서버에서 "maxRequestLength"를 100MB로 설정합니다 (보내는 것보다 훨씬 높음). 2. 켜기 클라이언트에서 dataContractSerializer 태그 아래의 maxItemsInObjectGraph 값을 "2147483646"으로 설정했습니다.

이러한 변경으로 로컬 설치가 성공적으로 업로드됩니다. 그러나 클라이언트의 서버 설치는 여전히 실패합니다. 흥미로운 점은 서버에서 maxRequestLength 값을 변경 한 후 테스트 설치에서 특히 maxItemsInObjectGraph 설정과 관련된 오류가 발생하기 시작했다는 것입니다. 클라이언트 서버에서는 여전히 원래 "HTTP.sys"오류가 발생합니다.

앞서 언급했듯이 우리는 SSL을 전혀 사용하지 않으며 동일한 방식으로 XML을 실행하고 업로드하는 2 개의 다른 웹 서비스 호출이 있습니다. 그러나 작동하지 않는 서비스 호출은 더 많은 데이터를 전송하기 때문에 크기 문제로 보입니다.

그러나 클라이언트가 가진 문제가 테스트 설치와 동일한 문제인 경우 클라이언트 오류 메시지가 ObjectGraph 오류와 관련이없는 이유를 알 수 없습니다.

클라이언트에서 가능한 모든 오류에 대해 일반적인 "유효하지 않은 매개 변수" "HTTP.sys"오류가 발생하는 것이 가능합니까 (즉, 실제로 objectGraph 오류도 발생하지만 표시되지 않습니까?)


작동이 멈췄다 고 말했습니까? 이에 대한 책임이있을 수있는 코드 나 구성이 변경 되었습니까? 전달되는 데이터 유형으로 호출하는 메서드에 대한 코드를 게시 할 수 있습니까?
Tanner

나는 그것을 파고 그것을 게시 할 것이다. 기본적으로 DataContract 항목에 정의 된 "AppointmentData"개체의 배열을 전달하고 있다고 생각합니다. 확실히 복잡한 개체이므로 귀하의 게시물을 확인하겠습니다. 감사!
Sam Schutte

아, 코드 나 구성이 변경되지 않았습니다. 몇 주 동안 잘 작동 한 다음 중지되었습니다. 클라이언트의 방화벽 설정도 변경되었을 수 있지만 WCF 호출을 수행하는 서비스는 2 개의 다른 WCF 서비스 메서드를 호출 할 수 있으며 예외 내용이 포함 된 이메일을 보낼 수있는 기능도 있습니다. 3 개의 WCF 호출 중 2 개는 출력되지만 마지막 호출은 아닙니다.
Sam Schutte

2
나는 항상 그 제안이 붉은 청어인지 아닌지 당신이 정말로 알지 못하기 때문에 가능성을 제안하는 "일반적인 오류"를 두려워한다. 보안 = 없음으로 설정하여 테스트 할 수 있습니까? 서비스 요청이 작동하면 인증서 (또는 최소한 보안)가 문제라고 알려줍니다. 또한 양쪽의 구성을보고 싶습니다.
Mike L

확인해야하지만 보안이 이미 없음으로 설정되어 있다고 확신합니다 ...
Sam Schutte

답변:


73

호스트 서버가 TLS V1.2를 사용하도록 업데이트되었고 표준 SSL을 사용하여 연결했기 때문에이 문제가 발생했습니다. 이것은 사이트의 펜 테스트의 일부로 만들어진 업데이트입니다. 우리는 코드 연결에서 문제를 보았지만 wsdl로가는 브라우저는 보지 못했습니다. 아래 코드가 해결되었습니다.

if (System.Net.ServicePointManager.SecurityProtocol == (SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls))
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

출처 : SSL 폴백을 비활성화하고 .NET에서 아웃 바운드 연결에 TLS 만 사용하려면 어떻게해야합니까? (푸들 완화)


감사합니다! 이것은 나를 도왔다. C ++ 앱에서 SOAP 호출을하는 C # DLL을 호출하는 경우이를 설정해야했습니다. 동일한 C # DLL이 C # 앱에서 호출 된 경우에는 필요하지 않았습니다.
픽셀

내 경우에는 : a) using System.Net내 파일 에 추가 해야했습니다. b) SecurityProtocol의 값은 "기본값"입니다. "if"를 제거하고 SecurityProtocolType.Tls를 할당하기로 결정했습니다. SecurityProtocolType.Tls11 | 먼저 묻지 않고 SecurityProtocolType.Tls12. HTH, Marcelo
Marcelo Finki

1
2020. 동일한 솔루션.
Anton Krouglov

28

IIS 7에서 실행되는 서비스에서 동일한 문제가 발생하여 서비스가 여러 공급 업체 서버 (일부는 SSL이 아님)에 새 서버를 추가 할 때 (일부는 SSL이 아님) 연결됩니다 (이 새로운 공급 업체는 TLS 1.2 임). 몇 번의 요청 후 오류가 발생했습니다. 원래 서버 (SSL)로 만들어졌습니다.

이를 확인 System.Net.ServicePointManager.SecurityProtocol하기 위해 각 공급 업체에 요청하기 전에 간단히 기록했습니다 .

낮고 서비스를 다시 시작한 후 (또는 응용 프로그램 풀을 다시 시작한 후) 보라. 출력을 얻을 수 Ssl3, Tls있지만 원래 공급자 서버에 대한 몇 가지 요청 후에 이것이 변경되고 Ssl3TLS 서비스에 대한 요청으로 오류가 발생했습니다.

수정하기 위해 user369142가 제안한 것을 간단히 수행했습니다. 새 서버에 대한 각 요청 전 :

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

더 이상 오류가 없습니다.


TLS 1.2 이상을 사용하려면 최소 .NET 4.5 이상이 필요합니다. 출처 : blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
xx1xx

감사합니다. 대신 열거 형에 정수로 사용할 수 있습니다. System.Net.ServicePointManager.SecurityProtocol = 123 => enum1 | enum2, etc .. 다른 프레임 워크의 경우?
MirlvsMaximvs

각 요청 전에이를 설정할 필요가 없습니다. 애플리케이션 시작 이벤트에서 한 번만 설정하면됩니다. 설정하는 정적 속성입니다.
user369142

9

이 문제는 진정한 HTTPS 바인딩과 "HTTP.SYS가 HTTPS 케이스에서 제대로 구성되지 않았기 때문에 서버 인증서가 제대로 구성되지 않았기 때문일 수 있습니다."와 동일한 예외가 발생했습니다. 코드와 구성의 모든 것을 다시 확인한 후 오류 메시지가 내부 예외만큼 오해의 소지가없는 것처럼 보이므로 빠른 확인 후 포트 443이 (개발 서버에서) skype에 의해 연결되었음을 발견했습니다. 요청을 보류하는 항목 (Fiddler가 여기에서 도움이 될 수 있음)을 살펴보고 서비스 전면 (브라우저에서 .svc보기) 및 해당 메타 데이터에 도달 할 수 있는지 확인하는 것이 좋습니다.

행운을 빕니다.


9

제 경우에는 SchUseStrongCrypto.Net 을 사용하도록 설정해야했습니다. 이렇게하면 서버가 TLS 1.0, 1.1 또는 1.2를 사용하여 연결해야합니다. 없이SchUseStrongCrypto 사용 가능 연결이 내 원격 엔드 포인트에서 비활성화되었습니다 사용 SSL 3.0에 노력했다.

강력한 암호화를 사용하기위한 레지스트리 키 :

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

6

우리에게이 오류는 서비스를 실행하는 개발자의 컴퓨터에 127.0.0.1에서만 포트 443을 바인딩하도록 IIS가 구성되어 있기 때문입니다.

IIS 관리자에서 웹 사이트를 마우스 오른쪽 단추로 클릭하고 바인딩 편집을 선택합니다. 포트 항목에 443IP 주소가 있으면로 127.0.0.1변경하십시오 *.


5

많은 검색과 영주의 이름을 헛되이 취한 후 마침내 얻었습니다. 내 wcf 서비스가 실행되는 서버에 TLS 1.2를 설치했습니다. 내 클라이언트는 올바르게 구성되었지만 .NET 4.5.1에서 빌드되었지만 wcf는 .NET 4.6.1에있었습니다. TLS 1.2를 사용하는 경우 클라이언트와 서버 모두 동일한 .NET 버전이어야합니다. 언젠가 누군가에게 도움이되기를 바랍니다.


2
이 경우에는 버그가되어야합니다. 프로토콜은 .NET 버전에 따라 다르지 않아야하며 .NET을 사용하지 않는 서비스 나 클라이언트도 언급하지 않아야합니다.
Joel McBeth

이 힌트가 내 문제를 해결했습니다. 다른 프로젝트 B를 참조하는 WPF 프로젝트가있었습니다. 프로젝트 B는 4.5.2이고 WPF 프로젝트는 4.6.1이었습니다. 4.5.2를 모두 만들면 문제가 해결되었습니다.
Ignacio Hagopian 2017

5

클라이언트 애플리케이션을 4.5 이상으로 변경하십시오. 4.5 인 경우 다음을 사용합니다. System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 / Tls1.1 / Tls1.0 필요에 따라 응용 프로그램을 4.6.1 이상으로 업그레이드 할 수 있습니다.


4

최근에 거의 이와 똑같은 문제가 발생 했으며 호출 컴퓨터에 설치된 Microsoft 업데이트 KB980436 ( http://support.microsoft.com/KB/980436 )으로 인해 발생한 것으로 밝혀졌습니다 . 완전히 제거하는 것 외에 우리를위한 해결책은 KB 사이트의 지침에 따라 레지스트리의 UseScsvForTls DWORD를 1로 설정하는 것이 었습니다.이 업데이트가 호출 시스템에 설치되어있는 것을 확인하면 시도해 볼 수 있습니다. .


HTTPS를 사용하여 통화 했습니까? 아니면 OP로 암호화되지 않았습니까?
roufamatic 2011-06-24

3

Amazon AWS에서 IIS와 glassfish 모두에 대해 이전 XP SP3 상자를 실행할 때이 문제가 발생했습니다. Amazon은 DES-CBC3-SHA 암호를 활성화하지 않도록 기본로드 밸런서 설정을 변경했습니다. 이전 XP TLS 1.0이 HTTPS 용 ELB에 대해 작동하도록 허용하려면 amazon ELB에서이를 활성화해야합니다. 그렇지 않으면이 오류가 발생합니다. 콘솔의 리스너 탭으로 이동하고 작업하려는 특정 리스너 옆에있는 암호를 클릭하여 ELB에서 암호를 변경할 수 있습니다.


2

WCF 서비스가 .net 프레임 워크 4.0을 사용 중이고 누군가 서버에서 TLS 1.0을 비활성화 한 경우이 예외가 표시됩니다. .net 4.0이 상위 버전의 TLS를 지원하지 않기 때문입니다.

지원되는 프로토콜 : https://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.100).aspx


4
실제로 해결 방법이 있지만 여전히 사용할 수 있습니다 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2. NET 4.0에서 작동합니다.
F34R

@ F34R 귀하의 의견은 최근에 http에서 https로 변환 된 엔드 포인트에 대한 SOAP 요청을 시도하는 .NET 4.0 앱에 대한 내 문제를 해결했습니다. blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support에서
Wesley Musgrove

1

Complex DataType 문제와 관련된 이러한 특정 예외를 보았습니다. 컬렉션이나 열거 형을 전달하는 경우 다음 게시물을 참조하세요.

복잡한 데이터 유형


우리는 데이터 유형 문제를 조사했습니다. 우리는 dataContract에 정의 된 평범한 오래된 .NET 객체를 보내고 있습니다. 열거 형이나 그런 것들은 없습니다. 하지만이 기사에서 언급 한 디버그 추적 도구 중 일부를 설치했고 2 개의 작업 호출이 수신되는 것을 볼 수 있었지만 세 번째 "비 작동"호출에는 아무것도 나타나지 않았습니다. 이것은 클라이언트 컴퓨터에서 전혀 벗어나지 않는다는 것을 나타냅니다.
Sam Schutte

4
@SamSchutte :이 오류가 해결 되었습니까? 해결책이 무엇인지 알려주시겠습니까?
VoodooChild

1

전송 모드 = 스트리밍을 사용하는 경우 버퍼링으로 변경해보십시오.

이것이 문제가 아니라면 구성을 게시 할 수 있습니다.


1

몇 주 동안 모든 것이 잘 작동하고 중지되었으므로 이것이 귀하의 코드와 관련이 있는지 의심됩니다. 서비스가 활성화 될 때 오류가 발생했을 수 있습니다.코드가 호출 될 때가 아니라 IIS / ASP.NET 내 했을 수 있습니다. 런타임은 웹 사이트의 구성을 확인하고 서비스와 관련이없는 일반 오류 메시지를 표시 할 수 있습니다.

내 의심은 인증서가 만료되었거나 바인딩이 잘못 설정되어 있다는 것입니다. 웹 사이트가 HTTPS에 대해 잘못 구성된 경우 코드에서 사용 여부에 관계없이이 오류가 발생할 수 있습니다.


1

브라우저와 Https 모드에서 서비스를 검색해보십시오. 검색 할 수없는 경우이 오류의 원인이됩니다. 이제이 오류를 해결하려면 다음을 확인해야합니다.

  • https 포트, 다른 리소스 (웹 사이트)에서 사용하고 있지 않은지 확인
  • https에 대한 인증서가 올바르게 구성되었는지 확인하십시오 (서명 기관, 자체 서명 된 인증서, 다중 인증서 사용 확인).
  • Https 모드에 대한 WCF 서비스 바인딩 및 구성 확인

1

우리의 문제는 단순히 끝점의 포트 번호가 8080으로 잘못 설정되었다는 것입니다. 8443으로 변경하여 작동했습니다.


1

보안 프로토콜을 명시 적으로 설정하는 것보다 더 좋은 방법은 web.config <compilation targetFramework = "4.5"> 이상을 설정하는 것입니다.


1

.NetFramework 버전을 4.5.2에서 4.7.2로 업그레이드하여 문제를 해결했습니다.


0

최근에 이것을 경험했습니다.

System.ServiceModel.CommunicationException :

http://example.com/WebServices/SomeService.svc에 대한 HTTP 요청을 만드는 동안 오류가 발생했습니다 . 이는 HTTPS의 경우 서버 인증서가 HTTP.SYS로 올바르게 구성되지 않았기 때문일 수 있습니다. 이는 클라이언트와 서버 간의 보안 바인딩 불일치로 인해 발생할 수도 있습니다.

---> System.Net.WebException : 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

---> System.IO.IOException : 전송 연결에 데이터를 쓸 수 없습니다. 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다.

관리자로부터 웹 서비스를 호스팅하는 IIS 응용 프로그램 풀이 메모리 부족 후 자동으로 재활용된다는 사실을 알게되었습니다. 응용 프로그램 풀이 재활용 될 때 클라이언트에서 오류가 발생했습니다.

응용 프로그램 풀에서 사용할 수있는 메모리를 늘리면 즉각적인 문제가 해결되었습니다.


0

우리의 애플리케이션은 최근 네트워크 어플라이언스 (F5) OS 업데이트를 통해 SSL에서 TLS로 강제 종료되었습니다. 자체 서명 된 인증서를 다시 생성하여이 오류를 수정했습니다. 솔루션에 도달하기 전에 여러 유지 관리 기간을 문제 해결에 보냈으므로 향후 누군가가 문제를 해결하는 데 도움이되기를 바랍니다.


0

최근에 이것을 경험했습니다.

System.ServiceModel.CommunicationException :

http://example.com/WebServices/SomeService.svc에 대한 HTTP 요청을 만드는 동안 오류가 발생했습니다 . 이는 HTTPS의 경우 서버 인증서가 HTTP.SYS로 올바르게 구성되지 않았기 때문일 수 있습니다. 이는 클라이언트와 서버 간의 보안 바인딩 불일치로 인해 발생할 수도 있습니다.

---> System.Net.WebException : 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

---> System.IO.IOException : 전송 연결에 데이터를 쓸 수 없습니다. 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다.

bluecoat 프록시의 라이센스가 만료되었습니다! 따라서 외부 당사자 (인터넷)에 연결할 수 없습니다.


0

우리는 동일한 문제가 있었고 우리의 경우 인증서를 다시 설치하고 바인딩을 다시 만들어 해결했습니다. 우리를 이끈 이유는 사이트에서 간단한 png 이미지 파일을 가져 오는 경우에도 동일한 오류가 발생한다는 사실이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.