我正在开发一个WCF服务,基于供应商的实现来接收他们的数据。我已经使用单向SSL使用我们的服务器证书,制作了这个服务的可用版本。由于他们实现的最近变化,现在我需要使用证书而不是用户名和密码来验证他们的客户端。
他们使用Java进行开发,我无法控制客户端或它们生成证书的方式。他们不支持WSHttpBinding,因此我必须使用BasicHttpBinding。他们的证书是自签名的,在生产中将遗憾地保持这种方式。我尝试使用Transport进行安全设置,并且按照我们的服务器管理员的说法,在我们的服务器上适当安装了他们的证书(我无法访问我们的IIS服务器)。我相信IIS在处理证书时出现了问题,因为它是自签名的,所以我放弃了那个实现。
经过大量研究,我确定只有通过从
我是否配置了错误?这个实现是否受支持?
服务Web.Config:
我仍然收到:HTTP请求被禁止,客户端身份验证方案为“匿名”。我在这里找到了一个解释(链接),基本上确认了服务器无法验证客户端证书。 我该如何让我们的服务器管理员在IIS中配置此应用程序并安装证书,以便正确运行?
他们使用Java进行开发,我无法控制客户端或它们生成证书的方式。他们不支持WSHttpBinding,因此我必须使用BasicHttpBinding。他们的证书是自签名的,在生产中将遗憾地保持这种方式。我尝试使用Transport进行安全设置,并且按照我们的服务器管理员的说法,在我们的服务器上适当安装了他们的证书(我无法访问我们的IIS服务器)。我相信IIS在处理证书时出现了问题,因为它是自签名的,所以我放弃了那个实现。
经过大量研究,我确定只有通过从
OperationContext.Current.ServiceSecurityContext.AuthorizationContext.ClaimSets[0]
获取证书并在服务本身中验证它,才可能使它起作用。这是我的第一个WCF服务,我相信我已经正确地设置了它,但是当我从我的WCF测试客户端测试时,却出现了以下错误:The private key is not present in the X.509 certificate
。当供应商从其客户端测试时,他们得到An error occurred when verifying security for the message.
。我是否配置了错误?这个实现是否受支持?
服务Web.Config:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="FileReceiverServiceBehavior">
<useRequestHeadersForMetadataAddress/>
<serviceMetadata httpsGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="FileReceiverServiceBinding">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="Certificate"/>
</security>
<readerQuotas maxStringContentLength="2147483647"/>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="FileReceiverServiceBehavior" name="FileReceiverService.FileReceiverService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="FileReceiverServiceBinding" contract="FileReceiverServiceSoap" bindingNamespace="http://www.openuri.org/" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
</configuration>
我的WCF测试客户端配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="test">
<clientCredentials>
<clientCertificate findValue="Users"
x509FindType="FindBySubjectName"
storeLocation="LocalMachine"
storeName="My"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_FileReceiverServiceSoap" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://mydomain.com/vendor/FileReceiverService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_FileReceiverServiceSoap"
contract="ServiceReference1.FileReceiverServiceSoap" name="BasicHttpBinding_FileReceiverServiceSoap" behaviorConfiguration="test" />
</client>
</system.serviceModel>
</configuration>
更新:
供应商发送给我正确的证书。这是一张由商业CA颁发的有效证书。当我本地查看该证书时,可以看到链到可信根并且状态显示为“OK”。
如果我使用security mode="Transport"
和transport clientCredentialType="Certificate"
,则会得到:HTTP请求被禁止,客户端身份验证方案为“Anonymous”
如果我使用security mode="TransportWithMessageCredential"
和message clientCredentialType="Certificate"
,则会得到:X.509证书中不存在私钥。
我认为我可能需要严格使用Transport以便与Java客户端互操作,因此我正在专注于“HTTP请求被禁止,客户端身份验证方案为'Anonymous'”错误。这是IIS设置的问题还是在服务器端无法正确验证证书?该证书在受信任的人员中,并尝试了无客户端certificateValidationMode
,但也尝试了PeerTrust
,ChainTrust
和 PeerOrChainTrust
。非常感谢您的帮助。
更新2:
我正在专注于对我的原始服务器配置进行以下更改,并将其匹配到我的测试客户端上:
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
我仍然收到:HTTP请求被禁止,客户端身份验证方案为“匿名”。我在这里找到了一个解释(链接),基本上确认了服务器无法验证客户端证书。 我该如何让我们的服务器管理员在IIS中配置此应用程序并安装证书,以便正确运行?