5

我正在尝试将客户端证书用于使用 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);
   }
}

一些注意事项:

  1. 我已经看到了 Objective-c 解决方案,但我没有找到 MonoTouch (C#) 中所需的等效步骤集。
  2. 我无法使用 HttpWebRequest,因为 httpWebRequest.ClientCertificates (一个集合)的单点触控实现会引发“未实现的异常”。
  3. 我还尝试使用 Mono.Security.X509 和 System.Security.Cryptography.X509Certificates 命名空间来成功打开证书,但是我再次无法利用类实例来响应身份验证质询,因为我需要创建一个 NSUrlCredential仅接受 IntPtr 的对象。
  4. 另请参阅
4

2 回答 2

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 ;-)
...
于 2012-10-12T12:56:10.433 回答
1

使用 HttpWebRequest。在问题注释第 2 点中,我说 HttpWebRequest.ClientCertificates 属性引发未实现的异常,因此我排除了此选项。如果您尝试使用新集合将其设置为属性,则会这样做,但如果您只使用 Get 访问器,则可以将客户端证书添加到集合中。

附带说明一下,使用 HttpWebRequest 使应用程序更易于传输到其他设备,这是我们使用 MonoDevelop 如此双赢的部分原因。

于 2012-11-01T06:26:54.470 回答