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.ClientCertificates (コレクション) のモノタッチ実装が「実装されていない例外」をスローするため、HttpWebRequest を利用できません。
  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を使用している理由の1つであり、Win-Winです。

于 2012-11-01T06:26:54.470 に答える