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);
}
}
いくつかの注意:
- 私はObjective-Cのソリューションを見てきましたが、私はMonoTouchで(C#の)に必要な手順の同等のセットを発見していません。
- httpWebRequest.ClientCertificates(コレクション)のモノタッチ実装が '実装されていない例外'をスローするため、HttpWebRequestを利用できません。
- Mono.Security.X509およびSystem.Security.Cryptography.X509Certificates名前空間を使用して証明書を正常に開くことも試みましたが、必要に応じてクラスインスタンスを使用して認証チャレンジに応答することはできませんIntPtrだけを受け付けるNSUrlCredentialオブジェクトを作成します。
- thisも参照してください。
どのようにNSUrlSessionでこれを動作させるかについてのアイデアはありますか? – nhenrique