gpt4 book ai didi

.net - X509 证书和 SSL

转载 作者:行者123 更新时间:2023-12-04 07:01:18 24 4
gpt4 key购买 nike

尝试使用从 WSDL 创建的 Visual Studio 2008 .NET 3.5“服务引用”对象执行基本的 SSL 身份验证 Web 服务。我们尝试了三种方法 1) 设置客户端证书(以匹配服务器提供的),2)为服务器提供的设置存储,以及 3)使用自定义服务器验证器。

.NET 异常(下文详述)是一致的(对于下面描述的三种方法)“无法为具有权限 'ABC.DEF.com' 的 SSL/TLS 安全 channel 建立信任关系。”

Ethereal 捕获是一致的(对于下面描述的三种方法),并显示了 SSL 的 SERVER-SUPPLIED 证书版本的正确客户端和服务握手。也就是说,我们看到了这里描述的所有基本消息( http://en.wikipedia.org/wiki/Transport_Layer_Security#Simple_TLS_handshake ):

客户端 --> 服务器:客户端你好
服务器 --> 客户端:服务器问候、证书、服务器问候完成
客户端 --> 服务器:客户端 key 交换、更改密码规范、加密握手消息
服务器 --> 客户端:更改密码规范,加密握手消息。

收到最后(我们假设是 SSL MAC 消息)后,客户端立即关闭(TCP FIN/ACK)连接

1) 尝试使用服务器提供的内容设置客户端凭据(期望 X509 库将使用它来验证服务器在 SSL 协商期间提供的内容,但理解这很可能仅用于在客户端提供的证书协商期间从客户端提供给服务器)

 X509Certificate2 _cert = new X509Certificate2("\\SomePath\...\ServerSuppliedCert.cer");

getPrequalInfo_v1 _getInfo = new getPrequalInfo_v1(); // WEB SERVICE-SPECIFIC
_getInfo.arg0 = GetRequestArgs(); // WEB SERVICE-SPECIFIC
PreQualBeanClient _preq = new PreQualBeanClient(); // WEB SERVICE-SPECIFIC


_preq.ClientCredentials.ClientCertificate.Certificate = _cert;

getPrequalInfo_v1Response _resp = new getPrequalInfo_v1Response(); // WEB SERVICE-SPECIFIC
_resp = _preq.getPrequalInfo_v1(_getInfo); // << EXCEPTION RAISED HERE, // WEB SERVICE-SPECIFIC

2) 尝试为表面上使用验证服务证书创建存储(同样,可能完全是错误的方法)
X509Certificate2Collection _collection = new X509Certificate2Collection();
_store = new X509Store(StoreLocation.CurrentUser);
_store.Open(OpenFlags.ReadOnly);
X509Certificate2 _cert = new X509Certificate2("\\SomePath\...\ServerSuppliedCert.cer");
_collection.Add(_cert);
_store.AddRange(_collection);
_store.Close();

getPrequalInfo_v1 _getInfo = new getPrequalInfo_v1(); // WEB SERVICE-SPECIFIC
_getInfo.arg0 = GetRequestArgs(); // WEB SERVICE-SPECIFIC
PreQualBeanClient _preq = new PreQualBeanClient(); // WEB SERVICE-SPECIFIC

_preq.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode
= System.ServiceModel.Security.X509CertificateValidationMode.PeerOrChainTrust;
_preq.ClientCredentials.ServiceCertificate.Authentication.TrustedStoreLocation = _store.Location;

getPrequalInfo_v1Response _resp = new getPrequalInfo_v1Response(); // WEB SERVICE-SPECIFIC
_resp = _preq.getPrequalInfo_v1(_getInfo); // << EXCEPTION RAISED HERE, // WEB SERVICE-SPECIFIC

3) 这里我们尝试创建一个客户服务凭证验证器。请注意,在这种情况下,MyX509CertificateValidator.Validate 方法似乎根本没有被调用。
            getPrequalInfo_v1 _getInfo = new getPrequalInfo_v1();  // WEB SERVICE-SPECIFIC
_getInfo.arg0 = GetRequestArgs(); // WEB SERVICE-SPECIFIC
PreQualBeanClient _preq = new PreQualBeanClient(); // WEB SERVICE-SPECIFIC

_preq.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode
= System.ServiceModel.Security.X509CertificateValidationMode.Custom;
_preq.ClientCredentials.ServiceCertificate.Authentication.CustomCertificateValidator
= new MyX509CertificateValidator("Name");


getPrequalInfo_v1Response _resp = new getPrequalInfo_v1Response(); // WEB SERVICE-SPECIFIC
_resp = _preq.getPrequalInfo_v1(_getInfo); // << EXCEPTION RAISED HERE, // WEB SERVICE-SPECIFIC

我们有以下 WSDL 的相关部分
<soap:address location='https://ABC.DEF.com/.../PreQualBean'/>

.NET 异常,这对于所描述的三种方法是通用的:

System.ServiceModel.Security.SecurityNegotiationException 未处理
Message="无法与权限为 'ABC.DEF.com' 的 SSL/TLS 安全 channel 建立信任关系。"
来源=“mscorlib”
堆栈跟踪:
服务器堆栈跟踪:
在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
在 System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
...

带内部异常
内部异常:System.Security.Authentication.AuthenticationException
Message="根据验证程序,远程证书无效。"
来源=“系统”
堆栈跟踪:
在 System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken 消息,AsyncProtocolRequest asyncRequest,异常异常)
在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.StartSendBlob(Byte[] 传入,Int32 计数,AsyncProtocolRequest asyncRequest)
在 System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
...

最佳答案

看起来客户端不信任签署服务器证书(或链中的某些证书​​,如果使用中间 CA 签名)的 CA。您可以尝试将服务器证书的签名者添加到客户端的信任存储中。

您还可以通过执行以下操作来获取有关该问题的更多详细信息并忽略它:

      ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertificate;
...
public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// Here you can display the sslPolicyErrors and/or go through the chain to see which certificate(s) is(are) causing the problem.
return true; // returning true here will probably "fix" your client side problem
}

关于.net - X509 证书和 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1794071/

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