我正在尝试使用MonoTouch将客户端证书用于SSL连接。似乎有几个例子使用objective-c来做到这一点,我正在寻找的解决方案可能与回答here但在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);
}
}
一些注意事项:
答案 0 :(得分:2)
我没有设置服务器环境来试试这个,但试试这个:
替换:
...
MonoTouch.Security.SecTrust trust = (MonoTouch.Security.SecTrust)items[0]["trust"];
IntPtr secTrustRef = trust
...
使用:
...
NSObject obj = items[0]["trust"];
IntPtr secTrustRef = obj.Handle;
... create and use your credentials
GC.KeepAlive (obj); // just in case ;-)
...
答案 1 :(得分:1)
使用HttpWebRequest。在问题说明第2点我说HttpWebRequest.ClientCertificates属性抛出一个未实现的异常,因此我排除了这个选项。如果您尝试使用新集合设置属性,但如果您只使用Get访问器,则可以将该客户端证书添加到集合中。
作为旁注,使用HttpWebRequest使应用程序更易于移植到其他设备,部分原因是我们使用MonoDevelop这样双赢。