C# 使用带有X.509证书的USB令牌插槽进行相互身份验证

C# 使用带有X.509证书的USB令牌插槽进行相互身份验证,c#,client-certificates,mutual-authentication,C#,Client Certificates,Mutual Authentication,我试图在C#中实现一个客户端库,以便与tomcat服务器通信。身份验证应通过在windows客户端的相互SSL身份验证中使用具有X.509证书的飞天epass2003令牌来完成 但是,我有一个坏的时间,因为每次我运行客户端时,windows都会请求令牌密码,以便继续操作,这对用户来说是一个过激的行为,是不可接受的 我想知道是否有可能驳回这个请求,并以某种方式将其添加到代码中。或者如果有其他方法使用令牌而不使用windows证书管理器 以下是我扩展连接器的方式: class WebClientE

我试图在C#中实现一个客户端库,以便与tomcat服务器通信。身份验证应通过在windows客户端的相互SSL身份验证中使用具有X.509证书的飞天epass2003令牌来完成

但是,我有一个坏的时间,因为每次我运行客户端时,windows都会请求令牌密码,以便继续操作,这对用户来说是一个过激的行为,是不可接受的

我想知道是否有可能驳回这个请求,并以某种方式将其添加到代码中。或者如果有其他方法使用令牌而不使用windows证书管理器

以下是我扩展连接器的方式:

 class WebClientEx : WebClient
 { 
     public int Timeout { get; set; }

     public X509Certificate certificate { get; set; }

     protected override WebRequest GetWebRequest(Uri address)
     {
         ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
         ServicePointManager.Expect100Continue = true;
         ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
         HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
         request.Credentials = CredentialCache.DefaultCredentials;
         request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
         request.ClientCertificates.Add(this.certificate);
         request.Timeout = this.Timeout;
         return request;
     }
...
}   
以下是我如何连接到服务器的示例:

byte[] certificate = getCertificate("autenticacao"); // Get certificate from token

 X509Certificate cert = new X509Certificate(certificate);

 var post = new NameValueCollection();
 post["test"] = "1";

 using (var wb = new WebClientEx(cert))
 {
     try
     {
         wb.Timeout = 30000;
         var response = wb.UploadValues("https://localhost:8443", "POST", post);
         Console.WriteLine("Done.");
     }
     catch (WebException e)
     {
         // Handle WebException
     }
 }
这是windows请求屏幕:


最重要的是,TLS允许使用会话票证进行会话重用。看,读。服务器支持各不相同。Afaik.NETFramework客户端支持基本上是没有的。看

硬件模块不允许私钥离开模块,每次访问都需要PIN。因此,如果TLS握手需要密钥,那么PIN对话框是不可避免的,您唯一的机会是尝试避免私钥要求,而这仅适用于可重用的TLS会话票据,afaik

您可以重新考虑每次访问的相互TLS要求。访问一个资源(即登录页面),获得一个访问票证(cookie),然后使用它对访问其余资源进行身份验证


PS.SSL是一个没有选项的选项,已经过时多年了,现在每个人都在谈论TLS。

在https连接器中不可能使用pkcs11接口吗?我已经使用pcks11实现了一种初始化令牌的方法,而不需要pin对话框,因为我在代码本身中启动了令牌。