我想检查WCF服务中的客户端证书。
我的目标是只允许具有特定指纹证书的客户能够与我的服务进行通信。
我的WCF服务托管在IIS中,我使用basicHttpBinding和安全模式=“transport”,凭据类型为“Certificate”。 IIS需要客户端证书才能与服务进行通信。
提前感谢您的帮助。
更新: 我的配置:
<basicHttpBinding>
<binding
name="testBinding"
maxReceivedMessageSize="2147483647">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
行为:
<serviceBehaviors>
<behavior name="SomeServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="SomeService.CustomCertificateValidator,SomeService" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
服务配置:
<service
behaviorConfiguration="SomeServiceBehavior"
name="SomeService">
<endpoint
address=""
binding="basicHttpBinding"
bindingConfiguration="testBinding"
contract="ISomeService">
</endpoint>
</service>
为了测试目的,我以这种方式实现了验证器:
public class CustomCertificateValidator : X509CertificateValidator
{
public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
{
throw new SecurityTokenValidationException("TEST Certificate was not issued by a trusted issuer TEST");
}
}
这不起作用。我可以使用任何有效的证书连接到我的服务。
答案 0 :(得分:14)
您可以创建一个派生自X509CertificateValidator的类,并使用它来对传入证书进行自定义验证。如果由于某种原因想要验证失败,则抛出SecurityTokenValidationException。
将certificateValidationMode设置为Custom,并在配置文件的clientCertificate服务行为部分指定验证器。
How to: Create a Service that Employs a Custom Certificate Validator
答案 1 :(得分:7)
我认为无论如何都没有“自定义证书验证”和“运输安全”。它只适用于'Message Security'。
答案 2 :(得分:1)
是的,您可以使用basicHttpBinding并将安全性设置为Transport,并且需要挂钩到IIS中的ServiceHost创建 - 请参阅Custom Service Host。 如果您创建自定义配置部分以定义验证标准列表,则应该能够验证指纹值,证书或任何其他数据。
this CodeProject artticle的代码下载中提供了实现上述所有内容的示例代码。