使用HttpClient时,客户端证书无效

时间:2015-10-01 05:23:52

标签: c# httpclient client-certificates

我需要使用客户端证书将数据发布到远程服务器。问题是我收到一条消息称客户端证书无效。请参阅下面的返回消息

 StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content:      
 System.Net.Http.StreamContent, Headers:     
 {     
   connection: close     
   pragma: no-cache     
   Cache-Control: no-cache     
   Date: Thu, 01 Oct 2015 04:05:24 GMT     
   P3P: CP="NON CUR OTPi OUR NOR UNI"     
   Content-Length: 505     
   Content-Type: text/html     
 }     
 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">     
 <!-- Copyright (C) 2000 Tivoli Systems, Inc. -->     
 <!-- Copyright (C) 1999 IBM Corporation -->     
 <!-- Copyright (C) 1998 Dascom, Inc. -->     
 <!-- All Rights Reserved. -->     
 <HTML>     
 <HEAD>     
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-     
 8">     
 <TITLE>Certification authentication failed</TITLE>     
 </HEAD>     
 <BODY>     
 An attempt to authenticate with a client certificate failed.     
 <BR>     
 A valid client certificate is required to make this connection.     
 </BODY>     
 </HTML>     

我尝试了什么:

  1. 我获得的证书是Encrypt.p12,Sign.p12,Test_Enc.crt,Test_sign.crt。我双击所有这些证书并安装所有这些。但它对我没有帮助。

  2. 根据工具指南,它说公司的HTTP请求应该使用参数名称&#39;输入&#39;指定有效负载值。所以我尝试添加&#34;输入=&#34;在内容面前。在我的情况下是&#39; ReqContent =&#34;输入=&#34; +&#39;&#39; ReqContent;&#39;

  3. 所以我做错了什么或者我应该做什么,但我没有做过?

    以下是我的代码。

    public async Task<string> PostRequest(string ReqContent)
    {
        //ReqContent = "Input=" + ReqContent; this doesn't solve the certificate     issue
    
                    WebRequestHandler handler = new WebRequestHandler();
                    X509Certificate2 certificate = null;
                    certificate = GetX509Certificate(@"C:\Test     certificate\Test_sign.crt");
                    handler.ClientCertificates.Add(certificate);
    
                    HttpClient client = new HttpClient(handler);
    
                    client.BaseAddress = new Uri("https://www.somecompany.com   /cert/invoke/mm.cdds.common.services");
                    client.DefaultRequestHeaders.Host = "www.somecompany.com";
                    client.DefaultRequestHeaders.Add("contenttype",    "application/xml");
    
                    client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
                    client.DefaultRequestHeaders.Connection.Clear();
                    client.DefaultRequestHeaders.Connection.Add("keep-alive");
                    client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { NoCache = true };
                    client.DefaultRequestHeaders.Pragma.Clear();
                    client.DefaultRequestHeaders.Pragma.Add(new NameValueHeaderValue("no-cache"));
                    client.DefaultRequestHeaders.UserAgent.Clear();
                    client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("Java", "1.6.0_20"));
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
    
                    HttpContent _content = new StringContent(ReqContent);
    
                    _content.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
                    _content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
                    HttpResponseMessage response = await client.PostAsync(client.BaseAddress, _content);
    
                    string result = response.Content.ReadAsStringAsync().Result;
                    textBox2.Text = response + Environment.NewLine + result;
    }
    

1 个答案:

答案 0 :(得分:1)

我遇到了与HTML相同的问题,其响应与上面所附的完全相同。

问题实际上是服务器未接受客户端证书。因此,需要做的是在服务器上“注册”您的客户端证书。

我从响应中获得了另外一个标头,它指示我要连接的服务器:

server: WebSEAL/7.0.0.35 (Build 180731)