我一直在尝试在 IIS6 上使用 SSL 设置 WCF 传输安全性。
客户端位于同一域的不同机器上。
我了解证书、根 CA 等的前提,并拥有一组用于消息安全的工作证书,并且可以在相同的环境设置中使用这些无问题。(上周我学到的东西不多:)
当我将其切换到 SSL 时,我正做着一场噩梦,试图让我的客户端对 IIS 6 服务进行身份验证。打电话时总是收到“不允许匿名身份验证”。
在 IIS 我有
- 在站点上为 SSL 端口 443 设置的根签名 CA 证书(如果我浏览 https://svc 页面,我可以看到 IE 挂锁并且页面显示您需要证书才能进行通信)
在安全通信下我有
- 需要 SSL 通道
- 需要 128 位加密
- 需要客户证书
- 启用客户端证书映射(设置与 IIS 框上的管理员帐户的多对一映射,现在在证书主题 O 字段上匹配)
在网站安全(认证和访问控制)下
- 匿名访问 = 开
- 集成 Windows 身份验证 = 关闭
- 基本身份验证 = 开
对于客户端 wsHttpBinding,我有一个准备好进行身份验证的证书和一个自定义端点行为来提供此信息,但我认为它还没有走这么远!
更新的服务器配置
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="CertificateWithTransport">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="WCFServiceCertificate.Service1" behaviorConfiguration="credentialConfig">
<endpoint address="https://svnvmig02/Service1.svc"
binding="wsHttpBinding"
bindingConfiguration="CertificateWithTransport"
contract="WCFServiceCertificate.IService1">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="credentialConfig">
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
更新的客户端配置
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService1">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://svnvmig02/Service1.svc" binding="wsHttpBinding" behaviorConfiguration="CustomBehavior"
bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
name="WSHttpBinding_IService1">
</endpoint>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="CustomBehavior">
<clientCredentials>
<clientCertificate findValue="svnvmig02" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/>
<serviceCertificate>
<authentication certificateValidationMode="PeerTrust"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
编辑: 可能值得一提的是我的 VS 项目是 3.5 但 IIS6 正在运行 .net4
通过修改后的配置(感谢 Fabio ;),我现在可以通过 IE 从客户端计算机浏览地址https://svnvmig01/Service1.svc并查看生成的 svc 页面,该页面允许我单击也可用的 wsdl URl。
我在网上找到的大多数页面都涉及自托管或 IIS7 ......我希望 IIS7 支持更好;)
任何帮助将不胜感激 :)