.net - 如何在 WCF 服务中将密码与我的证书 (X.509) 一起发送?

标签 .net wcf x509certificate

我有一个 WCF 服务,它使用 X.509 证书作为客户端凭据。大多数这些凭据不需要密码即可使用,只需安装即可。

但是现在,我们的客户有一个证书,每次使用时都需要输入密码(即每次服务运行时)。此服务每天调用其他服务 n 次,但如果无法验证证书,则会失败。

到目前为止,每次遇到此问题时,我们都会要求客户订购(并支付)新证书,但我和我们的客户都厌倦了每次都经历这些。我自己没有做过服务,对WCF和服务也没有太多的经验。

我想知道的是:是否可以将此密码与有关证书的所有其他信息一起输入到我们的配置文件中?

这是服务的 XML 配置的一部分:

<configuration>
  <system.serviceModel>
    <client>
      <endpoint
        address="***"
        binding="basicHttpBinding"
        bindingConfiguration="***"
        behaviorConfiguration="HTTPSEndpoint"
        contract="***"
        name="***" />
    </client>
    <bindings>
      <basicHttpBinding>
        <binding
          name="***"
          sendTimeout="00:05:00"
          maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647" >
          <readerQuotas maxStringContentLength="2147483647" />
          <security mode="Transport">
            <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name ="HTTPSEndpoint">
          <clientCredentials>
            <clientCertificate
              findValue="***"
              storeLocation="LocalMachine"
              storeName="My"
              x509FindType="FindBySubjectName"/>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

最佳答案

从客户端计算机上的证书存储中检索证书时需要输入密码是因为该证书是在选中“启用强私钥保护”选项的情况下导入的:

Importing a certificate to the certificate store.

这通常被设置为标准服务器强化过程的一部分。它适用于在用户出席时证书通过远程系统对用户进行身份验证的情况。

由于密码提示是由于证书导入过程引起的,而不是证书的固有属性,因此购买新证书不会改变任何内容。

我不知道在检索密码时无法以编程方式将密码传递给证书存储区。但是,如果您考虑一下,即使您成功了,您也必须以某种方式保护所述密码。您可以加密 .config 文件的密码,但现在您必须存储加密 key 。依此类推......某处会有一个松散的结局,使“强大的私钥保护”变得毫无意义。

基本上,您的客户不能同时拥有它:他们不能“启用强大的私钥保护”,并且希望每次需要客户端证书时都不必输入密码。他们正确存储证书要好得多。

对于无人值守的客户端服务,最安全的客户端证书存储方法如下:

  • 在具有加密强密码的特定帐户下运行您的客户端服务。
  • 从 LocalMachine 存储中删除证书。安装在 LocalMachine 存储中的证书可供机器上运行的任何帐户访问。
  • 在客户端服务帐户的 CurrentUser 存储中安装证书。这意味着该证书只能由客户端服务帐户访问。安装证书时,请务必取消选中“启用强私钥保护”选项。
  • 关于.net - 如何在 WCF 服务中将密码与我的证书 (X.509) 一起发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4104747/

    相关文章:

    go - 如何使用 Go 在证书中添加 SAN 扩展

    java - Apache HttpClient 4.3 和 x509 客户端证书进行身份验证

    ssl - SSL 证书链包如何工作?

    c# - WCF - 每次调用对象缓存

    wcf - WCF 回调如何通过 HTTP 工作?

    wcf - 如何使 WCF 命名管道地址等于 WinApi 管道地址?

    C# XmlSerializer,编辑XML文件而不重写整个文件

    .net - 检测到 AccessViolationException 时如何强制应用程序崩溃

    c# - Visual Studio 2008/2010 错误/问题列表

    c# - WPF UI 允许用户构建复杂查询并输出表达式树