使用ClientCert时,HttpClient失败,出现System.ArgumentException->;未发

本文关键字:ArgumentException- gt System 未发 出现 ClientCert HttpClient 失败 使用 | 更新日期: 2023-09-27 18:27:42

我在Windows Phone应用程序中使用Windows.Web.Http.HttpClient时遇到问题。我使用的服务器需要客户端证书。当我调用SendRequestAsync()时,我得到一个"System.ArgumentException:值不在预期范围内"

我正在通过HttpFilter对象设置ClientCertificate。

我在服务器上运行Wireshark,我可以通过服务器密钥解密流量。在Wireshark中,我看到一个TLSv1.2服务器Hello,Certificate,CertificateRequest数据包,服务器请求由颁发我通过的证书的同一CA颁发的证书。在我看到Certificate Request数据包之后,我看到客户端发送了一个FIN,ACK数据包。

请注意,我处理两个HTTPS请求。第一个是一个HTTPOPTIONS请求,对于该请求,我确实看到了正在传递的客户端证书(我确实收到了一个HTTP200响应)。当我用HTTPPOST执行第二个请求时,我得到了失败。两者都使用相同的代码路径将请求发送到服务器。

关于如何让HttpClient使用证书,有什么想法吗?

这是我正在使用的代码:

IHttpFilter httpFilter = null;
HttpRequestMessage requestMsg = null;
HttpResponseMessage responseMessage = null;
HttpClient client = null;
try
{
    httpFilter = new HttpBaseProtocolFilter();
    httpFilter.AutomaticDecompression = true;
    httpFilter.ClientCertificate = _MyCertificate;
    httpFilter.AllowAutoRedirect = true;
    client = new HttpClient(httpFilter);
    requestMsg = new HttpRequestMessage();
    requestMsg.RequestUri = _Uri;
    requestMsg.Method = _HttpMethod;
    if (_PostData != null && _PostData > 0)
    {
        var postStream = new MemoryStream(_PostData);
        requestMsg.Content = new HttpStreamContent(postStream.AsInputStream());
        requestMsg.Content.Headers.Add(HeaderContentType, _ContentType);
        requestMsg.Content.Headers.Add(HeaderContentLength, _ContentLength.ToString());     
    }
    HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead;
    requestTask = client.SendRequestAsync(requestMsg, completionOption).AsTask(request.CancelTokenSource.Token);
    responseMessage = await requestTask;
     // .. process response
}
catch(Exception e)
{
    // handle errors
}
finally
{
    if (requestMsg != null)
    {
        requestMsg.Dispose();
    }
    if (responseMessage != null)
    {
        responseMessage.Dispose();
    }
    if (httpFilter != null)
    {
        httpFilter.Dispose();
    }
    if (client != null)
    {
        client.Dispose();
    }
}

使用ClientCert时,HttpClient失败,出现System.ArgumentException->;未发

问题最终在于设置内容长度。我改变了设置帖子数据的方式,现在似乎可以工作了:

if (_PostData != null && _PostData > 0)
{
   requestMessage.Content = new HttpBufferContent(request.PostData.AsBuffer());
   requestMessage.Content.Headers.Add(HeaderContentType, request.ContentType); 
}

确保您提供的客户端证书具有关联的私钥。