2016-10-13 101 views
18

私は、.Netコアで遊んでいて、支払いAPIを利用したAPIを構築していました。双方向SSL認証の要求に追加する必要があるクライアント証明書があります。 HttpClientを使用して.Net Coreでこれを実現するにはどうすればよいですか?.netコアにクライアント証明書を追加するHttpclient

私はさまざまな記事を見て、HttpClientHandlerがクライアント証明書を追加するオプションを提供していないことを発見しました。 :

私は私のクライアントのために.NETを使用していないが、サーバー側は、それがHTTPS +クライアント証明書のためにIISを構成し、IISの背後にある私のAsp.Netコアのウェブサイトを展開することにより、IISを経由して簡単に設定することができます

答えて

18

私のプラットフォーム(Linux Mint 17.3)には、以下の手順で新規インストールを実行しました:https://www.microsoft.com/net/corenetcoreapp1.0フレームワークを対象とした新しいコンソールアプリケーションを作成し、クライアント証明書を送信できました。ただし、有効な証明書を使用したとしても、テスト中に「SSL接続エラー」(CURLE_SSL_CONNECT_ERROR 35)が届きました。私のエラーは私のlibcurlに固有のものかもしれません。

更新:私はWindows 7で全く同じことを実行し、必要に応じて正確に動作しました。

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

var handler = new HttpClientHandler(); 
handler.ClientCertificateOptions = ClientCertificateOption.Manual; 
handler.SslProtocols = SslProtocols.Tls12; 
handler.ClientCertificates.Add(new X509Certificate2("cert.crt")); 
var client = new HttpClient(handler); 
var result = client.GetAsync("https://apitest.startssl.com").GetAwaiter().GetResult(); 
+0

wohaそれは仲間に働いてくれました。ありがとうございました。最近、私は休暇中だった。 –

+0

私は不思議です。あなたはこれをLinuxマシンやWindows上で動作させるようにしましたか? – Steven

+0

私はWindows(10)とLinux(Mint 17.3、18、18.1)の両方で動作しています。プライベートキーなしで証明書を使用しようとすると、「SSL接続エラー」(CURLE_SSL_CONNECT_ERROR 35)が表示されました。 – yfisaqt

2

を教えてください

IISクライアント証明書の設定:

が次にあなたは、単にコードでそれを得ることができます。

 var clientCertificate = await HttpContext.Connection.GetClientCertificateAsync(); 

     if(clientCertificate!=null) 
      return new ContentResult() { Content = clientCertificate.Subject }; 

私にとってはうまくいっていますが、私はカールやクロムをクライアントとして使用しています.Netのものではありません。 HTTPSハンドシェークの間、クライアントはサーバーから証明書を提供する要求を取得し、サーバーに送信します。

.Net Coreクライアントを使用している場合、プラットフォーム固有のコードを持つことはできません。また、OS固有の証明書ストアに接続できなかった場合は、それを抽出して送信できますサーバーに送信します。あなたは、.NET 4.5.xのに対して、コンパイルされた場合、簡単なようだ:

https://pfelix.wordpress.com/2012/12/16/using-httpclient-with-ssltls/

それはあなたがWindowsの証明書ストアに接続できるようにしたい場合は、カールをコンパイルするときのようなものだ

、コンパイルする必要がありますそれはいくつかの特定のWindowsライブラリに対してです。

+0

私はasp.netコアのためにこれを使用していました。上のコードは私のために働いた。 –

0

私はサービスとモバイルとデスクトップの間で通信する同様のプロジェクトを持っています。

EXEのAuthenticode証明書を使用して、リクエストを実行しているバイナリであることを確認します。

リクエスト側(投稿は簡略化)。私はその後、私たちはというし、不正な要求を取得するためのURLをしようとしているものを好きなように我々はむしろ404 500より提供要求

X509Certificate2 clientCertInRequest = Request.HttpContext.Connection.ClientCertificate; 
if (!clientCertInRequest.Verify() || !AllowedCerialNumbers(clientCertInRequest.SerialNumber)) 
{ 
    Response.StatusCode = 404; 
    return null; 
} 

を取得し、アクションに以下のコードを使用し

Module m = Assembly.GetEntryAssembly().GetModules()[0]; 
using (var cert = m.GetSignerCertificate()) 
using (var cert2 = new X509Certificate2(cert)) 
{ 
    var _clientHandler = new HttpClientHandler(); 
    _clientHandler.ClientCertificates.Add(cert2); 
    _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual; 
    var myModel = new Dictionary<string, string> 
    { 
     { "property1","value" }, 
     { "property2","value" }, 
    }; 
    using (var content = new FormUrlEncodedContent(myModel)) 
    using (var _client = new HttpClient(_clientHandler)) 
    using (HttpResponseMessage response = _client.PostAsync($"{url}/{controler}/{action}", content).Result) 
    { 
     response.EnsureSuccessStatusCode(); 
     string jsonString = response.Content.ReadAsStringAsync().Result; 
     var json = new Newtonsoft.Json.JsonSerializer(); 
     var myClass = JsonConvert.DeserializeObject<MyClass>(json); 
    } 
} 

彼らは彼らが "正しい軌道にある"ことを知らせてください

関連する問題