43

Windows 8.1 및 Windows Phone 8.1의 새로운 기능, 즉 인증서 저장소 및 서버 측의 클라이언트 인증을위한 클라이언트 인증서 사용 가능성을 시험하고 있습니다. 그러나이 기능에 문제가 있습니다.Windows RT (Windows 8.1/windows phone 8.1)의 클라이언트 인증서 사용

IIS에서 실행되는 기본 테스트 WCF 서비스가 있습니다. IIS express는 SSL 및 클라이언트 인증서를 지원하도록 구성됩니다.

<access sslFlags="SslRequireCert" /> (tried also SslNegotiateCert) 
<clientCertificateMappingAuthentication enabled="true" /> 

나는 다음과 같이 윈도우 RT 응용 프로그램 내에서 클라이언트 인증서 추가 한 : IIS (configurationhost.config)의 구성 파일에서 이 나는이 설정 한 다음

//Install the self signed client cert to the user certificate store 
string CACertificate = null; 
try 
{ 
    Uri uri = new Uri("ms-appx:///Assets/AdventureWorksTestClient1.pfx"); 
    var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri); 
    IBuffer buffer = await FileIO.ReadBufferAsync(file); 
    using (DataReader dataReader = DataReader.FromBuffer(buffer)) 
    { 
     byte[] bytes = new byte[buffer.Length]; 
     dataReader.ReadBytes(bytes); 
     // convert to Base64 for using with ImportPfx 
     CACertificate = System.Convert.ToBase64String(bytes); 
    } 
    await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
      CACertificate, 
      "", 
      ExportOption.Exportable, 
      KeyProtectionLevel.NoConsent, 
      InstallOptions.None, 
      "ClientCert1"); 
} 
catch (Exception ex) 
{... 

내가 사용을 HttpBaseProtocolFilter 다음

IReadOnlyCollection<Certificate> certs = await CertificateStores.FindAllAsync(query); 

HttpBaseProtocolFilter bpf = new HttpBaseProtocolFilter(); 
if (certs.Count > 0) 
{ 
    cert = certs.ElementAt(0); 
    bpf.ClientCertificate = cert; 
} 
HttpClient httpClient = new HttpClient(bpf); 
.... 

그리고 요청 :

어떤에 나는 클라이언트 인증이 방법을 추가

이 코드 줄 6,

var resp = await httpClient.GetAsync(new Uri(serviceURL)); 
이 예외를 생성 :

{System.Exception: Exception from HRESULT: 0x80072F7D 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at JumpStartCertificateDemo.MainPage.<btnCallService_Click>d__0.MoveNext()} 

나는 나는 나는 또한 로컬 호스트 (로컬 컴퓨터) 또한 응용 프로그램 측을 마우스 오른쪽 버튼으로 인증서를 가져온 것을 100 % 확인합니다. 브라우저를 통한 서비스 호출이 올바르게 작동하고 있습니다. (클라이언트 인증서를 제공하라는 메시지가 표시됨) 응용 프로그램에 클라이언트 인증서를 제공 할 때 몇 가지 문제가 있어야합니다.

아무에게도 도움을 줄 수 있습니까? 고맙습니다.

+0

아마 당신이 볼 것은이 토론을 참조하십시오. catch를 시도 할 수 없으므로 기다림을 제거하고 t.IsFaulted에서 결과의 유효성을 검사하는 작업을 사용하여 t.Exception을 확인해야합니다. –

+0

Pedro는 덧글 주셔서 감사합니다,하지만 예외를 잡는 중입니다 (나는 그들과 함께 일하는 법을 알고 있습니다) 문제가 있습니다. 클라이언트 인증서를 첨부 할 때 get 요청의 호출이 작동해야하므로 예외가 있어서는 안됩니다. 요청은 브라우저와 안드로이드에서 작동합니다. –

+0

아니요 .Net. 요청 옵션에 따라 인증서 요청에서 예외가 발생합니다. 작동 방법은 여러 번 있습니다. 4XX 응답에서 무엇인가를 받으면 WebException이 발생합니다. 당신이 얻는 답글을보기 위해 바이올린을 사용하십시오. –

답변

1

이 문제는 사용중인 인증서의 유효성과 관련이있을 수 있습니다.

기본적으로 .Net은 유효하지 않거나 신뢰할 수없는 인증서로 https 연결을 설정하는 것을 거부합니다.

일반적으로 인증서는 신뢰할 수없는 기관 (자체 서명 된 인증서)에서 생성되었거나 사이트의 주소가 인증서의 유효한 주소 목록에 포함되어 있지 않기 때문에 유효하지 않습니다.

닷넷에서는 이러한 제한이 완화 될 수 있고, 인증서에 대한 요청은 당신이 그것을 잡기로 처리 할 필요가 C#에서 WebException이이기 때문에 C# Ignore certificate errors?