C# .NET-使用证书通过JAVA API进行身份验证(SSL/TLS错误)

C# .NET-使用证书通过JAVA API进行身份验证(SSL/TLS错误),c#,.net,authentication,ssl,C#,.net,Authentication,Ssl,因此,几周来,我一直在尝试制作一个.NET应用程序,使用客户端证书通过政府Java API进行身份验证 它正常工作了几天,然后我开始得到这个异常:“请求被中止:无法创建SSL/TLS通道。” 我知道关于这个问题有很多问题,我已经尝试了所有我能找到的解决方案,但没有一个有效 代码如下: public async static Task<string> AuthenticateAsync() { var objT = default(string)

因此,几周来,我一直在尝试制作一个.NET应用程序,使用客户端证书通过政府Java API进行身份验证

它正常工作了几天,然后我开始得到这个异常:“请求被中止:无法创建SSL/TLS通道。”

我知道关于这个问题有很多问题,我已经尝试了所有我能找到的解决方案,但没有一个有效

代码如下:

        public async static Task<string> AuthenticateAsync()
    {
        var objT = default(string);
        HttpResponseMessage resultHttp;

        try
        {
            WebRequestHandler handler = new WebRequestHandler();
            var certificate = CertificateHelper.GetCertificateFromLocalMachine();
            ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(CustomValidation);
            ServicePointManager.SecurityProtocol = /*SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls |*/ SecurityProtocolType.Ssl3;

            if (certificate != null)
            {
                //certificate.FriendlyName = "anAlias";
                X509Certificate2 cert = new X509Certificate2();
                cert.Import(@"D:\Documentos\DUE\Certificados\eCPF\usa esse\jhonatan.pfx", "*******", X509KeyStorageFlags.Exportable);

                handler.ClientCertificates.Add(cert);

                byte[] bytes = cert.Export(X509ContentType.Pkcs12);

                handler.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(CustomValidation);
                using (var client = new HttpClient(handler))
                {
                    //! Uri base
                    client.BaseAddress = new Uri(Endpoint);
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(
                                    new MediaTypeWithQualityHeaderValue("application/xml"));
                    client.DefaultRequestHeaders.Add("CurrentCultureName", "pt-BR");

                    client.DefaultRequestHeaders.Add("Role-Type", "DEPOSIT");
                    client.DefaultRequestHeaders.Add("User-Agent", "Chrome");
                    resultHttp = await client.PostAsync("/portal/api/autenticar", new ByteArrayContent(bytes));

                    if (resultHttp.StatusCode == HttpStatusCode.OK)
                    {
                        objT = await resultHttp.Content.ReadAsAsync<string>();
                    }
                    else
                    {
                        //! Tratamento de erro quando statuscode for diferente de 200 (Ok)
                        objT = await resultHttp.Content.ReadAsAsync<string>();
                    }
                }
            }
        }
public异步静态任务AuthenticateAsync()
{
var objT=默认值(字符串);
httpresponsemessageresulthtp;
尝试
{
WebRequestHandler=新的WebRequestHandler();
var certificate=CertificateHelper.GetCertificateFromLocalMachine();
ServicePointManager.ServerCertificateValidationCallback+=新系统.Net.Security.RemoteCertificateValidationCallback(CustomValidation);
ServicePointManager.SecurityProtocol=/*SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls |*/SecurityProtocolType.Ssl3;
如果(证书!=null)
{
//certificate.FriendlyName=“anAlias”;
X509Certificate2证书=新的X509Certificate2();
cert.Import(@“D:\Documentos\DUE\Certificados\eCPF\usa esse\jhonatan.pfx”,“*******”,X509keystrageFlags.Exportable);
handler.ClientCertificates.Add(cert);
byte[]bytes=cert.Export(X509ContentType.Pkcs12);
handler.ServerCertificateValidationCallback+=新系统.Net.Security.RemoteCertificateValidationCallback(CustomValidation);
使用(var客户端=新的HttpClient(处理程序))
{
//!Uri基
client.BaseAddress=新Uri(端点);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
新的MediaTypeWithQualityHeaderValue(“应用程序/xml”);
client.DefaultRequestHeaders.Add(“CurrentCultureName”、“pt BR”);
client.DefaultRequestHeaders.Add(“角色类型”、“存款”);
client.DefaultRequestHeaders.Add(“用户代理”、“Chrome”);
resultHttp=wait client.PostAsync(“/portal/api/autenticar”,新的ByteArrayContent(字节));
if(resultHttp.StatusCode==HttpStatusCode.OK)
{
objT=await resultHttp.Content.ReadAsAsync();
}
其他的
{
//!Tratamento de erro quando不同de 200的状态代码(正常)
objT=await resultHttp.Content.ReadAsAsync();
}
}
}
}
我尝试过的事情:

  • 使用ServerCertificateValidationCallback设置自定义验证方法(我尝试了3种不同的方法)
  • 使用SecurityProtocol更改协议和测试。如果我设置为TLS协议,我会得到HTTP错误“422不可处理实体”
  • Test ServicePointManager.Expect100Continue设置为true或false,没有任何区别
  • 使用HttpResponseMessage实现身份验证,错误相同
  • 实施解决方案,没有成功
  • 实施解决方案,也没有成功
  • 在线找到多个解决方案的组合,但没有成功
  • 以.pfx和.p12文件的形式在请求中传递客户端证书(使用openssl创建不同的格式),相同错误
  • DateTime
    解析为常用格式,以检查它是否不是日期问题,是否成功

  • 编辑:每次收到SSL/TLS错误之前,都会出现不稳定的情况。例如,几天前,我整天都收到这个错误,但在晚上,当我回到家再次测试时,它工作正常。它工作了大约一周,然后开始显示SSL/TLS错误再次说明。

    如果它正在工作,然后停止,可能是证书过期了?或者他们的API更改为新版本的TLS?我刚刚检查了证书,它的有效期到12月2日。我想他们可能已经更改了。现在他们使用的是TLS1.2,但在VS中使用此协议时,我得到了422错误,可能是我做错了什么?请看一看在版本控制历史:什么改变了?可能是文件编码?我无法访问服务器的代码,或版本控制,或任何其他信息,因为这是政府的API,我从他们那里得到的只是我检查了一百次的文档。里面没有关于协议改变的内容。我是说你的代码源代码控制。如果你在一个团队中,可能会因为某个人有不同的默认值而改变编码