我创建了一个连接到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文件?
2条答案
按热度按时间5us2dqdw1#
Linux不支持
MSSQL_CERTIFICATE_STORE
。你必须使用Azure Key Vault或实现你自己的自定义密钥库提供程序。有关详细信息,请参阅this link。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