如何手动规避 AD FS 证书困境

如何手动规避 AD FS 证书困境

我无法启动 AD FS 服务。这是因为它配置的证书带有一组不正确且过于复杂的 X509 扩展。这导致服务失败并出现错误 102,这是一个空参数异常。默默地。

Exception details: 
System.ArgumentNullException: Value cannot be null.
Parameter name: certificate
   at System.IdentityModel.Tokens.X509SecurityToken..ctor(X509Certificate2 certificate, String id, Boolean clone, Boolean disposable)
   at Microsoft.IdentityServer.Service.Configuration.MSISSecurityTokenServiceConfiguration.Create(Boolean forSaml, Boolean forPassive)
   at Microsoft.IdentityServer.Service.Policy.PolicyServer.Service.ProxyPolicyServiceHost.ConfigureWIF()
   at Microsoft.IdentityServer.Service.SecurityTokenService.MSISConfigurableServiceHost.Configure()
   at Microsoft.IdentityServer.Service.Policy.PolicyServer.Service.ProxyPolicyServiceHost.Create()
   at Microsoft.IdentityServer.ServiceHost.STSService.StartProxyPolicyStoreService(ServiceHostManager serviceHostManager)
   at Microsoft.IdentityServer.ServiceHost.STSService.OnStartInternal(Boolean requestAdditionalTime)

好的,所以我需要更改证书。查找如何执行此操作,有很多资源。每个人都希望您打开 AD FS MMC 管理单元。哪个发布了错误:

ADMIN0017: An exception occurred while connecting to the configuration service (...) 
or the AD FS Windows Service is not running.

换句话说,ADFS 做的事情我只能描述为极其愚蠢。 那是

  • 允许用户以无法启动的方式对其进行配置。
  • 如果未运行,则不允许用户更改配置。

有一个 powershell 命令可以执行相同的操作;

Set-AdfsCertificate -CertificateType Service-Communications -Thumbprint <paste hex thumb>

导致同样的愚蠢行为:

Set-AdfsCertificate : Could not connect to net.tcp://localhost:1500/policy

其他 adfs powershell 命令也是如此。

但是:最糟糕的是,配置晦涩难懂。似乎只有一种设置证书的特定方法可行,而我迷失在密钥扩展、扩展密钥扩展、替代名称、密钥方法、计算机权限、用户权限、服务帐户权限、私钥 pfx 详细信息、pfx 版本、加密服务提供商版本等的海洋中。Microsoft 文档已过时、404 和/或不完整。

因此,我需要反复试验,更换此证书几十次,直到成功为止。有什么简单的方法可以更改 ADFS 使用的证书?

  1. 不涉及使用 AD FS MMC 控制台。这仅在服务可以启动时才有效,但服务无法启动。
  2. 不涉及 ADFS powershell 命令,不幸的是,这也需要服务运行。

编辑:即使重新安装 ADFS不是解决问题。即使选择了不同的配置数据库。我仍然停留在错误 102。看来证书设置实际上并未存储在数据库中。

进一步查看后,通过启用文件夹审核C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys,我注意到了这个错误(私人详细信息被混淆):

Subject:
    Security ID:        MYDOMAIN\adfsroot$
    Account Name:       adfsroot$
    Account Domain:     MYDOMAIN
    Logon ID:       0xFFFFFFF

Cryptographic Parameters:
    Provider Name:  Microsoft Software Key Storage Provider
    Algorithm Name: RSA
    Key Name:   {UUID-HERE}
    Key Type:   Machine key.

Cryptographic Operation:
    Operation:  Create Key.
    Return Code:    0x80090010

这表明存在权限问题;程序无法在启动时创建 RSA 密钥。它正在尝试访问机器密钥文件,文件名称如下。假设密钥 UUID 和机器 UUID 为

12345678-90AB-CDEF-1234-567890ABCDEF
11223344-5566-7788-9900-AABBCCDDEEFF

这些文件似乎被命名为:

1234567890ABCDEF1234567890ABCDEF_11223344-5566-7788-9900-AABBCCDDEEFF.sys

包含私钥的纯文本二进制表示,受 NTFS 权限保护。ADFS 生成四个这样的文件,并且其用户有权限这样做;

但是,当我检查创建的四个私钥文件之一时,虽然它具有正确的所有者MYDOMAIN\adfsroot$,但它没有正确的权限:的有效权限adfsroot$是根本没有访问权限。(导致上面的 102 错误)。显然,ADFS 在锁门后扔掉了钥匙,或者文件系统由于错误配置文件夹而以某种方式这样做MachineKeys

我怎样才能运行这个编写糟糕的软件?

答案1

检查是否MachineKeys具有正确的权限。

为了解决这个问题:我在根文件夹上授予了adfsroot用户这些高级 NTFS 权限MachineKeys

List Folder 
Read attributes
Read extended attributes
Create files
Create folders
Write attributes
Write extended attributes
Read permissions

确保Applies to值为This folder, subfolders and files(以启用继承)。使用caclsicacls,表示法为:

MYDOMAIN\adfsroot$:(OI)(CI)(R,W)

由于某种原因,ADFS 在这里表现不佳,并且文档不起作用。

答案2

由于 TS 证书已过期,您无法启动 ADFS。

以管理员身份打开 PowerShell:输入以下内容:while ($true){ Set-Date -Date "01/01/2023 12:45";Start-Service adfssrv }

通过将系统时间暂时回溯到您的 TS 证书尚未过期的时间,这将使您的 ADFS 服务重新启动。

如果时钟没有自动重置,请继续将时钟重置回原始时间。然后在 ADFS 服务仍在运行时,继续更新您的 TS 证书。

相关内容