2012-10-12 29 views
5

MonoTouchを使用してSSL接続にクライアント証明書を使用しようとしています。 objective-cを使ってこれを行ういくつかの例があるようですが、私が探している解決策はおそらくhereだがMonoTouch(C#)と答えた方が似ているでしょう。MonotouchでHTTPSクライアント証明書

私は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名前空間を使用して証明書を正常に開くことも試みましたが、必要に応じてクラスインスタンスを使用して認証チャレンジに応答することはできませんIntPtrだけを受け付けるNSUrlCredentialオブジェクトを作成します。
  4. thisも参照してください。

答えて

1

使用HttpWebRequestの。質問のポイント2で、私はHttpWebRequest.ClientCertificatesプロパティが実装されていない例外をスローしたと言ったので、私はこのオプションを除外しました。新しいコレクションでプロパティを設定しようとするとしますが、Getアクセサを使用するだけではコレクションにクライアント証明書を追加できます。

補足として、HttpWebRequestを使用すると、MonoDevelopを使用してwin-winという理由のために、アプリケーションを他のデバイスに移動しやすくなります。

+0

どのようにNSUrlSessionでこれを動作させるかについてのアイデアはありますか? – nhenrique

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 ;-) 
... 
+0

ありがとう:)私はハンドルを取得する方法の問題を過去にして、それゆえに「受け入れられた答え」を得ました。残念ながらリクエストは失敗します(iPhoneにプロファイルの一部として証明書をインストールすると、Safariをサイトに接続しても機能します)。 MonoTouchとクライアント証明書を使って成功した人は誰もいませんでした。ただ、私は何かばかげていると思っているだけで、それは単に可能ではない/サポートされていないということではありません。研究を続けます。援助を感謝します。 – Bruce

関連する問題