wcf - WCF 如何更改 X.509 证书私钥的加密提供程序
问题描述
我正在尝试按照微软的这个操作指南来扩展 WCF。其基本思想是使用硬件安全模块作为客户端私钥持有者,这意味着所有涉及客户端私钥的密码操作都必须由安全模块芯片进行。
设置
dotnet framework: 4.7.2
binding: netTcp
binding security: Message
clientCredentialType: Certificate (X509Certificate2)
serverCertificate: X509Certificate2
所有证书(1 个服务器证书和 2 个客户端证书)均由同一个 CA 签署。服务器证书是一个pfx
包含证书和私钥的普通文件。我准备了两个不同的客户端证书,一个带有私钥,一个没有私钥。(两个客户端pfx
文件具有相同的证书)
观察:
- 当使用包含私钥的客户端
pfx
文件时,客户端能够以 mtls 方式与服务器通信。 - 使用
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)
- 在这两种情况下,框架都没有使用根据
CustomX509AsymmetricSecurityKey
上述方法提供的内容。甚至没有实例化类。是通过. 但是该类的属性从未被调用,这就是自定义私钥发挥作用的地方。WCF
CustomX509SecurityToken
CustomX509SecurityTokenProvider
SecurityKeys
CustomX509SecurityToken
问题
- 操作指南是否已过时?请注意它已过时
03/30/2017
。 - 使用
pfx
无私钥时的例外情况是不言自明的。我没有提供私钥。为什么 WCF 不使用提供CustomX509AsymmetricSecurityKey
的作为私钥?这不是用户以 a 形式提供替代私钥的全部意义X509AsymmetricSecurityKey
吗? - 我是否遵循错误的指南来实现我想要的?我确实尝试使用自定义实现来设置类的
PrivateKey
属性。但是在尝试实现所需的接口时迷路了X509Certificate2
RSA
ICspAsymmetricAlgorithm
X509Certificate2.PrivateKey
解决方案
推荐阅读
- asp.net - 无法从 ajax 访问 WebAPI 方法,但可以从 asp.net 中的邮递员访问它
- c++ - Qt5 - Windows:Windows 找不到可执行文件
- python - 当它似乎工作时,我如何修改列表?
- javascript - 在令牌验证的上下文中正确使用 async/await
- javascript - 如何在 JavaScript 中向对象添加函数而不会导致内存效率低下
- python - 网状虚拟环境
- reactjs - 将功能组件连接到 redux store
- node.js - 2dsphere 不是路径“索引”中的有效类型
- angular8 - 角度更新 8.1 到 8.2 我得到很多“无法读取未定义的属性 'ngInjectableDef'”
- r - 如何在循环R中创建独立的不同data.frame