문제

따라서 Oracle에서 노출 된 웹 서비스를 호출하는 C# 콘솔 응용 프로그램에 ServiceReference가 추가되었습니다.

나는 모든 설정을 가지고 있으며 SSL (HTTP)을 사용하지 않을 때 복숭아처럼 작동합니다. 지금 SSL을 사용하여 설정하려고 노력하고 있으며 서비스 참조 (또는 웹 참조)에 추가하는 문제가 발생합니다. 예를 들어, 서비스가 노출되고있는 URL (HTTPS)은 Visual Studio에 추가하려고 할 때 적절한 웹 메소드를 반환하지 않습니다.

기본 연결이 닫혔습니다. SEND에서 예기치 않은 오류가 발생했습니다. 전송 스트림에서 예상치 못한 EOF 또는 0 바이트를 받았습니다. 메타 데이터는 해결할 수없는 참조가 포함되어 있습니다. 'https://srs204.mywebsite.ca:7776/somedirectory/mywebservice?wsdl'

내가 가진 또 다른 규모는 인증서 관리 및 배포와 관련이 있습니다. 이 작은 유틸리티를 사용해야하는 약 1000 개의 외부 클라이언트 사이트가 있으며 웹 서비스에 연결하려면 적절한 CERT 스토어에 설치된 인증서가 필요합니다. 이것을 처리하는 최선의 접근법은 확실하지 않습니다. 그들은 루트 가게에 있어야합니까?

나는 웹에서 다양한 옵션을 살펴보면서 꽤 많은 시간을 보냈지 만 어디서나 좋은 대답을 얻을 수는 없습니다.

요약하면, 여기에는 몇 가지 질문이 있습니다.

1) SSL을 사용하는 Visual Studio에서 웹 서비스를 설정하는 데 좋은 링크가있는 사람이 있습니까?

2) 인증서를 어떻게 등록해야합니까? 어떤 상점에 존재해야합니까? CERTMGR과 같은 것을 사용하여 등록 할 수 있습니까?

좋은 책/튜토리얼/이와 같은 것을 설정하는 일반적인 모범 사례를 보여줄 것이 있어야합니다. 나는 그것을 찾을 수없는 것 같다!

도움이 되었습니까?

해결책

글쎄, 나는 이것을 알아 냈다. 이야기하는 것보다 훨씬 오래 걸렸지 만 표준을보기 위해 내 거대한 애완 동물이기 때문에 솔루션을 공유하고 싶었습니다. "오, 고정! 감사합니다!" 모든 사람이 실제로 일어난 일에 매달려있는 게시물.

그래서.

근본 문제는 기본적으로 Visual Studio 2008이 SSL 핸드 셰이크에 TLS를 사용하고 연결하려는 Oracle/Java 기반 웹 서비스는 SSL3을 사용하고 있다는 것입니다.

Visual Studio 2008에서 "서비스 참조 추가 ..."를 사용하면 보안 프로토콜을 지정할 방법이 없습니다 서비스 포인트 관리자는 SSL3이어야합니다.

하지 않는 한.

정적 WSDL 문서를 가져옵니다 wsdl.exe를 사용하여 프록시 클래스를 생성하십시오.

wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl

그런 다음 사용할 수 있습니다 C 날카로운 컴파일러 프록시 클래스를 라이브러리 (.dll)로 바꾸고 .NET 프로젝트 "참조"에 추가하십시오.

csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs

이 시점에서 "참조"에도 System.Web.Services를 포함시켜야합니다.

이제 코드에서 문제없이 웹 서비스를 호출 할 수 있어야합니다. 만들다 일하다 서비스를 인스턴스화하기 전에 하나의 마법 코드 라인이 추가됩니다.

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

좋아, 그래서 나는 시험 상자에서 테스트가 좋았 기 때문에 나 자신에게 깊은 인상을 받았다. 그런 다음 다른 클라이언트 상자에 배치 한 후 권한/권한 문제로 인해 다시 연결되지 않습니다. 이것은 나에게 증명서처럼 냄새가났다 (냄새가 나는 냄새가 무엇이든). 이것을 해결하기 위해, i 사용 된 certmgr.exe 로컬 컴퓨터의 신뢰할 수있는 루트에 사이트의 인증서를 등록합니다.

certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root

이를 통해 인증서를 클라이언트 사이트에 배포하고 사용자를 위해 자동으로 설치할 수 있습니다. 나는 여전히 "보안 친화적"이 어떻게 다른 버전의 Windows가 이와 같은 자동 인증서 등록과 관련이 있는지 확실하지 않지만 지금까지 잘 작동했습니다.

이 대답이 어떤 사람들을 도울 수 있기를 바랍니다. 이것에 대한 모든 도움과 통찰력을 제공하기 위해 BlowDart에게도 감사합니다.

다른 팁

웹 서비스가 자체 서명 된 인증서를 사용하는 것처럼 들립니다. 솔직히 이것은 최선의 접근법이 아닙니다.

당신이 대규모 조직이고 내부라고 가정하면 자신의 신뢰할 수있는 인증서 권한을 설정할 수 있습니다. 특히 쉽습니다. 액티브 디렉토리. 해당 CA에서 Oracle 서비스를 호스팅하는 서버는 인증서를 요청할 수 있으며 광고 정책을 사용하여 기계 저장소의 신뢰할 수있는 루트에 배치하여 내부 CA의 루트 인증서를 신뢰할 수 있습니다. 이렇게하면 웹 서비스에서 인증서를 수동으로 신뢰하거나 수락 할 필요가 없습니다.

클라이언트 기계가 외부 인 경우 Verisign, Thawte, Geotrust 등과 같은 잘 알려진 CAS 중 하나에서 "실제"인증서를 구매하거나 설치 번들의 일부로 서비스를 노출시키는 사람들이 제공해야합니다. 공개 인증서 및 모든 기계의 기계 레벨에서 신뢰할 수있는 루트 인증 기관에 설치합니다. 예를 들어 인증서를 취소하는 방법은 없지만 프롬프트가 제거됩니다.

이 멋진 팁에 감사드립니다. 당신의 물건을 간단히 둘러 보면 좋은 아이디어가 많이 있습니다. 다음은 추가해야 할 부분이 있습니다. 웹 메드를 알아 내고 있습니다. 당신의 접근 방식은 훌륭하게 작동했습니다. 여기 내 부록이 있습니다.

정적 클래스 "공장"이 주어지면이 두 가지 편리한 댄디 항목을 제공합니다.

/// <summary>
/// Used when dispatching code from the Factory (for example, SSL3 calls)
/// </summary>
/// <param name="flag">Make this guy have values for debugging support</param>
public delegate void CodeDispatcher(ref string flag);

/// <summary>
/// Run code in SSL3 -- this is not thread safe. All connections executed while this
/// context is active are set with this flag. Need to research how to avoid this...
/// </summary>
/// <param name="flag">Debugging context on exception</param>
/// <param name="dispatcher">Dispatching code</param>
public static void DispatchInSsl3(ref string flag, CodeDispatcher dispatcher)
{
  var resetServicePoint = false;
  var origSecurityProtocol = System.Net.ServicePointManager.SecurityProtocol;
  try
  {
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
    resetServicePoint = true;
    dispatcher(ref flag);
  }
  finally
  {
    if (resetServicePoint)
    {
      try { System.Net.ServicePointManager.SecurityProtocol = origSecurityProtocol; }
      catch { }
    }
  }
}

그런 다음이 물건을 소비합니다 (의심 할 여지없이 이미 추측했지만 어쨌든 여기에 드럼 롤을 넣습니다) :

    var readings = new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading[] {
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 1, created = DateTime.Now.AddDays(-1), reading = 17.34, userID = 2
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 2, created = DateTime.Now.AddDays(-2), reading = 99.76, userID = 3
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 3, created = DateTime.Now.AddDays(-5), reading = 82.17, userID = 4
      }
    };
    ArchG2.Portal.Utils.wmArchG201.Factory.DispatchInSsl3(ref flag, (ref string flag_inner) =>
    {
      // creates the binding, endpoint, etc. programatically to avoid mucking with
      // SharePoint web.config.
      var wsFireWmdReading = ArchG2.Portal.Utils.wmArchG201.Factory.Get_fireWmdReading(ref flag_inner, LH, Context);
      wsFireWmdReading.fireWmdReading(readings);
    });

그것은 트릭을합니다 - 더 많은 시간을 얻을 때 스레딩 문제를 해결할 것입니다.

언급 할 명성이 없기 때문에 SSL3을 강제하기위한 Mat Nadrofsky의 답변 및 코드 샘플도 언급하고 싶습니다.

HTTP 요청을하는 동안 오류가 발생했습니다 https : // xxxx/뭐든지. 이는 서버 인증서가 HTTPS 케이스에서 http.sys로 제대로 구성되지 않았기 때문일 수 있습니다. 이는 또한 클라이언트와 서버 간의 보안 바인딩이 불일치로 인해 발생할 수 있습니다.

그냥 사용하십시오

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

매트가 언급했듯이. HTTPS의 SAP NetWeaver Pi 서버로 테스트. 감사!

매트,

나도 그런 문제가 있었고 CERTMGR.EXE를 사용하여 원격 시스템에 신뢰할 수있는 루트에 인증서를 추가하지 않는 방법이 있습니다.

X509Store store;
store = new X509Store("ROOT", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

'인증서 개체'는 다음과 같이 만들 수 있습니다.

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top