如何使用 WCF 签署 X509 令牌

Posted

技术标签:

【中文标题】如何使用 WCF 签署 X509 令牌【英文标题】:How to sign X509 token using WCF 【发布时间】:2012-09-28 18:30:40 【问题描述】:

我正在开发一个必须与 Oracle WebLogic 服务通信的 WCF 客户端。该服务强制执行相互证书身份验证。

但是,我们无法满足该政策,并且服务器会记录错误声明:

“WSM-00081:X.509 证书未签名。”

我一直想知道这到底是什么意思。 Oracle 文档指出:

WSM-00081:X.509 证书未签名。

原因:使用的X509令牌没有按照证书认证场景的要求进行签名。

操作:签署 X509 令牌(取决于所使用的引用机制)以进行证书身份验证。

等级:1

类型:错误

影响:安全

(http://docs.oracle.com/cd/E25054_01/core.1111/e10113/chapter_wsm_messages.htm)

经过一番研究,我们发现可以通过设置is-signed="false来禁用服务策略配置文件中的检查:

<orasp:x509-token orasp:enc-key-ref-mech="direct" orasp:is-encrypted="false"
              orasp:is-signed="false"
              orasp:rcpt-enc-key-ref-mech="direct"
              orasp:rcpt-sign-key-ref-mech="direct"
              orasp:sign-key-ref-mech="direct"/>

我的两个理论:

证书需要由 CA 签名 我们使用由 CA 签署的证书进行了检查,但这没有任何区别 但是,我们在配置它时可能会犯一些错误。我们应该试一试吗? 我们需要对包含在请求中的 BinarySecurityToken 进行签名。 但是,我不知道该怎么做

我是否完全误解了这个主题,或者你们中的任何人都可以指出问题可能是什么以及如何解决它?

【问题讨论】:

您使用的自签名证书是否是来自受信任提供商的证书? 是双向认证吗?您是否还检查过提供者是否在 oracle weblogic 服务中作为受信任的权威存在?确保如果它是 2 路身份验证,则两个证书均由受信任的机构签名 【参考方案1】:

您需要在请求中签署安全令牌。

在配置的绑定元素中,将安全元素模式设置为SecurityMode.Message,将消息元素clientCredentialType 设置为MessageCredentialType.Certificate:

<security mode="Message">
    <message clientCredentialType="Certificate"
        algorithmSuite="Default"
        establishSecurityContext="true" />
</security>

接下来,创建一个端点行为来解析您的client certificate 的位置:

<behavior name="endpointCredentialBehavior">
    <clientCredentials>
        <clientCertificate findValue="Contoso.com" 
            storeLocation="LocalMachine"
            storeName="TrustedPeople"
            x509FindType="FindBySubjectName" />
    </clientCredentials>
</behavior>

【讨论】:

以上是关于如何使用 WCF 签署 X509 令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 X509 证书签署 BizTalk WCF 响应

如何使用 makecert 创建 WCF 接受的 X509 证书

如何配置 WCF 以通过 Internet 使用 x509 证书?

如何在 Azure 应用服务中将 X509Certificate2 与 WCF 一起使用

通过签署 CSR 创建 x509 v3 用户证书

如何在 AspNetCore 中仅使用公钥验证使用 x509 签名的 JWT 令牌