我们在(推送)事务复制拓扑中的每个 SQL Server 上使用来自公共 CA 的 SSL 证书,并希望为我们的分发代理设置 EncryptionLevel = 2。目前 EncryptionLevel 设置为 1,并且工作正常。(1 和 2 之间的区别是 1 告诉代理只使用加密,而 2 告诉它还验证 SSL 证书的证书链)
SSL 证书来自公共 CA。主题名称是服务器的完整 Windows FQDN (SERVER1.mywindowsdomain.com),主题备用名称列表包含完整的 DNS FQDN (MYAPP.MYDOMAIN.COM)。
我可以确认使用 SSMS 我可以正确连接到每个 SQL Server,而无需在连接对话框中勾选“信任服务器证书”,这意味着证书链已成功正确验证。
当我将 EncryptionLevel 更改为 = 2 时,我们的分发代理无法再连接到在同一台服务器上运行的发布者/分发者。这是有道理的,因为他们正在尝试连接到 SERVER1\DEV,而 SSL 证书用于公共 DNS 名称 - MYAPP.MYDOMAIN.COM,因此链验证失败。
因此,我正在寻找一种从头开始设置复制的方法,但使用 DNS 名称 (MYAPP.MYDOMAIN.COM) 而不是机器名称 (SERVER1)。
但是,当我执行以下命令时:
exec sp_adddistributor @distributor = N'MYAPP.MYDOMAIN.COM\DEV', @password = N'12345'
然后我收到以下错误消息:
消息 18483,级别 14,状态 1,第 48 行无法连接到服务器“SERVER1\DEV”,因为“distributor_admin”未定义为服务器上的远程登录。确认您指定了正确的登录名。. 消息 14114,级别 16,状态 1,过程 sp_adddistributiondb,第 169 行 [批处理起始行 65] 服务器“SERVER1\DEV”未配置为分发服务器。
请注意,此命令在过去运行良好:
exec sp_adddistributor @distributor = N'SERVER1\DEV', @password = N'12345'
经过大量谷歌搜索后,我尝试了很多变体。我努力了:
- 在发布者上使用客户端别名(32+64 位)
- 改变我的 SSMS 会话连接到服务器的方式,即连接对话服务器名称。我试过使用 SERVER1\DEV、MYAPP.MYDOMAIN.COM\DEV 和 SERVER1.mywindowsdomain.com\DEV。
任何有关下一步尝试的建议都将不胜感激。我很乐意探索 a) 让分发代理能够验证本地服务器的证书 [但请记住我不能修改 SSL 证书],或者 b) 完全从头开始重新创建复制,以便它使用 DNS FQDN,即。MYAPP.MYDOMAIN.COM\DEV.
注意:只是为了阻止任何人用谷歌搜索该错误消息并建议我们的 SQL 服务器可能已重命名,但事实并非如此。问题是机器名称与 DNS 名称。
我能够让这个工作,但有一个相当不令人满意的解决方法 - 所以如果其他人可以提供更好的解决方案,请提供。我担心这个解决方案会产生未知的副作用。
大致的步骤是:
现在,当我使用 sp_adddistributor 命令时,如果我使用 Machine FQDN,它可以正常工作,例如:
事实上,可以为分发代理成功地将 EncryptionLevel 设置为 2。
已知的副作用:
重命名服务器的代码: