我正在尝试将一个 POC 放在一起,以利用 SQL Server 2019 可扩展性框架和外部语言功能。这允许在 SQL Server 存储过程中执行外部语言。我编写了一个 JAR 文件,用于加密和解密通过 SQL Server 存储过程传递的数据。我已经确认每个方法都是正确的,并且在不作为存储过程发送时返回正确的值。但是,在执行存储过程时,我收到一个空数据集,并在 Debug模式下看到以下错误:
java.io.FileNotFoundException: <jks-file-location> (Access is denied)
引发错误的 Java 代码行如下:
Key _key = readKeyFromStore_cbs("<jks-file-location>, "<password>".toCharArray(), "entityEncryption", "<password>".toCharArray());
_keySpec = new SecretKeySpec(_key.getEncoded(), _key.getAlgorithm());
再说一遍,代码很好,我不认为那里有问题,也不认为发布这些方法的内容是问题(SP 本身在数据加密的地方使用虚拟数据运行良好)并解密,并且加密和解密的代码在单独运行时按预期运行)。
其他信息:
- 我在本地 Windows 10 环境中运行此程序,并已授予“Everyone”对 jks 的完整安全权限。
- 我已经仔细检查了运行 sql server 的用户,并确保该用户对该文件也拥有完全权限。 (该用户还拥有 SQL Server 的管理员权限)
- 我已检查 SQL Server
sp_configure
还有选项。 - 文件流已在 sp_configure 中启用并设置为完全控制
- 我什至在 sp_configure 上禁用了 clr strict security,看看是否是这个原因。我仍然收到同样的错误。
- 我已尝试在我的用户目录(对 SQL Server 用户的目录和文件具有权限)、C 驱动器以及 C 驱动器的子目录(同样对 SQL Server 用户具有对目录和文件的权限)中使用 JKS 进行测试。 SQL Server 用户的目录和文件)
存储过程运行,但返回空数据集。当尝试在不加密的情况下运行(使用当前无法访问的 keystore 中的 key )并使用虚拟数据时,我收到了预期的数据集。
谁知道可能导致此错误的原因是什么?
最佳答案
更新: 将 JAR 和 jks 移至 SQL Server 目录并启动 Launchpad 服务解决了该问题。希望这可以帮助人们避免类似的挫败感。
关于java - JKS 文件上的 SQL Server 2019 外部脚本执行身份验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61963216/