在asp.net部署到Docker/ linux的www.example.com核心应用程序中使用始终加密的SQL Server

1l5u6lss  于 2022-11-21  发布在  .NET
关注(0)|答案(2)|浏览(122)

我创建了一个连接到SQL Server数据库的ASP.NET Core Web API应用程序。我有一个表,需要在其中使用SQL Server始终加密。
我将使用以下T-SQL创建一个列主键:

CREATE COLUMN MASTER KEY [MyCMK]
 WITH
 (
 KEY_STORE_PROVIDER_NAME = N'MSSQL_CERTIFICATE_STORE',
 KEY_PATH = N'CurrentUser/my/2DB1E2F1BE5E2A640FB1626895DB174D1A3176DD'
 );

然后使用该列主密钥生成列加密密钥,如下所示:

CREATE COLUMN ENCRYPTION KEY [MyCEK]
 WITH VALUES
 (
 COLUMN_MASTER_KEY = [MyCMK],
 ALGORITHM = 'RSA_OAEP',
 ENCRYPTED_VALUE = 0x016E000001630075007200720065006E00740075007300650072002F006D0079002F0032006400620031006500320066003100620065003500650032006100360034003000660062003100360032003600380039003500640062003100370034006400310061003300310037003600640064002E9E339743391E3829BF1A7B9DF9BAF6858F7D46928D9285A01C6833A049F0DE3A01192B274CD793AD49572F372F79D825B999A4ED2DE824D694A5FA0AC42D62CCA8CCC20D4182F31B52C919E343BF945E518C836F2444304A18307A03C33C1BFA6FB7938F4FC004B11FD4EBD8FC773292689936EAAC6A0B0CD16B5BA937F0169FBC75B3380E23A196DF905292CEDA6F4DEC327F29EBF8B65CD7B073B4BEB07D2B3CC3E6E24951B27B7E0B1ACE272DEA133C41932C72381262B74A7FABF4E84129A3F4D36639D662ECBD4C0D25CA360248559B4479B7076F9C8BD352CBCB4D6460201DBB5CC734139F5032AE241F8491779BBE10554568554AC9530EB76AE2AD560E8D4CB18FA6DDAA7763E873DCA23D582176E84D78BF2E59D2ED2D926932D05231F52D7E9E01AADC08A039DDC082F0F2B67115922E01772741CE19DE63C7AA4B6B2E3A120717FD04A6A31FB72713CA603E5ADF701497D5EAE1E3920DDF24EB9DD367CBAB8CEDFEDBEAEDC7CD8C2123066AC5BCE552AB3E3C211D38DEDDCB3300EFC652FB03443EE91429CFEE802484FD84E7FA1194CD2A753D0CCA29FAC8286F79390C3E24B5F0ACA479FD5F3BBB78F82A4C4F32FF33C878B1895A0C6CB57F05CBE69FC2D1A26236102F19F2256FE7352A5CB3B6700F373B6DBC7E022EC5DBFE405BCAA96B5B0A070FB704E251F804B9F5AC2EFE4E75C8D02B3DCEA21B90C4
 );

然后,我使用TSQL创建表,其中包含2个加密列:

CREATE TABLE [Appraisal].[Answer]
(
     [Id] [uniqueidentifier] NOT NULL,
     [AppraisalId] [uniqueidentifier] NOT NULL,
     [QuestionId] [uniqueidentifier] NOT NULL,
     [AppraiserId] [uniqueidentifier] NOT NULL,
     [AppraisedId] [uniqueidentifier] NOT NULL,
     [InteractionGroupId] [uniqueidentifier] NOT NULL,
     [Point] [int]  ENCRYPTED WITH (
         COLUMN_ENCRYPTION_KEY = MyCEK,
         ENCRYPTION_TYPE = RANDOMIZED,
         ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'),
     [Comment] [nvarchar](1024) COLLATE Latin1_General_BIN2  ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCEK,
                ENCRYPTION_TYPE = DETERMINISTIC,
                ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'),
     [CreateDateTime] [datetime] NOT NULL
)

然后,为了在将托管我的应用程序的任何计算机上安装我的证书,我使用Windows认证管理器将SQL Server始终加密证书导出到我的应用程序根文件夹,并尝试使用以下代码安装它:

X509Certificate2 cert = new X509Certificate2("MyExportedCertificate.pfx", "MyPassword", 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
X509Store store = new X509Store(StoreName.My);

我运行应用程序,一切正常。X509 Certificate 2类安装我的证书,我的应用程序可以加密/解密数据。
然后使用VisualStudio〉添加项〉Docker支持创建一个Docker文件,并添加下面这行代码将“*.pfx”文件复制到应用程序的根文件夹:

FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine3.16-amd64 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

COPY ["Api/MyExportedCertificate.pfx", ""]
  • 为了清楚起见,省略了Docker文件内容的其余部分。

然后我编辑我docker-compose文件来添加我的sql server映像:

services:
api:
 image: ali-api
 container_name: web_api_application
 ports:
   - "5000:80"
 environment:
   - ASPNETCORE_ENVIRONMENT=Production

sqldb:
 image: mcr.microsoft.com/mssql/server:2019-latest
 environment: 
     - SA_PASSWORD=Qwerty*2607548
     - ACCEPT_EULA=Y
 ports:
     - "1440:1433"
 container_name: sqldb

最后我构建了我的应用程序:

docker build -t ali-api -f Api/Dockerfile .

docker-compose up

我的应用程序开始工作,我可以访问我的swagger页面。

我可以看到CMK和CEK也都生成了。

而且我的始终加密也是这样做的:

但似乎我的许可证没有安装,因为当我想将数据插入到我的加密表列时,我得到错误:
保存实体更改时出错。有关详细信息,请参阅内部异常。无法使用密钥库提供程序对列加密密钥进行解密:'MSSQL_CERTIFICATE_STORE'。加密数据行加密密钥的最后10个字节为:'51-29-CD-17-1C-E2- 6 E-13-A4- 45'此平台上不支持该操作
我做错了什么?
如何在linux中导入此证书?(docker)
如何在linux中安装此证书?(docker)
.pfx文件位于我的应用程序的根文件夹中。如何在linux中安装此.pfx文件?

5us2dqdw

5us2dqdw1#

Linux不支持MSSQL_CERTIFICATE_STORE。你必须使用Azure Key Vault或实现你自己的自定义密钥库提供程序。有关详细信息,请参阅this link

utugiqy6

utugiqy62#

MSSQL_CERTIFICATE_STORE仅在Windows上受支持。对于Linux客户端应用程序,你可以尝试始终加密Azure密钥库(AKV)提供程序for Microsoft.Data.SqlClient,该程序可在NUGET上获得:https://www.nuget.org/packages/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider
您也可以查看GitHub上的dotnet/SqlClient repo以获取AKV示例代码https://github.com/dotnet/SqlClient/blob/main/doc/samples/AzureKeyVaultProviderExample.cs

相关问题