나는 어떤 종류의 웹 서비스를 당신이 다른 쪽 끝의 REST-ish라고 부르는 WCF 서비스를 가지고있다. 메소드의 URL은 "https://partner.someservice.com/SomeMethod.asp"과 같습니다. 일부 쿼리 문자열 args 끝까지 벼락치기 및 그들의 서버에 요청을 POST.
VS의 오류는 403을 표시하지만 피들러를 사용하면 403.7이 표시됩니다. 내 브라우저에 인증서를 가져 오기 전에 403.7도 보았습니다. 내 요청 개체를 검사하고 [1] cert를 지정하여 ClientCertificates를 볼 수 있으므로 첨부되는 것으로 확신합니다.
.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]
.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];
}
신뢰할 수있는 루트 인증 기관 저장소에도 인증서를 추가하려고합니다. 브라우저가 URL로 이동할 때 아무 것도 묻지 않으면 코드가 직접 연결하는 데 어려움을 겪을 것입니다. –
제안 해 주셔서 감사합니다.로컬 컴퓨터와 현재 사용자 신뢰할 수있는 루트 인증 기관 모두로 가져 오기를 시도했지만 어느 것도 영향을 미치지 않았습니다. –
흠 - 알겠습니다. 아마 이미 본 적이 있지만 [이 페이지] (http://support.microsoft.com/kb/186812)에 대한 의견은 실제로 서버에서 문제가 있음을 나타냅니다. –