我正在尝试在C#中实现一个客户端库,以便与tomcat服务器通信。验证应该通过在Windows客户端中使用具有X.509证书的Feitian epass2003令牌进行相互SSL身份验证来完成。
然而,我每次运行客户端窗口时都会遇到错误的时间请求令牌密码,以便继续执行对用户来说过度杀伤的操作,这是不可接受的。
我想知道是否可以解除此请求并在代码中以某种方式添加它。或者,如果有其他方法可以在不使用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请求屏幕:
致以最诚挚的问候,
答案 0 :(得分:0)
TLS允许使用会话票证重用会话。请参阅RFC5077 Transport Layer Security (TLS) Session Resumption without Server-Side State,阅读Speeding up SSL: enabling session reuse。服务器支持各不相Afaik .Net Framework客户端支持基本上没有。请参阅TLS/SSL and .NET Framework 4.0。
硬件模块不允许私钥离开模块,每次访问都需要PIN。因此,如果TLS握手需要密钥,则PIN对话框是不可避免的,您唯一的机会是尝试避免私钥要求,这只能用于可重复使用的TLS会话票据,afaik。
您可以重新考虑每次访问的相互TLS要求。访问一个资源(即登录页面),获取访问权限(cookie),然后使用它来验证访问其余资源。
PS。 SSL是一种无选择,多年来已经过时,每个人都在谈论TLS。