使用ClientCert时,HttpClient失败并出现System.ArgumentException - >客户端证书未发送

时间:2014-10-24 20:06:57

标签: c# ssl windows-phone-8.1

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

我将ClientCertificate设置为通过HttpFilter对象使用。

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

请注意,我会执行两个HTTPS请求。第一个是HTTP OPTIONS请求,对于该请求,我确实看到了传递的客户端证书(我确实在这个上获得了HTTP 200响应)。当我使用HTTP POST执行第二个请求时,我得到了失败。两者都使用相同的代码路径将请求发送到服务器。

关于如何让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();
    }

}

2 个答案:

答案 0 :(得分:2)

问题最终是设置内容长度。我改变了设置帖子数据的方式,现在似乎有效:

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

答案 1 :(得分:0)

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