使用HttpClient时客户端证书无效

本文关键字:证书 无效 客户端 HttpClient 使用 | 更新日期: 2023-09-27 18:15:30

我需要将数据发送到具有客户端证书的远程服务器。问题是我收到一个消息说客户端证书无效。参见下面的返回消息

 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>     

What I tried:

  1. 我得到的证书是加密的。p12,标志。p12, Test_Enc。crt, Testrongign.crt。我双击了所有这些证书并安装了所有这些。但这对我没有帮助。

  2. 根据实现指南,它说对公司的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;
}

使用HttpClient时客户端证书无效

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

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

我从响应中得到了一个报头,它指示我正在连接到哪个服务器:

server: WebSEAL/7.0.0.35 (Build 180731)