【问题标题】:Certificates from different sql servers version来自不同 sql server 版本的证书
【发布时间】:2020-05-27 16:59:32
【问题描述】:
我在两个不同服务器上的两个不同数据库中配置了一个服务代理。问题是我无法收到消息,因为我有问题:
Connection handshake failed. The login 'public' does not have CONNECT permission on the endpoint. State 84.
我有带有证书的端点,我允许连接到具有证书的特定用户(我在两台服务器上这样做,因为它始终在可用性组上),同时寻找我注意到的问题来自启动服务器的证书与来自目标服务器的证书不同:
-initiator - 签名算法:sha1RSA,密钥长度:1024(sql ver. 11.0.7 ...)
-target - 签名算法:sha256RSA,密钥长度:2048(sql ver. 15.0.4 ...)
当我授予权限时:
grant connect on endpoint :: BrokerEndPoint to PUBLIC
服务器进行通信,但这并不能解决问题。
不同类型的证书会有问题吗?
【问题讨论】:
标签:
sql-server
service-broker
【解决方案1】:
grant connect on endpoint :: BrokerEndPoint to PUBLIC
这样做基本上绕过了授权,因为每个人都有权连接。我认为您应该尝试修复用户/角色权限。
我注意到来自启动服务器的证书与来自目标服务器的证书不同:
这应该没什么区别。
看起来问题是您以某种方式错误配置了 users/login/certs 链。太复杂了,很容易破解...这是正确设置的还原:
- 有两层安全性:对话安全(数据库中的服务之间)和传输安全(实例中的端点之间)。您现在谈论的是传输安全(端点到端点)。
- 端点安全始终存在于所涉及的 SQL 实例之间。如果您有 AG,则需要单独配置每个节点,因为端点是实例级概念,不遵循 AG 故障转移。
- 端点将使用配置的证书 (
CREATE ENDPOINT ... FOR SERVICE_BROKER (AUTHENTICATION = CERTIFICATE <certname>))。证书必须具有可访问的私钥才能使用(即使用可以从服务主密钥打开的密钥进行加密,通常通过master 数据库主密钥)。
- 在握手期间,身份验证和授权是相互的。对实例说,S1 和 S2 需要连接,那么:
- S1 将使用证书 C1,S2 将使用证书 C2
- S1 需要在其
master 数据库中包含 C2(仅公钥),并且 S2 需要在其 master 中包含 C1(仅公钥)。
- S1
master 中的 C2 证书由数据库用户(数据库主体)拥有,例如 US2。这个用户有一个登录名(一个服务器主体,比如 UL2)。登录 UL2 必须在 S1 端点上被授予 CONNECT 权限。
- 反之亦然:S2
master 中的 C1 证书由具有登录 (UL1) 的用户 (US1) 拥有。此登录 UL1 需要在 S2 端点上被授予 CONNECT 权限。
要进行故障排除,请在配置文件(在安全审计组中)中启用“审计代理登录”事件。当握手失败时,此事件将触发并详细说明握手失败的原因。
【解决方案2】:
你的时间,我再次检查了连接和数据,发现没有任何问题。由于我担心这可能是我写的一个问题,所以为了测试我创建了另一个连接,但这次是在具有 SHA256 证书的服务器上,因为我认为这是一个问题。为了证实我的理论,我将之前写过的初始服务器上的证书替换为 SHA256(我删除并使用此证书重新创建了端点),并在目标服务器上替换了此证书,问题就解决了。所以这就像我认为证书必须具有相同类型的编码。