2011-02-14 99 views
3

我在写一个WCF服务,我需要访问用于连接到服务的客户端证书的哈希码。从WCF服务访问客户端证书属性

我正在寻找类似于ASP.NET 2.0 2.0版Request.ClientCertificate的属性或方法,但无法找到允许轻松访问客户端证书的任何内容。

我们的服务设置为使用basicHttpBinding和“Transport”安全模式使用SSL运行。

IIS已设置为要求SSL和接受证书。

需要注意的一件事是我们用于保护端点的服务器证书来自与客户端证书不同的CA--客户端证书旨在仅通过自定义代码进行验证(因此需要获取散列连接证书的代码)。

我已经创建了IDispatchMessageInspector的自定义实现,以查看是否有任何对客户端证书的访问,但无济于事。

有没有人尝试过这个,并取得了成功?

回答

4

看起来像你最好的选择是为你的服务实现一个自定义的证书验证器。这基本上是从X509CertificateValidator派生的类,然后是registered通过配置文件。

关于如何在this article上执行此操作的更完整的信息。

+3

谢谢,这个解决方案完美:) 我们确实采取了这种方法,然后也发现WCF正在填充我们需要的信息ServiceSecurityContext而无需使用自定义证书验证程序,只需在我们的服务实现中使用以下代码: ((X509CertificateClaimSet)ServiceSecurityContext.Current.A uthorizationContext.ClaimSets [0])。X509Certificate – lowds 2011-02-16 08:36:59

2

仅供参考,如果其他人尝试应用都需要执行以下步骤才能正常工作,客户端证书身份验证(我们中WCF使用basicHttpBinding的这个实例,并在IIS的本地实例上运行):

  1. 设置IIS以对站点使用HTTPS绑定并使用服务器证书在IIS中对其进行保护
  2. 在IIS内将您的站点的SSL设置更改为需要SSL和要求客户端证书(它必须是要求 - 接受不起作用)
  3. 在WCF配置中,修改basicHttpBinding d组的安全模式为“运输”和运输clientCredentialType到“证书”

确保根证书(一种用于创建任何客户端证书)是“受信任的根Cerrtification机构”中为本地计算机在哪个IIS上运行。

注意如果您在开发环境中,您可能需要生成自己的根证书,makecert命令行应用程序对此非常有用;只需运行以下命令: makecert -n“CN = My Test Auth”-r -cy authority -a sha1 -sv“My Private Key.pvk”TestAuth.cer

这会创建一个名为TestAuth.cer的证书需要将其添加到计算机的“受信任的根证书颁发机构”)和一个名为“My Private Key.pvk”的私钥文件。

现在要生成客户端证书,您可以运行以下命令: makecert -a sha1 -n“CN = myConnectionCert”-ic“TestAuth.cer”-iv“My Private Key。pvk“-ss我的

这创建了一个带有myConnectionCert主题的证书并将其添加到您的个人证书存储区 - 当您现在访问该网站时(例如查看服务页面),IE应提示您选择证书 - 选择你刚创建的那个,你应该看到服务页面正常。