从WCF服务访问客户端证书属性

4
我正在编写一个WCF服务,其中需要访问用于连接到服务的客户端证书的哈希码。我正在寻找类似于ASP.NET 2.0中Request.ClientCertificate的属性或方法,但找不到任何可以轻松访问客户端证书的内容。我们的服务使用basicHttpBinding和安全模式“Transport”运行,并已设置为在SSL下运行。IIS已设置为要求SSL并接受证书。需要注意的一点是,用于保护终结点的服务器证书来自与客户端证书不同的CA - 客户端证书仅通过自定义代码进行验证(因此需要获取连接证书的哈希码)。我已创建了IDispatchMessageInspector的自定义实现,以查看是否有从那里访问客户端证书的方法,但尚未成功。有人尝试过这样做并取得了成功吗?
2个回答

4

看起来最适合您的选择是为您的服务实现自定义证书验证程序。这基本上是一个从X509CertificateValidator派生的类,然后通过配置文件注册

如何完成此操作的更完整信息,请参见本文


3
谢谢,这个解决方案完美运作 :)我们采用了这种方法,然后还发现WCF在不需要使用自定义证书验证器的情况下,在ServiceSecurityContext中填充了我们所需的信息,只需在服务实现中加入以下代码即可:((X509CertificateClaimSet) ServiceSecurityContext.Current.AuthorizationContext.ClaimSets[0]).X509Certificate - lowds
1
加载,您应该将其作为答案而不是注释。请参见https://dev59.com/2Wsz5IYBdhLWcg3w-89v?lq=1 - Michael Freidgeim

3

如果其他人尝试应用客户端证书认证,以下步骤是必要的才能让其正常工作(在本例中,我们使用WCF中的basicHttpBinding,并在本地IIS实例中运行):

  1. 为站点设置HTTPS绑定并使用服务器证书来保障IIS的安全性。
  2. 在IIS中更改您的站点的SSL设置以要求使用SSL和客户端证书(必须要求-仅接受将不起作用)。
  3. 在WCF配置中更改basicHttpBinding并将安全模式设置为“传输”,将传输客户端凭据类型设置为“证书”。

确保根证书(用于创建任何客户端证书的证书)在运行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 My

这将创建一个名称为myConnectionCert的证书,并将其添加到您的个人证书存储中。当您现在访问站点时(例如查看服务页面),IE应提示您选择该证书-选择刚刚创建的证书,然后应该正常显示服务页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接