2017-09-22 17 views
0

WebAPIに接続する.netコア(標準1.6)ライブラリを作成しています。 WebApiにはクライアント証明書が必要です。Xamarin .NetコアHttpClientHandlerメソッドが実装されていません(Mac用VS)

.netコアライブラリは、Xamarin iOSアプリケーションから呼び出されたものです。

私の人生の間、クライアント証明書ヘッダーでHTTP要求を送信できません。

Windowsマシン上でVisual Studio 2017のクライアント証明書を使用してライブラリを使用してAPIに送信できます。

私はMac用のVSを使用して、私のXamarinのiOSアプリに同じプロジェクトを移動すると、私が得る: SslProtocolを設定したり、クライアント証明書を追加するとき、「メソッド実装されていません」:

var handler = new HttpClientHandler(); 
      handler.ClientCertificateOptions =  ClientCertificateOption.Manual; 
      handler.SslProtocols = SslProtocols.Tls12; 
      handler.ClientCertificates.Add(new X509Certificate2(certificate)); 

関連ライブラリ:

using System.Net; 
using System.Net.Http; 
using System.Security; 
using System.Security.Cryptography.X509Certificates; 

ご協力いただければ幸いです。

+0

深い掘り下げが行われた後、クライアント証明書はミューテータに設定できますが、iosでは実装されません。 – Dys1

答えて

0

申し訳ありませんが、これはかなり時間がかかっていましたが、私のサーバー上のクライアント認証用にクライアント証明書をWebリクエストで送信することができました。

まず、Xamarinと.netCoreは素晴らしいですが、それらは多くの方法が欠けています.netの開発者は慣れています。私はHttpWebRequestのようなAndroidとiosの両方で動作するクロスプラットフォーム要求を構築できませんでした。

私はその後、上書きNSUrlConnectionDataDelegate

//cert is a byte array of a .pfx file included in the resource file 

//iSecurity Custom class 

    NSUrlCredential credential = iSecurity.ImportPK12File(cert, "certpassword"); 

     public static NSUrlCredential ImportPK12File(byte[] fileBytes, string passPhrase) 
     { 

     var cert = new X509Certificate2(fileBytes, passPhrase); 

     var options = NSDictionary.FromObjectAndKey(NSObject.FromObject(passPhrase), SecImportExport.Passphrase); 

     NSDictionary[] importStatus; 
     SecStatusCode statusCode = SecImportExport.ImportPkcs12(fileBytes, options, out importStatus); 

     if(statusCode != SecStatusCode.Success){ 
      throw new Exception("Error importing certificate. "); 
     } 

     NSObject obj = importStatus[0]["trust"]; 
     IntPtr secTrustRef = obj.Handle; 

     var identityHandle = importStatus[0][SecImportExport.Identity]; 
     var identity = new SecIdentity(identityHandle.Handle); 
     var certificate = new SecCertificate(cert.GetRawCertData()); 

     SecCertificate[] certificates = { certificate }; 

     return NSUrlCredential.FromIdentityCertificatesPersistance(identity, certificates, NSUrlCredentialPersistence.ForSession); 

    } 
:私はその後、資格を返すクラスを作成し

public override void WillSendRequestForAuthenticationChallenge(NSUrlConnection 
connection, NSUrlAuthenticationChallenge challenge) 
    {     
     byte[] cert = System.IO.File.ReadAllBytes("clientCertificate.pfx"); 

     NSUrlCredential credential = iSecurity.ImportPK12File(cert, "certPassword"); 

     challenge.Sender.UseCredential(credential, challenge);   
    } 

iOS用

は、私から継承するカスタムクラスを作成しました

この方法を無効にして、信用状を送信することもできます: 公開オーバーライドvoid ReceivedAuthenticationChallenge(NSUrlConnection接続、NSUrlAuthenticationChallengeチャレンジ) { base.ReceivedAuthenticationChallenge(接続、チャレンジ); }

と私はそこにいますが、から継承クラスのデリゲート作成し、これをオフに発射するためにそれを移動することがあります。NSUrlConnectionDataDelegate をし、あなたの接続にこれを追加します。この接続を介して起動されたリクエストは、メソッドをオーバーライドして証明書を渡します。

関連する問題