访问SSRS管理时没有可供选择的客户端证书。

7

环境:

报告服务运行在安装有SQL Server 2008 R2 SP3的Windows 2008服务器上,.Net 4.6.1已安装并启用了功能中的.NET 3.5。IIS,数据库和报告服务都在本地机器上(自定义登录URL在另一台机器上,但似乎与此无关)。

所做的更改:

由于安全原因,我们被迫转移到TLS 1.2,因此我们使用IISCrypto仅启用了TLS 1.2

结果:

从此刻起,仅在尝试访问报告管理站点时才会出现错误。在浏览器上,我们会收到错误500,显示:

底层连接已关闭:接收到意外错误

在SSRS日志中,我们可以看到以下异常:

System.Net.WebException: 底层连接已关闭:接收到意外错误。---> System.ComponentModel.Win32Exception: 客户端和服务器之间不能通信,因为它们没有共同的算法

调用堆栈始于ReportServer OnInit(),因此它不会立即失败,并且该错误发生在报告服务初始化时。

在.Net Framework上启用跟踪时,我找到了以下消息,在其中显示SSRS调用自己的Web服务时发生失败:

System.Net Information: 0 : [5076] HttpWebRequest#38854310 - Request: POST /ReportServer/ReportService2010.asmx HTTP/1.1

System.Net Information: 0 : [4124]

SecureChannel#52830003::.ctor(hostname=themachineshostname, #clientCertificates=0)

System.Net Information: 0 : [4124] Enumerating security packages:

System.Net Information: 0 : [4124]     Negotiate

System.Net Information: 0 : [4124]     NegoExtender

System.Net Information: 0 : [4124]     Kerberos

System.Net Information: 0 : [4124]     NTLM

System.Net Information: 0 : [4124]     Schannel

System.Net Information: 0 : [4124]     Microsoft Unified Security Protocol Provider

System.Net Information: 0 : [4124]     WDigest

System.Net Information: 0 : [4124]     TSSSP

System.Net Information: 0 : [4124]     pku2u

System.Net Information: 0 : [4124]     CREDSSP

System.Net Information: 0 : [4124] SecureChannel#52830003 - Left with 0 client certificates to choose from.

System.Net Information: 0 : [4124] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent  = Outbound, scc = System.Net.SecureCredential)

System.Net Error: 0 : [4124] AcquireCredentialsHandle() failed with error 0X80090331.

已检查的事项:

使用的证书仍然有效,并且其签名链已放置在正确的“中间”和“根”存储区中。

以管理员身份运行应用程序池没有帮助。

使用从IIS生成的自定义签名证书也没有帮助。

重要提示: 问题只发生在报告服务管理站点上,报告工作正常。

下一步操作

还有其他尝试的想法吗?是否有一种方法可以知道为什么没有选定安全包?

更新

该问题与TLS1.2无关,因为再次启用TLS 1后我仍然遇到同样的错误。 我猜登录URL某种方式涉及其中。


你能否使用最新版本的curl进行测试?curl -v --tlsv1.2 --cert myclientcert.pem https://<yoururl>,你需要确保这不是浏览器相关问题,并首先使用curl进行调试。 - Tarun Lalwani
我也遇到了完全相同的500错误。据我所知,当Reporting Services进行本地调用其自己的Web服务时会发生此错误,因此我猜测这与使用的客户端无关。 - Ignacio Soler Garcia
无论如何,感谢您的评论,我看到问题缺少细节,我进行了改进。谢谢! - Ignacio Soler Garcia
看看这个是否有帮助:https://dev59.com/cV8d5IYBdhLWcg3wgya4 - Tarun Lalwani
只有一个服务器,IIS、SQL和报告都位于同一台机器上。仅支持https。仅支持1.2版本。我已经尝试了数百种方法,所以我猜我已经更改了系统中的每个文件:D - Ignacio Soler Garcia
显示剩余4条评论
1个回答

4
让我们确保注册表中有两个正确的设置(在报告服务器和IIS自定义登录服务器上)。更改每个设置后需要重新启动计算机(一次只更改一个以查看哪个有效)。 注册表中启用TLS 1.2客户端/服务器 进入 HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL,确保启用TLS 1.2并禁用其他提供程序。如果不存在TLS 1.2,请创建它。 详细信息请参见此处 确保.NET启用UseStrongCrypto 进入此处,确保启用强加密。
注意:我正在使用移动设备,因此很难键入详细答案。如果这些方法适用于您,我可以稍后添加更多详细信息。

感谢您的回答,这已经得到验证。访问报告时,TLS 1.2 可以正常工作。问题只发生在 ReportManager 中。 - Ignacio Soler Garcia
TLS 1.2中的某些内容导致了您的错误。 “没有公共算法”是我认为的原因,因为我以前也遇到过这个问题。在注册表中启用了客户端密钥的TLS 1.2吗? .NET强加密呢?报告管理器充当客户端(编写在.NET中),连接到报告服务URL(在这种情况下是“服务器”)。如果您的本地计算机可以连接到Web服务URL,但报告管理器无法连接,则会引导我进入答案中提出的道路。 - thomas
我已经仔细检查过了,它已经正确设置。顺便问一下,报表管理器(使用 .Net 2 编写)如何在不更改其代码的情况下与 TLS 1.2 兼容? - Ignacio Soler Garcia
好问题。由于您使用的是2008 R2,您可能需要一个热修复程序。这个答案是否提供了任何见解/进展?https://dev59.com/6VgR5IYBdhLWcg3wBZS3#45061077 - thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接