我正在尝试将客户端证书用于使用 MonoTouch 的 SSL 连接。似乎有几个使用objective-c的示例,我正在寻找的解决方案可能与此处回答的解决方案相似,但在MonoTouch(C#)中。
我在 MonoTouch 中使用 NSUrlConnection 类,并重写了 NSUrlConnectionDelegate 类来响应身份验证质询。
我已经能够从文件中加载证书,但我无法找到有用的证书表示来响应身份验证质询。
public override void ReceivedAuthenticationChallenge(NSUrlConnection connection, NSUrlAuthenticationChallenge challenge)
{
if (string.Equals(challenge.ProtectionSpace.AuthenticationMethod, "NSURLAuthenticationMethodClientCertificate", StringComparison.OrdinalIgnoreCase)) {
string password = "<password_signed_certificate>";
byte[] data = File.ReadAllBytes("<path_of_file_in_ios_sandboxed_filesystem_pkcs>");
NSDictionary opt = NSDictionary.FromObjectsAndKeys(new object[]{password}, new object[]{"passphrase"});
NSDictionary[] items;
SecStatusCode stat = SecImportExport.ImportPkcs12(data, opt, out items); // Uses MonoTouch.Security namespace
MonoTouch.Security.SecTrust trust = (MonoTouch.Security.SecTrust)items[0]["trust"];
// Everything to this point works, and I can inspect the trust object that all the expected certificate properties (IssuerName etc.) are correct
IntPtr secTrustRef = trust // ????? How do I bridge this gap
// NSUrlConnection does not utilise MonoTouch security namespace
NSUrlCredential cred = new NSUrlCredential(secTrustRef, true);
challenge.Sender.UseCredentials(cred, challenge);
}
}
一些注意事项:
- 我已经看到了 Objective-c 解决方案,但我没有找到 MonoTouch (C#) 中所需的等效步骤集。
- 我无法使用 HttpWebRequest,因为 httpWebRequest.ClientCertificates (一个集合)的单点触控实现会引发“未实现的异常”。
- 我还尝试使用 Mono.Security.X509 和 System.Security.Cryptography.X509Certificates 命名空间来成功打开证书,但是我再次无法利用类实例来响应身份验证质询,因为我需要创建一个 NSUrlCredential仅接受 IntPtr 的对象。
- 另请参阅此。