我们有以下要求:
ESB集成要求:
客户使用ESB服务(IBM)为集成应用程序和服务提供连接。 我们有一个服务(WCF),将由另一个供应商通过ESB集成调用 将WCF服务与ESB集成的安全要求是,WS-Security用于签名但是对于加密我们应该使用HTTPS 根据他们与我们共享的策略文件,我们应该使用非对称绑定,只有令牌发送到接收者而不是发起者 消息版本是SOAP11 他们给我们一个证书(X509),我们在WCF服务配置文件中将其配置为客户端证书,我们将自己的证书用于我们的WCF服务 WCF实现与其预期的WS-Policy匹配:
我们开发了一个WCF服务(.Net 3.5,有选择.net 3.5的技术要求) WCF服务配置为使用身份验证模式MutualCertificateDuplex,对于消息安全版本,它使用“WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10” 它还配置为使用CustomBinding来匹配ESB的要求 下面给出了我们用于WCF服务的配置:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="My.Services.ResourceManagementServiceBehavior">
<serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="true"
serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure" />
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<certificate findValue="CN=SOAPUIClientCert" storeLocation="LocalMachine"
storeName="My" x509FindType="FindBySubjectDistinguishedName" />
</clientCertificate>
<serviceCertificate findValue="CN=MyWCFServiceCert" storeLocation="LocalMachine"
storeName="My" x509FindType="FindBySubjectDistinguishedName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="MyServicesCustomBinding">
<transactionFlow/>
<textMessageEncoding messageVersion="Soap11" />
<security defaultAlgorithmSuite="Basic128Rsa15" allowSerializedSigningTokenOnReply="true"
authenticationMode="MutualCertificateDuplex"
requireDerivedKeys="false" securityHeaderLayout="Strict" includeTimestamp="true"
messageSecurityVersion="WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10"
requireSignatureConfirmation="false">
<issuedTokenParameters keyType="AsymmetricKey">
<issuer address="" binding="customBinding" bindingConfiguration="MyServicesCustomBinding" />
<issuerMetadata address="">
<identity>
<certificateReference findValue="CN=MyWCFServiceCert" isChainIncluded="false" />
</identity>
</issuerMetadata>
</issuedTokenParameters>
</security>
<httpsTransport requireClientCertificate="false"/>
</binding>
</customBinding>
</bindings>
<services>
<service behaviorConfiguration="My.Services.ResourceManagementServiceBehavior"
name="My.Services.ResourceManagementService">
<endpoint address="" binding="customBinding" bindingConfiguration="MyServicesCustomBinding"
name="MyBinding" contract="My.Services.IResourceManagementService">
<!--<identity>
<dns value="localhost" />
</identity>-->
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="ResourceManagementService.svc" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
使用上述WCF服务配置进行测试时出现的问题:
“安全政策导出失败。绑定包含AsymmetricSecurityBindingElement和安全传输绑定元素。不支持此类绑定的策略导出。 ----&GT; System.InvalidOperationException:安全策略导出失败。绑定包含AsymmetricSecurityBindingElement和安全传输绑定元素。不支持此类绑定的策略导出。 在System.ServiceModel.Channels.SecurityBindingElement.ExportPolicy(MetadataExporter exporter,PolicyConversionContext context)
我查看了很多博客和帖子,但没有一个真的有用。如果我使用像“CertificateOverTransport”这样的身份验证模式,它看起来工作正常(至少不会抛出上述错误),但它生成的策略(在.svc?wsdl中)与ESP所需的策略不匹配。问题似乎是使用HTTPS与身份验证模式“MutualCertificateDuplex”。
我在一些博客中,有些人说如果我们使用公钥基础设施(PKI),我们不需要使用HTTP,但是为了满足客户的要求(与他们的政策相匹配),我有什么方法可以配置我的WCF服务?
答案 0 :(得分:0)
尝试注释掉ServiceMetadataBehavior部分,它可能会在生成WSDL策略时导致问题。客户端需要将自己配置为相同的设置,但这应该没问题。