如何无需开启TRUSTWORTHY ON注册SQLCLR引用程序集?
当然有办法!完全不用开启TRUSTWORTHY ON就能搞定未签名的Newtonsoft.dll注册,核心是利用SQL CLR的依赖信任机制——让已经通过非对称密钥获得信任的Something.dll来“背书”它的引用集。我给你分两种场景详细说明:
场景1:Newtonsoft.dll仅需SAFE权限(绝大多数情况)
Newtonsoft.Json的核心序列化/反序列化功能完全在SAFE权限集下就能正常运行,这也是最推荐的方式,因为SAFE权限的程序集不需要签名,也不需要额外的信任配置。
步骤如下:
- 先注册Newtonsoft.dll为SAFE权限:
CREATE ASSEMBLY [Newtonsoft.Json] FROM 'C:\YourAssemblyPath\Newtonsoft.dll' WITH PERMISSION_SET = SAFE;
- 再注册你的Something.dll(已经签名并关联非对称密钥):
CREATE ASSEMBLY [Something] FROM 'C:\YourAssemblyPath\Something.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS, ASYMMETRIC KEY [YourAsymmetricKeyName];
SQL Server会自动识别两者的依赖关系,因为SAFE权限低于EXTERNAL_ACCESS,且主程序集已经通过非对称密钥获得信任,所以不会报错。
场景2:Newtonsoft.dll确实需要EXTERNAL_ACCESS/UNSAFE权限
如果你的业务逻辑用到了Newtonsoft.Json的特殊功能(比如涉及文件IO、反射等需要更高权限的操作),可以通过主程序集的信任链间接授权:
- 确保你的非对称密钥对应的登录账号拥有
EXTERNAL ACCESS ASSEMBLY权限(这一步你应该已经完成,但还是确认下):
GRANT EXTERNAL ACCESS ASSEMBLY TO [LoginCreatedFromYourAsymmetricKey];
- 直接注册Newtonsoft.dll并指定所需的权限集:
CREATE ASSEMBLY [Newtonsoft.Json] FROM 'C:\YourAssemblyPath\Newtonsoft.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS; -- 或 UNSAFE,如果确实需要
因为你的Something.dll已经通过非对称密钥被SQL Server信任,作为它的依赖程序集,Newtonsoft.dll会自动继承这条信任链,无需开启TRUSTWORTHY。
额外注意事项
- 确保SQL Server的CLR功能已经开启(默认可能关闭),开启命令:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE;
- 尽量避免给程序集赋予超过实际需求的权限,
SAFE能满足的就不要用EXTERNAL_ACCESS,更不要随便用UNSAFE,减少安全风险。 - 确保Newtonsoft.dll的版本和你编译Something.dll时引用的版本完全一致,否则可能出现版本不兼容的错误。
内容的提问来源于stack exchange,提问作者OZ1903
相关产品推荐
相关产品推荐

