SQL Server 2016 Always Encryption失效求助:跨服务器需同部署吗?
解答:Always Encryption跨服务器部署问题
首先明确回答:不需要将SQL Server和MVC应用部署在同一服务器,Always Encryption的设计本来就支持客户端(应用服务器)与数据库服务器分离的架构,你的问题大概率是配置环节遗漏了关键步骤,下面是逐一排查和解决的方案:
验证应用服务器的SQL Server驱动版本
Always Encryption需要客户端驱动的支持,对于.NET MVC应用来说,你需要确保项目中引用的System.Data.SqlClient(或Microsoft.Data.SqlClient)版本不低于4.6.1(.NET Framework环境)或对应兼容的.NET Core版本。可以在项目的NuGet包管理器中查看当前驱动版本,若版本过低,升级到最新兼容版本即可。确保应用服务器能访问列主密钥(CMK)
Always Encryption的解密操作是在客户端(应用服务器)完成的,所以应用服务器必须能够访问存储列主密钥的位置:- 如果CMK存储在Azure密钥保管库:需要为应用服务器的身份(比如IIS应用池的运行身份)配置密钥保管库的访问权限,允许其获取密钥。
- 如果CMK是本地证书:需要将加密列时使用的证书导出(注意导出私钥),然后导入到应用服务器的本地机器证书存储或应用池身份对应的当前用户证书存储中,同时确保应用池身份有读取该证书的权限。
检查数据库用户的权限配置
应用连接数据库所用的登录账号必须具备以下权限,否则客户端无法获取密钥定义来完成解密:GRANT VIEW ANY COLUMN MASTER KEY DEFINITION TO [你的应用登录账号]; GRANT VIEW ANY COLUMN ENCRYPTION KEY DEFINITION TO [你的应用登录账号];执行上述SQL语句后,重启应用池再测试。
确认连接字符串的完整配置
除了添加column encryption setting=enabled;,还要确保:- 连接字符串使用的是支持Always Encryption的驱动(比如
System.Data.SqlClient),而非其他不兼容的数据库驱动。 - 认证方式配置正确:如果使用Windows认证,应用池的运行身份需要具备数据库的访问权限;如果使用SQL Server认证,登录账号需有对应数据库的读写权限。
- 连接字符串使用的是支持Always Encryption的驱动(比如
查看具体错误日志定位问题
建议你查看IIS的事件查看器日志,或者应用的异常捕获日志,获取具体的错误信息(比如“无法找到列主密钥”“权限不足”“驱动不支持”等),根据具体错误可以更精准地解决问题。
内容的提问来源于stack exchange,提问作者Melody
相关产品推荐
相关产品推荐

