43

Tôi đang thử một tính năng mới của windows 8.1 và windows phone 8.1 là chứng chỉ lưu trữ và khả năng sử dụng chứng chỉ ứng dụng khách cho xác thực máy khách ở phía máy chủ. Tuy nhiên tôi đang gặp vấn đề với chức năng này.Sử dụng chứng chỉ ứng dụng khách cho Windows RT (windows 8.1/windows phone 8.1)

Tôi có dịch vụ WCF được thử nghiệm cơ bản chạy trên IIS express. IIS express được cấu hình để hỗ trợ SSL và chứng chỉ ứng dụng khách. Trong tập tin cấu hình của IIS (configurationhost.config) Tôi đã thiết lập này:

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

Tôi đã thêm giấy chứng nhận của khách hàng trong các ứng dụng Windows RT như sau:

//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) 
{... 

Sau đó, tôi đang sử dụng HttpBaseProtocolFilter mà tôi thêm chứng chỉ khách hàng theo cách này:

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); 
.... 

Và sau đó yêu cầu:

012.
var resp = await httpClient.GetAsync(new Uri(serviceURL)); 

dòng mã này được tạo ra ngoại lệ này:

{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()} 

Tôi chắc chắn 100% rằng tôi đã chứng nhận quyền nhập khẩu cũng trên localhost (máy tính cục bộ) và cũng đứng về phía ứng dụng. Việc gọi dịch vụ thông qua trình duyệt đang hoạt động bình thường. (Tôi được nhắc cung cấp chứng chỉ ứng dụng khách), do đó, có một số vấn đề với việc cung cấp chứng chỉ ứng dụng khách trong ứng dụng.

Bất kỳ ai có thể giúp tôi về vấn đề này không? Cảm ơn bạn.

+0

lẽ là những gì bạn thấy là vì yêu cầu cho các CERT là một WebException trong C# mà bạn cần phải xử lý bằng cách bắt nó. vì bạn không thể thử bắt bạn cần phải loại bỏ sự chờ đợi và sử dụng một nhiệm vụ để xác nhận kết quả trong t.IsFaulted và kiểm tra t.Exception; –

+0

Pedro cảm ơn cho bình luận, nhưng tôi bắt ngoại lệ (tôi biết làm thế nào để làm việc với họ), có vấn đề, rằng không nên có một ngoại lệ vì cuộc gọi của yêu cầu nhận được nên làm việc như tôi gắn cert của khách hàng và yêu cầu hoạt động từ trình duyệt và cũng android. –

+0

Không, trong .Net tùy thuộc vào các tùy chọn yêu cầu một yêu cầu cert ném một ngoại lệ nó là cách nó hoạt động, tôi đã thực hiện nó tải lần. WebException được ném khi bạn nhận được một cái gì đó trong phản hồi 4XX. Sử dụng công cụ tìm kiếm để xem bạn trả lời những gì. –

Trả lời

1

Sự cố có thể liên quan đến tính hợp lệ của chứng chỉ mà bạn đang sử dụng.

Theo mặc định .Net từ chối thiết lập kết nối https với chứng chỉ không hợp lệ hoặc không đáng tin cậy.

Thông thường chứng chỉ không hợp lệ vì chứng chỉ được tạo bởi cơ quan không đáng tin cậy (chứng chỉ tự ký) hoặc do địa chỉ của trang không được bao gồm trong danh sách địa chỉ hợp lệ cho chứng chỉ.

Trong Net hạn chế này có thể được thư giãn, xem thảo luận này C# Ignore certificate errors?

Các vấn đề liên quan