gpt4 book ai didi

wcf - WCF异常-未提供客户端证书

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

WCF异常-未提供客户端证书。在ClientCredentials中指定客户端证书。

阅读完我在该主题上能找到的大部分内容,并尝试了许多不同的选择之后,我发现我没有更多的头发可以拉了,因此这篇文章。

我希望将SSL与自托管WCF服务一起使用,并将安全模式设置为具有HTTP传输的TransportWithMessageCredential。我正在使用2台开发机并通过LAN进行测试。

如上所述,我已经阅读并认真遵循了几乎所有能证明这一点的示例,但是在某种程度上仍然存在证书问题。

就证书而言,我尝试了很多事情。

我所做的主要努力是遵循
http://msdn.microsoft.com/en-us/library/ff647171.aspx

我还使用了“如何:在Windows窗体的WCF调用中使用证书身份验证和消息安全性”中的“
http://msdn.microsoft.com/en-us/library/ff648360.aspx
作为基本指南。

我首先通过对HTTP使用basicHttpBinding来测试服务和客户端,以进行验证。

然后,我对wsHttpBinding,SSL和证书进行了更改。

当我在客户端开发PC上“添加服务参考”时,收到如下错误:


标题为-的窗口


安全警报

Visual Studio检测到站点的安全证书有问题。

颁发者:RootCATest
颁发给:TempCert
证书从以下日期起有效

公司颁发的安全证书不在不信任列表中。这可能是值得信赖的。

安全证书日期有效。

主机“ TempCert”的安全证书与您尝试查看的页面的名称不匹配。


您要继续吗? --


如果单击“是”继续,然后运行客户端代码,则会发生InvalidOperationException并显示以下消息。

“未提供客户证书。在ClientCredentials中指定客户端证书。”

服务配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<serviceCertificate findValue="CN=TempCert"
storeLocation="LocalMachine"
storeName="My" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="wsHttpEndpointBinding">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="SBSWCFServiceHost.Operations"
behaviorConfiguration="ServiceBehavior">
<endpoint name="wsHttpEndpoint"
address=""
binding="wsHttpBinding"
bindingConfiguration="wsHttpEndpointBinding"
contract="SBSWCFServiceHost.IOperations" >
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint name="mexHttpEndpoint"
address="mex"
binding="mexHttpsBinding"
contract="IMetadataExchange" >
</endpoint>
<host>
<baseAddresses>
<add baseAddress="https://10.0.0.103:8003/SBSWCFServiceHost/Operations/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>


客户端配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="EndpointBehavior">
<clientCredentials>
<clientCertificate storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint"
findValue="e4c87a961f796be6b6cab59c3760e43ffb6e941d"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="wsHttpEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Certificate" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://10.0.0.103:8003/SBSWCFServiceHost/Operations/"
binding="wsHttpBinding" bindingConfiguration="wsHttpEndpoint"
contract="SBSWCFService.IOperations" name="wsHttpEndpoint">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>


以下是我根据大量帖子和文档的内容执行的任务的摘要。


在服务器上创建一个自签名的CA证书(名为RootCATest),并将其放置在本地计算机的“受信任的根证书颁发机构证书”文件夹中。
在服务器上创建了一个由RootCATest证书(名为TempCert)签名的证书,并将其放在“本地计算机”的“个人证书”文件夹中。
导出了TempCert证书和私钥。
将TempCert .cer和.pvk文件复制到客户端计算机,并将TempCert证书导入到本地计算机的“个人证书”文件夹中。
在服务器计算机上使用TempCert证书的私钥路径执行ICalcs.exe [私钥路径] / grant“ NT AUTHORITY \ NETWORK SERVICE”:R。
执行的netsh http在服务器计算机上添加sslcert ipport = o.o.o.o:8003 certhash = [TempCert指纹] appid = [{application id}]


我相信我已经接近完成这项工作。

显然,该应用程序对TempCert证书不满意,但我仍无法解决此问题,并且陷入了困境。

对于在给定配置中出现的任何问题,我为将正确的证书放置到位而执行的步骤以及用于添加访问权限和sslcert条目的步骤所提供的任何帮助,将不胜感激。

非常感谢。

经过进一步的实验后,我注意到了其他行为。

采取的步骤如下:

我删除了客户端证书和服务器证书,并根据重新创建了证书。
.... codeproject.com/Articles/36683/9-simple-steps-to-enable-x-509-certificates-on-wcf

我使用netsh添加了新的sslcert。然后,我从服务器导出客户端证书,然后
将其导入客户端存储。

我使用新的证书信息修改了服务app.config,并启动了服务。

我修改了客户端app.config,如下所示:

<endpointBehaviors>
<behavior name="EndpointBehavior">
<clientCredentials>
<clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" findValue="WCFClient" />
<serviceCertificate>
<authentication certificateValidationMode="PeerTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>


我更新了服务参考。更新过程再次像以前一样发布了安全警报。

然后,我执行了客户端,并收到此错误:

“未提供客户端证书。在ClientCredentials中指定客户端证书。”

然后,在“ client = new WCFService.Client();”上设置一个断点。并检查了“客户端”实例。
client.ClientCredentials.ClientCertificate.Certificate = null的值。

然后,在“ client = new WCFService.Client();”之后的代码中添加以下内容:

X509Store store = new X509Store("My", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection = (X509Certificate2Collection) store.Certificates;
foreach (X509Certificate2 x509 in collection)
{
if (x509.Thumbprint == "236D7D4AD95753B8F22D3781D61AACB45518E1B5")
{
client.ClientCredentials.ClientCertificate.SetCertificate(
x509.SubjectName.Name, store.Location, StoreName.My);
}
}


执行此代码后,client.ClientCredentials.ClientCertificate.Certificate包含证书。

然后执行“ client.Open();”时,将引发以下内容的异常。

基础连接已关闭:无法为SSL / TLS安全通道建立信任关系。
根据验证过程,远程证书无效。
无法使用授权建立SSL / TLS安全通道的信任关系

如果任何人知道这里可能发生的事情,对此可以有所启发,我将非常感激。

最佳答案

最后一条错误消息表明您的服务器正在向客户端请求客户端证书(服务器必须询问),并且客户端正在提供证书,但是服务器无法根据可用信息确定客户端证书是否有效在服务器计算机上。

由于您使用的是自签名证书(不是CA颁发的证书),因此需要告诉服务器如何验证客户端证书。您可能需要在服务器的My / LocalMachine / Trusted People证书存储区中安装客户端证书,以便WCF的默认证书验证可以找到它们,或者在服务器上实现自己的自定义客户端证书验证器。 (请参见WebHttpBinding.Credentials.ClientCertificate.Authentication.CertificateValidationModeWebHttpBinding.Credentials.ClientCertificate.Authentication.CustomCertificateValidator

关于wcf - WCF异常-未提供客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276329/

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