在配置两个 Service Broker 实例成功将 msg 发送到单独数据库上的远程服务器后,我试图在相同的成功数据库之一上设置第二个 Service Broker 实例。
我仅在 ssbdiagnose 上收到错误。没有其他工具显示错误。2 在源服务器上运行时来自 ssbdiagnose 的错误。
- 'target IP' 'targetDatabaseName' 用户 '' 使用的用于对话安全的证书 'source cert name' 未部署在数据库中。
- '目标 IP' 'targetDatabaseName' 无法使用证书将 '源 IP' 上的 sourceDatabase '' 中的用户 '' 映射到此数据库。
第一个错误消息中的源证书名称是我以前在源服务器上存在的证书,用于将消息发送到目标服务器上的不同数据库。
所以它似乎在查看错误的证书。
在目标服务器上运行 ssbdiagnose 时,出现以下错误:
- 登录失败。登录来自不受信任的域,不能与 Windows 身份验证一起使用。
谢谢
看来您正在使用Dialog Level Security。这意味着您已经部署了远程服务绑定、用户和证书,成功交换了证书并授予
SEND
了对目标服务的权限。例如,如果您有一个 DB1 和一个 DB2,并且在 DB1 中有一个服务 S1,在 DB2 中有一个服务 S2,那么,要开始从 S1 到 S2 的安全对话,您还必须具有:同样,如果您说 S1 和 S2 之间的消息流动良好,那么上述所有步骤都已经正确完成(这不是一件小事!)。
如果我现在理解正确,你想添加一个新服务,比如 S3,它也位于 DB2 中,如果我理解正确的话,它还需要接受来自 S1 的消息。我将做一个简化假设,即 S3 与 S2 归同一用户所有(因为所有者通常是
dbo
,所以这个假设通常是正确的)。如果是这样,那么您已经交换了必要的用户/证书,您需要做的就是告诉 SSB 使用它们:应该是这样,现在 S1 可以与 S2 通话,也可以与 S3 通话。
此证书交换和用户所有权逻辑用于将用户从 DB1“映射”到 DB2,而不依赖于 Windows 域。这种映射是通过交换公钥证书然后遵循证书所有权来完成的:在 DB1 中,U1(即 S1 的所有者)拥有一个带有私钥 C1 的证书。同一个证书的公钥存在于 DB2 中并归 U1'(DB2 中的用户)所有。因此 U1“映射”到 U1'。每当 ssbdiagnose 抱怨无法“使用证书映射”用户时,这意味着此链在某处断开。
我的错误原因是寻找不同的证书,是因为我的一个证书到期日期与其他证书不同;因此,它忽略了我想要的证书并使用距离今天最远的日期的证书。
我修复了所有日期,这解决了上述错误。
但是,某些实例会起作用,而其他实例则不会。这次我收到类似“对象引用未设置到对象实例”的错误,以及 ssbdiagnose 中的其他 11 条消息。直到我按特定顺序配置每个服务代理实例后,这个问题才得以解决。我推测这与主密钥与源证书绑定有关。