«
ADFS 4.0 SSL证书更换中的排错

时间:2022-5-24     作者:管理员     分类: 运维价值


本文转自https://mp.weixin.qq.com/s/G0_JpSEhV1DDgQYnseYtjg
更多好文,微信扫码关注微信公众号:混合办公

最近有一个客户使用ADFS 4.0(Windows Server 2016)配置了腾讯会议企业版SSO以及其他业务系统,目前面临ADFS证书到期需要更换证书,按照我提供的方法更换证书一直报错,无法执行。针对这个问题进行了集中排错,现将排错过程分享给大家。

在ADFS中涉及最重要的证书是通信证书(当然还有自动生成的一些令牌证书),这个证书要么从企业私有CA中生成,要么使用受信任的公共证书颁发机构签发,而一般ADFS这种业务系统都是使用公网SSL证书,避免用户没有在设备上安装企业内部自建CA的根证书从而无法打开ADFS Portal页面进行登录。而一般的公网证书现在都只签发一年,一年之后就需要更换或续签证书,证书的指纹会发生变化。
这篇文章为大家分享在更换ADFS 4.0(Windows Server 2016)的SSL证书时遇到的一些问题及排错过程,相比于ADFS 3.0(Windows Server 2012R2)可能会更复杂些。
更换证书的前提:需要将SSL证书安装至ADFS和ADFS Proxy服务器-本地计算机-个人目录中
如果您的ADFS服务账号并非AD User账号而是使用服务账号(例如adfsservice$这类账号,可以在Windows服务中查看ADFS服务的具体服务账号)则需要在SSL证书的私钥权限中赋予该服务账号读取权限。

在ADFS 3.0中只需要使用如下续订令牌证书

Update-AdfsCertificate -CertificateType:token-signing -Urgent:$true
Update-AdfsCertificate -CertificateType:Token-Decrypting -Urgent:$true

接下来使用Set-AdfsCertificate命令和Set-AdfsSslCertificate命令来完成SSL证书的替换

dir Cert:\LocalMachine\My\ ##获取当前计算机上所有已安装证书的指纹
Set-AdfsCertificate -CertificateType Service-Communications -Thumbprint #你的证书Thumbprint值#
Set-AdfsSslCertificate -Thumbprint #你的证书Thumbprint值#

最后重启下ADFS服务即可

Restart-Service adfssrv

在ADFS 4.0中按照微软官方的命令即可完成更换SSL证书,当然还需要更新令牌证书

Set-AdfsSslCertificate -Thumbprint #你的证书Thumbprint值#

但在实际应用过程中可能会出现以下报错:

错误信息:PS0316 / PS0317,ADFS服务器返回错误,连接到localhost失败,拒绝访问。

使用以下命令创建一个新的PS Session并使用域管理员账号Set-AdfsSslCertificate依然会报错

Enter-PSSession localhost -Credential $(Get-Credential)
Invoke-Command -ComputerName localhost -Credential $(Get-Credential) -ScriptBlock {Set-AdfsSslCertificate -Thumbprint #你的证书指纹#}

这个问题可能是在ADFS 4.0中由于当前SSL证书是通配符引起的。

SAN中并没有包含ADFS Portal的DNS名称,而是*.contoso.com。使用命令Set-AdfsSslCertificate直接更换证书看似不行。不妨看下当前ADFS场内有哪些服务绑定了SSL证书,以及证书的指纹。可以使用如下命令查看当前SSL证书绑定的所有信息
netsh http show sslcert
在下面的反馈结果中能发现所有ADFS服务的主机和端口以及ADFS程序ID,此ID是固定的,需牢记此ID一会会用到

同时使用Get-AdfsSslCertificate查看当前ADFS主机服务使用的证书及其指纹,如上图

既然知道了哪些主机和端口使用的旧证书,那么只需要将证书从这些主机中删除然后重新为这些主机分配新的SSL证书即可实现ADFS证书更换

使用如下命令删除对应的主机服务,在删除ADFS主机服务后,其证书也会自动删除

netsh http delete sslcert hostnameport = dnsname:443
netsh http delete sslcert hostnameport = localhost:443
netsh http delete sslcert hostnameport = dnsname:49443

接下来可以使用以下PS脚本创建新的ADFS主机服务并将新的证书指纹绑定到主机服务上

$guid = "5d89a20c-beab-4389-9447-324788eb944a"
$certhash = "你的证书指纹值"
$hostnameport443 = "sso.contoso.com:443" ##sso.contoso.com源于您定义的的ADFS Portal URL中DNS名称
$Command = "http add sslcert hostnameport=$hostnameport443 certhash=$certhash appid={$guid} certstorename=MY sslctlstorename=AdfsTrustedDevices clientcertnegotiation=disable"
$Command | netsh

$hostnameportlocalhost = "localhost:443"
$Command = "http add sslcert hostnameport=$hostnameportlocalhost certhash=$certhash appid={$guid} certstorename=MY sslctlstorename=AdfsTrustedDevices clientcertnegotiation=disable"
$Command | netsh

$hostnameport49443 = "sso.contoso.com:49443" ##sso.contoso.com源于您定义的的ADFS Portal URL中DNS名称
$Command = "http add sslcert hostnameport=$hostnameport49443 certhash=$certhash appid={$guid} certstorename=MY sslctlstorename=AdfsTrustedDevices clientcertnegotiation=disable"
$Command | netsh

待执行完毕后重启ADFS服务

使用Get-AdfsSslCertificate发现ADFS主机服务的证书已经更换成新的通配符SSL证书了,如下

最后,别忘了还有ADFS Proxy的WebApplicationProxy需要更换SSL证书。

这个就相对简单了,首先还是要将SSL证书安装到代理服务器,然后获取证书指纹,使用如下命令更换ADFS Proxy服务SSL证书
Set-WebApplicationProxySslCertificate -Thumprint ##你的新证书指纹值##

更换完成SSL证书后使用Get-WebApplicationProxySslCertificate即可发现新的SSL证书已经应用到了代理服务上

最后在外网测试打开ADFS登录页,在浏览器中点击网址中的🔒验证证书指纹为新的SSL证书。

整个排错过程完!

标签: 证书 排错 ssl adfs 通配符