我无法启动 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 使用的证书?
- 不涉及使用 AD FS MMC 控制台。这仅在服务可以启动时才有效,但服务无法启动。
- 不涉及 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
(以启用继承)。使用cacls
或icacls
,表示法为:
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 证书。