2016-10-13 1 views
18

.Net Core와 함께 놀고 있었고 결제 API를 사용하는 API를 만들었습니다. 양방향 SSL 인증 요청에 추가해야하는 클라이언트 인증서가 있습니다. HttpClient를 사용하여 .Net Core에서 어떻게 구현할 수 있습니까?.net 코어에 클라이언트 인증서 추가 Httpclient

다양한 기사를 살펴본 결과 HttpClientHandler가 클라이언트 인증서를 추가하는 옵션을 제공하지 않는다는 것을 알았습니다.

HTTPS + 클라이언트 인증서를 IIS를 구성, IIS 뒤에 내 Asp.Net 코어 웹 사이트를 배포하여 내 클라이언트에 닷넷을 사용하지 않는

답변

18

https://www.microsoft.com/net/core 다음 단계에 따라 내 플랫폼 (Linux Mint 17.3)에 새로 설치를 실행했습니다. netcoreapp1.0 프레임 워크를 대상으로 새로운 콘솔 응용 프로그램을 만들고 클라이언트 인증서를 제출할 수있었습니다. 그러나 유효한 인증서를 사용 했더라도 "SSL connect error"(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

나는 호기심있다. 리눅스 머신이나 윈도우에서이 작업을 수행 했습니까? – Steven

+0

Windows (10)과 Linux (Mint 17.3, 18 및 18.1)에서 모두 작업하고 있습니다. 비공개 키없이 인증서를 사용하려고하면 "SSL 연결 오류"(CURLE_SSL_CONNECT_ERROR 35)가 발생했습니다. – yfisaqt

2

조언을하지만 서버 측이 IIS를 통해 간단하게 구성 할 수 있습니다하십시오 :

IIS 클라이언트 인증서 설정 :

그런 다음 당신은 단순히 코드에서 그것을 얻을 수 있습니다

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

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

나에게 잘 돌아가고 있지만 컬이나 크롬을 클라이언트가 아닌. 닷넷으로 사용하고 있습니다. HTTPS 핸드 셰이크가 진행되는 동안 클라이언트는 서버에서 인증서를 제공하고 서버에 요청하는 요청을받습니다.

.Net 핵심 클라이언트를 사용하는 경우 플랫폼 특정 코드를 가질 수 없으며 OS 특정 인증서 저장소에 자신을 연결할 수 없다면 의미가 있습니다. 서버에. 당신은 닷넷 4.5.x에 대해 컴파일한다면 쉽게 보인다

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

그것은 당신이 Windows 인증서 저장소에 연결 할 수 있도록하려는 경우, 컬를 컴파일 할 때처럼

, 컴파일해야 그것은 특정 Windows 라이브러리에 반대합니다.

+0

시간 응답을 가지고 가기를위한 감사합니다, 그러나 나는 asp.net 중핵을 위해 이것을 사용하고있었습니다. 위의 코드는 나를 위해 일했습니다. –

0

나는 서비스와 함께 모바일과 데스크탑 사이에서뿐만 아니라 통신하는 비슷한 프로젝트를 가지고있다.

EXE의 Authenticode 인증서를 사용하여 요청을 처리하는 바이너리인지 확인합니다.

요청한 쪽 (게시물 단순화 이상).우리는 URL의를하려고하는 자들을 원하는대로

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); 
    } 
} 

나는 다음 잘못된 요청을보다는 얻을

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

우리는 오히려 500보다 404을 제공하는 요청을 받으면 작업에 다음 코드를 사용하여 그 (것)들이 "바른 길에"다는 것을 알게하십시오