C# 使用HttpClient时客户端证书无效

C# 使用HttpClient时客户端证书无效,c#,httpclient,client-certificates,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

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

 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>     
StatusCode:200,原因短语:“确定”,版本:1.1,内容:
System.Net.Http.StreamContent,标题:
{     
连接:关闭
pragma:没有缓存
缓存控制:没有缓存
日期:2015年10月1日星期四04:05:24 GMT
P3P:CP=“非当前OTPi我们的NOR UNI”
内容长度:505
内容类型:text/html
}     
证书验证失败
尝试使用客户端证书进行身份验证失败。

建立此连接需要有效的客户端证书。
我尝试的是:

  • 我得到的证书是Encrypt.p12、Sign.p12、Test_Enc.crt、Test_Sign.crt。我双击了所有这些证书并安装了所有这些证书。但这对我没有帮助

  • 根据实施指南,它说对公司的HTTP请求应该使用参数名“Input”来指定有效负载值。因此,我尝试在内容前面添加“Input=”。在我的例子中是'ReqContent=“Input=”+''ReqContent;'

  • 我做错了什么,或者我应该做但我没有做的什么

    下面是我的代码

    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;
    }
    
    公共异步任务PostRequest(字符串请求内容)
    {
    //ReqContent=“Input=“+ReqContent;这不能解决证书问题
    WebRequestHandler=新的WebRequestHandler();
    X509Certificate2证书=null;
    certificate=GetX509Certificate(@“C:\Test certificate\Test_sign.crt”);
    handler.ClientCertificates.Add(证书);
    HttpClient=新的HttpClient(处理程序);
    client.BaseAddress=新Uri(“https://www.somecompany.com   /cert/invoke/mm.cdds.common.services);
    client.DefaultRequestHeaders.Host=“www.somecompany.com”;
    client.DefaultRequestHeaders.Add(“contenttype”、“application/xml”);
    Add(“接受编码”、“gzip、deflate”);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/xml”);
    client.DefaultRequestHeaders.Connection.Clear();
    client.DefaultRequestHeaders.Connection.Add(“保持活动”);
    client.DefaultRequestHeaders.CacheControl=new CacheControlHeaderValue(){NoCache=true};
    client.DefaultRequestHeaders.Pragma.Clear();
    client.DefaultRequestHeaders.Pragma.Add(新名称ValueHeaderValue(“无缓存”));
    client.DefaultRequestHeaders.UserAgent.Clear();
    client.DefaultRequestHeaders.UserAgent.Add(新产品InfoHeaderValue(“Java”,“1.6.0_20”));
    client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“text/html”);
    HttpContent _内容=新的StringContent(ReqContent);
    _content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/xml”);
    _content.Headers.ContentType=新的MediaTypeHeaderValue(“application/x-www-form-urlencoded”);
    HttpResponseMessage response=wait client.PostAsync(client.BaseAddress,_content);
    字符串结果=response.Content.ReadAsStringAsync().result;
    textBox2.Text=response+Environment.NewLine+result;
    }
    
    我遇到了同样的问题,因为响应的HTML与上面所附的完全相同

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

    我从响应中又得到了一个标头,它指示我连接到的服务器:


    服务器:WebSEAL/7.0.0.35(Build 180731)

    你好,海龙,非常感谢。我已向服务器端发送请求,请求获取新证书。