gpt4 book ai didi

ssl - NSUrlSession:仅当还需要客户端证书时,挑战 NSURLAuthenticationMethodServerTrust 才会失败

转载 作者:太空宇宙 更新时间:2023-11-03 13:21:40 26 4
gpt4 key购买 nike

我们想将我们的应用程序连接到我们的 IIS 网络服务。我们使用自签名证书和客户端证书进行身份验证。

当网络服务不需要客户端证书身份验证时,一切正常,NSURLAuthenticationMethodServerTrust 被调用并且请求继续。但是当我在我们的服务器上激活客户端证书身份验证时,在 DidReceiveChallenge 与 NSURLAuthenticationMethodServerTrust 作为挑战之后, DidCompleteWithError 被调用。错误消息是:“此服务器的证书无效。您可能正在连接到伪装成“192.168.221.118”的服务器,这可能会使您的 secret 信息面临风险。

注意:“NSURLAuthenticationMethodClientCertificate”永远不会被调用,应用程序会在此之前崩溃。客户端证书是由中间证书签名的,所以我不明白为什么ServerTrust Challenge会失败。

此外:在我看来这应该不是必需的,但我也尝试将客户端证书添加到 Sectrust 的 AnchorCertificates 集合中。

预先感谢您的帮助。

这是我的代码:

private class SessionDelegate : NSUrlSessionDataDelegate, INSUrlSessionDelegate
{
private Action<bool, string> completed_callback;
private string antwortCache;
private int status_code;

public SessionDelegate(Action<bool, string> completed)
{
completed_callback = completed;
antwortCache = "";
}
public override void DidReceiveChallenge(NSUrlSession session, NSUrlSessionTask task, NSUrlAuthenticationChallenge challenge, Action<NSUrlSessionAuthChallengeDisposition, NSUrlCredential> completionHandler)
{
if (challenge.PreviousFailureCount == 0)
{
if (challenge.ProtectionSpace.AuthenticationMethod.Equals("NSURLAuthenticationMethodServerTrust"))
{
// GetParent is correct, because I'm too lazy to copy the certs into to the correct folders...

var path = Directory.GetParent(GlobaleObjekte.SSLZertifikatePath);
var caPath = Path.Combine(path.FullName, "ca.cert.der");
var caByteArray = File.ReadAllBytes(caPath);
var caCert = new X509Certificate2(caByteArray);

var interPath = Path.Combine(path.FullName, "intermediate.cert.der");
var interByteArray = File.ReadAllBytes(interPath);
var interCert = new X509Certificate2(interByteArray);

var secTrust = challenge.ProtectionSpace.ServerSecTrust;

var certCollection = new X509CertificateCollection();
certCollection.Add(caCert);
certCollection.Add(interCert);

secTrust.SetAnchorCertificates(certCollection);
var credential = new NSUrlCredential(secTrust);
completionHandler(NSUrlSessionAuthChallengeDisposition.UseCredential, credential);

return;
}

if (challenge.ProtectionSpace.AuthenticationMethod.Equals("NSURLAuthenticationMethodClientCertificate"))
{
var path = Directory.GetParent(GlobaleObjekte.SSLZertifikatePath);
var certPath = Path.Combine(path.FullName, "client.pfx");
var certByteArray = File.ReadAllBytes(certPath);
var cert = new X509Certificate2(certByteArray, Settings.WSClientCertPasswort);

var ident = SecIdentity.Import(certByteArray, Settings.WSClientCertPasswort);
var credential = new NSUrlCredential(ident, new SecCertificate[] { new SecCertificate(cert) }, NSUrlCredentialPersistence.ForSession);
completionHandler(NSUrlSessionAuthChallengeDisposition.UseCredential, credential);
return;
}

if (challenge.ProtectionSpace.AuthenticationMethod.Equals("NSURLAuthenticationMethodHTTPBasic"))
{
var credential = new NSUrlCredential(Settings.WebserviceBenutzer, Settings.WebservicePasswort, NSUrlCredentialPersistence.ForSession);
completionHandler(NSUrlSessionAuthChallengeDisposition.UseCredential, credential);
return;
}

completed_callback(false, "Unbekannte Authentifizierungsanfrage: " + challenge?.ProtectionSpace?.AuthenticationMethod);
}
else
{
completed_callback(false, "Authentifizierung fehlgeschlagen: " + challenge?.ProtectionSpace?.AuthenticationMethod);
}
}
}

最佳答案

我终于找到了解决办法。我必须以不同的方式创建凭证对象。我没有将证书添加到 SecTrust 并使用 SecTrust 作为参数创建凭据,而是必须从客户端证书创建身份,然后使用该身份和其他证书作为参数创建凭据:

 if (challenge.ProtectionSpace.AuthenticationMethod.Equals("NSURLAuthenticationMethodServerTrust"))
{
var path = Directory.GetParent(GlobaleObjekte.SSLZertifikatePath);
var caPath = Path.Combine(path.FullName, "ca.cert.der");
var caByteArray = File.ReadAllBytes(caPath);
var caCert = new SecCertificate(caByteArray);

var interPath = Path.Combine(path.FullName, "intermediate.cert.der");
var interByteArray = File.ReadAllBytes(interPath);
var interCert = new SecCertificate(interByteArray);

var clientPath = Path.Combine(path.FullName, "client.pfx");
var clientByteArray = File.ReadAllBytes(clientPath);
var clientCert = new X509Certificate2(clientByteArray, Settings.WSClientCertPasswort);

//var secTrust = challenge.ProtectionSpace.ServerSecTrust;
//var certCollection = new X509CertificateCollection();
//certCollection.Add(caCert);
//certCollection.Add(interCert);
//certCollection.Add(cert);

//secTrust.SetAnchorCertificates(certCollection);
//var credential = new NSUrlCredential(secTrust);
var identity = SecIdentity.Import(clientCert);
var credential = new NSUrlCredential(identity, new SecCertificate[] { caCert, interCert }, NSUrlCredentialPersistence.ForSession);

completionHandler(NSUrlSessionAuthChallengeDisposition.UseCredential, credential);

return;
}

关于ssl - NSUrlSession:仅当还需要客户端证书时,挑战 NSURLAuthenticationMethodServerTrust 才会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49942148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com