首页 > 解决方案 > WCF 如何更改 X.509 证书私钥的加密提供程序

问题描述

我正在尝试按照微软的这个操作指南来扩展 WCF。其基本思想是使用硬件安全模块作为客户端私钥持有者,这意味着所有涉及客户端私钥的密码操作都必须由安全模块芯片进行。

设置

dotnet framework: 4.7.2
binding: netTcp
binding security: Message
clientCredentialType: Certificate (X509Certificate2) 
serverCertificate: X509Certificate2 

所有证书(1 个服务器证书和 2 个客户端证书)均由同一个 CA 签署。服务器证书是一个pfx包含证书和私钥的普通文件。我准备了两个不同的客户端证书,一个带有私钥,一个没有私钥。(两个客户端pfx文件具有相同的证书)

观察

  1. 当使用包含私钥的客户端pfx文件时,客户端能够以 mtls 方式与服务器通信。
  2. 使用pfx没有私钥的客户端文件时,尝试设置安全会话失败,并出现以下异常
System.ArgumentException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
The certificate '<cert name>' must have a private key. The process must have access rights for the private key.

堆栈跟踪

System.ServiceModel.Security.TlsSspiNegotiation.ValidatePrivateKey(X509Certificate2 certificate)
System.ServiceModel.Security.TlsSspiNegotiation..ctor(String destination, Boolean isServer, SchProtocols protocolFlags, X509Certificate2 serverCertificate, X509Certificate2 clientCertificate, Boolean clientCertRequired)
System.ServiceModel.Security.TlsnegoTokenProvider.CreateTlsSspiState(X509SecurityToken token)
System.ServiceModel.Security.TlsnegoTokenProvider.CreateNegotiationState(EndpointAddress target, Uri via, TimeSpan timeout)
System.ServiceModel.Security.IssuanceTokenProviderBase`1.DoNegotiation(TimeSpan timeout)
  1. 这两种情况下,框架都没有使用根据CustomX509AsymmetricSecurityKey上述方法提供的内容。甚至没有实例化类。是通过. 但是该类的属性从未被调用,这就是自定义私钥发挥作用的地方。WCFCustomX509SecurityTokenCustomX509SecurityTokenProviderSecurityKeysCustomX509SecurityToken

问题

  1. 操作指南是否已过时?请注意它已过时03/30/2017
  2. 使用pfx无私钥时的例外情况是不言自明的。我没有提供私钥。为什么 WCF 不使用提供CustomX509AsymmetricSecurityKey的作为私钥?这不是用户以 a 形式提供替代私钥的全部意义X509AsymmetricSecurityKey吗?
  3. 我是否遵循错误的指南来实现我想要的?我确实尝试使用自定义实现来设置类的PrivateKey属性。但是在尝试实现所需的接口时迷路了X509Certificate2RSAICspAsymmetricAlgorithmX509Certificate2.PrivateKey

标签: wcfwcf-bindingwcf-securitytpm

解决方案


推荐阅读