2013-05-13 3 views
0
지금 며칠 동안 내 바퀴를 회전 어떤 진전되지 및 제안은 내가 지금까지 온라인 확실히, 그래서 여기에 트릭을하지 않은 것으로 나타났습니다 봤는데

간다 :비주얼 스튜디오 2012 + 403.7 오류

  1. 나는 어떤 종류의 웹 서비스를 당신이 다른 쪽 끝의 REST-ish라고 부르는 WCF 서비스를 가지고있다. 메소드의 URL은 "https://partner.someservice.com/SomeMethod.asp"과 같습니다. 일부 쿼리 문자열 args 끝까지 벼락치기 및 그들의 서버에 요청을 POST.

  2. VS의 오류는 403을 표시하지만 피들러를 사용하면 403.7이 표시됩니다. 내 브라우저에 인증서를 가져 오기 전에 403.7도 보았습니다. 내 요청 개체를 검사하고 [1] cert를 지정하여 ClientCertificates를 볼 수 있으므로 첨부되는 것으로 확신합니다.

  3. .pfx 파일을 내 컴퓨터 및 로컬 사용자 인증서 저장소로 가져 왔습니다. 나는 winhttpcertcfg 유틸리티를 여러 가지 방법으로 여러 번 실행했습니다. 기본적으로 MSDN 및 SO 게시물에서 본 지침을 따릅니다. MY -s \

    winhttpcertcfg -g -c LOCAL_MACHINE을 [CERT] -a [사용자/ASPNET/auth'd 사용자]

    winhttpcertcfg.exe -i [cert.pfx] -c LOCAL_MACHINE \ MY -p [pwd]

  4. .pfx 파일을 Chrome으로 가져 왔습니다. Chrome에서 해당 URL을 클릭하면 내 인증서를 선택하라는 메시지가 표시되고 URL을 계속 진행할 수 있습니다. IE에서 동일한 동작.

는 그래서 내가 선택하지 않은 어떤 옵션이 확실하지 않다 또는 내가 부여하지 않은 것을 허락하지만, VS에서 실행 나에게 구체적으로 보인다. 내 WCF 서비스의 프로젝트 속성에서 "Visual Studio Development Server 사용"및 "로컬 IIS 웹 서버 사용"을 시도했지만 각각에서 동일한 동작을 얻습니다. 내가 뭘 놓치고 있니?

일부 코드 :

private static string DoPost(string postData) 
    { 
     string result = null; 

     var httpWebRequest = (HttpWebRequest)WebRequest.Create(GetEndpoint()); 
     var encoding = new ASCIIEncoding(); 
     var bytes = encoding.GetBytes(postData); 

     httpWebRequest.Method = "POST"; 
     httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
     httpWebRequest.ContentLength = bytes.Length; 
     httpWebRequest.ClientCertificates.Add(clientCertificate); 

     using (var stream = httpWebRequest.GetRequestStream()) 
     { 
      stream.Write(bytes, 0, bytes.Length); 
      stream.Close(); 

      using (var httpWebResponse = httpWebRequest.GetResponse()) 
      using (var responseStream = httpWebResponse.GetResponseStream()) 
      { 
       if (responseStream != null) 
       { 
        using (var reader = new StreamReader(responseStream)) 
        { 
         result = reader.ReadToEnd(); 
        } 
       } 
      } 
     } 

     return result; 
    } 

그리고 인증서 획득 코드 (다른 dev에 의해 작성된 유틸리티 클래스를,이 생산에서 잘 작동하는 것 같다) : 내가 만든

public static X509Certificate2 GetCertificateBySerial(string serial) 
    { 
     var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 

     var certColl = store.Certificates.Find(X509FindType.FindBySerialNumber, serial, false); 
     store.Close(); 

     if (certColl.Count == 0) 
     { 
      throw new Exception(String.Format("A certificate with a serial number of \"{0}\" is not installed on the server.", serial)); 
     } 
     return certColl[0]; 
    } 
+0

신뢰할 수있는 루트 인증 기관 저장소에도 인증서를 추가하려고합니다. 브라우저가 URL로 이동할 때 아무 것도 묻지 않으면 코드가 직접 연결하는 데 어려움을 겪을 것입니다. –

+0

제안 해 주셔서 감사합니다.로컬 컴퓨터와 현재 사용자 신뢰할 수있는 루트 인증 기관 모두로 가져 오기를 시도했지만 어느 것도 영향을 미치지 않았습니다. –

+0

흠 - 알겠습니다. 아마 이미 본 적이 있지만 [이 페이지] (http://support.microsoft.com/kb/186812)에 대한 의견은 실제로 서버에서 문제가 있음을 나타냅니다. –

답변

0

몇 가지 변화가 있었고이를 작동시킬 수있었습니다. 하나는 GET에서 POST *로 변경해야했기 때문에 실수로 게시물 데이터의 끝점/URL 부분을 남겼습니다 (oops). 둘째, 나는 내 HttpWebRequest를이 포함 :

httpWebRequest.ProtocolVersion = HttpVersion.Version11; 

그리고 마지막이는 403.7 오류가 실제로 내 트래픽을 차단 피들러에 의해 발생되고있다. Fiddler에서이 인증서를 올바르게 구성하지 않았지만 다음 단계로 넘어갑니다. 일단 Fiddler를 종료하고 실제로 POST 데이터를 올바르게 포맷하면 문제가 해결되었습니다.

* GET에서 POST로 전환하는 것은이 문제를 해결하는 것과 아무런 관련이 없습니다.

TL; DR 요청을 올바르게 포맷하지 않았습니다.