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.
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; –
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. –
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ì. –