相关疑难解决方法(0)

WebApi HttpClient不发送客户端证书

我正在尝试使用客户端证书使用ssl和客户端身份验证来保护我的RESTful WebApi服务.

去测试; 我已生成一个自签名证书并放置在本地计算机,受信任的根证书颁发机构文件夹中,并且我已生成"服务器"和"客户端"证书.服务器的标准https无问题.

但是我在服务器中有一些代码来验证证书,当我使用提供客户端证书的测试客户端进行连接并且测试客户端返回403 Forbidden状态时,这永远不会被调用.

这实现了服务器在我的证书到达我的验证码之前失败了.但是,如果我启动提琴手它知道需要客户端证书并要求我提供一个到我的文档\ Fiddler2.我给了它我在我的测试客户端使用的相同客户端证书,我的服务器现在工作,并收到我期望的客户端证书!这意味着WebApi客户端没有正确发送证书,我的客户端代码与我找到的其他示例几乎相同.

    static async Task RunAsync()
    {
        try
        {
            var handler = new WebRequestHandler();
            handler.ClientCertificateOptions = ClientCertificateOption.Manual;
            handler.ClientCertificates.Add(GetClientCert());
            handler.ServerCertificateValidationCallback += Validate;
            handler.UseProxy = false;

            using (var client = new HttpClient(handler))
            {
                client.BaseAddress = new Uri("https://hostname:10001/");

                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

                var response = await client.GetAsync("api/system/");
                var str = await response.Content.ReadAsStringAsync();

                Console.WriteLine(str);
            }
        } catch(Exception ex)
        {
            Console.Write(ex.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)

任何想法为什么它会在提琴手但不是我的测试客户端?

编辑:这是GetClientCert()的代码

private static X509Certificate GetClientCert()
    {            
        X509Store store = null;
        try
        {
            store = new X509Store(StoreName.My, …
Run Code Online (Sandbox Code Playgroud)

.net c# ssl fiddler asp.net-web-api

25
推荐指数
1
解决办法
2万
查看次数

.NET应用程序无法发送客户端证书 - Win 7 vs Win XP?

我正在开发一个ASP.NET Web应用程序,它使用HttpWebRequest向另一台服务器发送请求.它通过HTTPS发送请求,远程服务器需要客户端证书.请求在.NET应用程序中失败,显然无法发送正确的客户端证书.我能够成功连接并发送客户端证书,如果我只需访问URL以网页浏览器(Chrome明确).

下面的代码是一个简单的再现,只有一个基本的GET请求.

var r = WebRequest.Create(url) as HttpWebRequest;
r.ClientCertificates = new X509CertificateCollection { myX509Cert };
using (var resp = r.GetResponse() as HttpWebResponse) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我得到了我们最喜欢的例外,"无法创建SSL/TLS安全通道".通常,这些类型的问题指向证书私钥的权限问题.我尝试了所有我能想到的东西,以确保这一切都正确配置,但也许我错过了一些东西.简而言之,远程服务器正在发送一个TLS CertificateRequest,其列表似乎正确地标识了我的客户端证书,但我的应用程序无法响应任何客户端证书.

这是我的设置:

  • Windows 7专业版64位
  • 能够在Visual Studio开发服务器,在本地IIS中运行的ASP.NET WebForms/.NET 3.5应用程序以及.NET控制台应用程序/ .NET 4中运行的ASP.NET MVC 3/.NET 4应用程序中重现该问题
  • 最近安装了Microsoft .NET Framework 4.5.还没有检查这是否是一个问题

这是我尝试过的一切,以及我所知道的:

  • 在Windows XP计算机上运行时,此代码似乎工作正常
  • 我确保将我的客户端证书导入到本地计算机,个人证书存储中,并为我自己和所有相关IIS用户正确配置了私钥权限
  • 我尝试在我的机器上重新安装证书几次
  • 我已经确认.NET应用程序可以访问X509证书并且HasPrivateKey= true
  • 确保我的客户证书有效.它实际上是运行此应用程序的Web服务器的SSL证书
  • PreAuthenticate = true在请求对象中设置.没有什么区别
  • 我尝试过设置ServicePointManager.Expect100Continue = false,没有什么区别
  • 我试过设置ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3,但显然远程服务器需要TLS,所以没有帮助
  • 我设置一个ServicePointManager.ServerCertificateValidationCallback委托总是返回true.但是,在TLS握手中,它甚至在调用此委托之前就失败了
  • 当我转到Chrome中的URL时,它会要求我提供客户端证书,提供正确的客户端证书作为选择,我选择该证书并获得有效的响应.当我在Fiddler中构造请求时也能正常工作.所以它似乎特别是我的.NET代码,而不是证书本身或远程服务器等问题.
  • 我正在使用的供应商在不同的远程服务器上设置了相同的服务,该服务需要不同的客户端证书.所以我尝试了不同的URL和客户端证书同样的事情,并得到了同样的失败

我添加了System.Net跟踪,看到了这个: …

.net ssl client certificate

19
推荐指数
2
解决办法
1万
查看次数

带有客户端证书的Xamarin Forms https会抛出WebException

我试图在iOS的Xamarin Forms App中使用客户端证书进行身份验证,但似乎没有任何效果.如果我启动请求,应用程序等待默认超时100秒(我尝试使用HttpWebRequest.Timeout降低它,但设置似乎被忽略),之后,我得到以下异常:获取响应流时出错(ReadDone1) :ReceiveFailure

与Windows控制台应用程序相同的代码工作正常.这里有一些(为便于阅读而简化)片段重现:

客户:

var clientCertificate = new X509Certificate2(data, pwd);
var result = await ExecuteRequest("https://server/user.aspx", clientCertificate);

public static async Task<string> ExecuteRequest(Uri uri, X509Certificate2 clientCertificate)
{
    var hwr = (HttpWebRequest)HttpWebRequest.Create(uri);
    if (clientCertificate != null)
    {
        hwr.ClientCertificates.Add(clientCertificate);
    }
    hwr.Method = "GET";
    try
    {
        var resWebResonse = await hwr.GetResponseAsync();
        var stream = resWebResonse.GetResponseStream(); 
        var sr = new StreamReader (stream);   
        return sr.ReadToEnd();
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"Error executing Webrequest to {uri}: {ex}");
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

服务器:user.aspx

<%@ Page Language="C#" …
Run Code Online (Sandbox Code Playgroud)

c# ssl https ssl-certificate xamarin.ios

8
推荐指数
1
解决办法
1251
查看次数

使用 c# 使用证书进行 SSL 客户端身份验证

我需要创建 ac# 应用程序,该应用程序必须使用 SSL 将 API 请求发送到服务器。我需要创建客户端身份验证。我已经有了服务器 CA 证书、客户端证书 (cer)、客户端私钥 (pem) 和密码。我找不到有关如何创建客户端连接的示例。有人可以建议我从哪里开始解释一个很好的小代码吗?我手里有客户端证书 (PEM)、客户端证明密钥和客户端密钥的密码。我不知道从哪里开始编写向服务器发送请求的代码

c# authentication ssl client ssl-certificate

5
推荐指数
1
解决办法
2797
查看次数