Hello,
I have some issue with execute procedure with new certificate .
We have inside procedure WITH EXECUTE AS OWNER and is not working and got error The server principal "sa" is not able to access the database "CertDB2" under the current security context.
If I remove then I can execute without problem.
Problem is that we have another database with another certificate and there is working without problem and I cannot find why, because this is from past.
please anybody can help with this?
I will write code here for possible testing ..
Let me know if you will want more.
Thanks
use master
ALTER DATABASE [CertDB1] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
drop database [CertDB1]
ALTER DATABASE CertDB2 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
dROP database [CertDB2]
--created databases
EXECUTE AS LOGIN = 'sa'
CREATE DATABASE [CertDB1]
CREATE DATABASE [CertDB2]
----create cert in first DB
use [CertDB1]
CREATE CERTIFICATE CrossDBCert
ENCRYPTION BY PASSWORD = 'Privatekey'
WITH
SUBJECT = 'CrossDBCert'
, EXPIRY_DATE = '99991231'
---get binary for certificate and write to command below
use [CertDB1]
(SELECT CERTENCODED(CERT_ID('CrossDBCert')) AS PublicPortionBinary)
(SELECT CERTPRIVATEKEY
(
CERT_ID('CrossDBCert')
, 'EncryptionPwd' /* Encryption password */, 'Privatekey' /* Private key */) AS PrivateKeyBinary)
---- create certificate on second DB, use binaries from previous select
use [CertDB2]
declare @sql varchar(max)
CREATE CERTIFICATE CrossDBCert
FROM BINARY = 0x308202B63082019EA0030201020210363A5841A0267EA9470BB14B5890EF6B300D06092A864886F70D01010B05003016311430120603550403130B43726F73734442436572743020170D3232303731333134353734365A180F39393939313233313030303030305A3016311430120603550403130B43726F737344424365727430820122300D06092A864886F70D01010105000382010F003082010A0282010100CD5A07B753B36FFF74C0F82A428DB67819C310343F5B8106C860399827578EB378E7B62A520BCC7978A391A9019F86F40547136718EF4D97719D0DA6E6F5EF99BF2272F592D61EA2D90DA879DFB0E65D16B221F3D6093D6300FFAFDDBA21B39A69C1DD60F94F6457822104105A47F73F293AA4C19FFC044079D8A1E7F959C0039658E8155FFF2E9B6660BB91713D24BBEF09F14572D79BF4EB31B5763FC6E045A0508F57937FE29622DE993729847F29F75A4C28C6B3012AD7229690065518DB72FA478B57FAA62758A6BE1E8852DBF56CD172AF4A9611642860B60B7A13A292FB90703B6272E2145262C73970D51EF32E015A24629A356DAA3BED23B06063150203010001300D06092A864886F70D01010B0500038201010052F0D0EEF8484889EB8A7928AE0B62B9AAA0A1969656B8832F6D2AF2FB86FEC82D55440E2BE2F95520995DBD32D4484E3E7026B0C89C6D33F218527EEF3A0AEA7B067691A4C6AE13A87E9409EAEA08135E20601CA65E0679C48D34C5E072A5EAAC5796C58FAD749B29CB9AB2C9143FB0D47EA447B60CDD0B8E57ECD546EF167F0A4F857FA9F085342BE7DC7DD5189BF7BB31797F3339A82D18B2805750ED054B13DD0B098981B1C8C65710594376235AB62E141AEC3DD7FF0B185D9AFA981C3F0478B4B3D03B95919AE822BCDE6D19414DF3D05601C69486C23A19DF831C72692A223C71AD4914A77FBFC3F0AE2C71D67B6E3C7E178CEDB760B3AE04C6C555EC
WITH PRIVATE KEY
(
BINARY = 0x1EF1B5B0000000000100000001000000100000009404000029D83FA30714D5175D95FAD305B24B970702000000A40000A6478DDA6DC5EF03D0B615DADDFAB2C16784CFBDAC547D77C59F7E661E6AFC927876E52E4B861E6BB24F67EFD6693E385F9782285E1418AFCB46F26BC604F347E19B692F578B745BB31BB979FFFC173C15EA0324B7B1215161380750249EB93923EA77C09827776160E625B807AC1798AA4C37E55075C501066B663124707D12D63057FC011BADF744E498154561BF8A580267902FBD3B83A5EBB5796D1107E27AD8E521449CD8274F56629EC54272CAD4A53B5E65E65CB476E6865E1AA3721596F5689A6B7C9732D0727BF7ED20A45B1DDC103109A09AA50A55D1B403CE0B3E3937E236A3DF34E61772D02ECFC334BFD91FD96E2639E36237DC9B6987E6E44911C41552568203E8E2F1194255BC76CF60524238F3E05EBEE75A028392C04FC8A75B874E0D7214C12CC3E5ECFB2B023C4A918BB46CE8E150087E3675861D825FF724B5AD5761BF1906A77EF6969CA1A41C43C3C1255326E374BE0EB6D1A6B5F8CE5283702C917170CE1AF7C24DFEFC620FDA811F74B02CC98D78D7360BC593285F3C2BA63735CF59827A96D4ECD8D72244C6F53B984ED56BFF035C5651F0F280282BF0F7CAE3F6023BFD0F40672FB825AD5FAD2F1BAE76D77FD8CCCD597C507B05C0B7D3C48246950C6566D4F4C63F7664DA01ECD6E92C206D58E40BA72500357DDCFB3FD453F4B373AB396C6E0A615913C77D11148AB7706C5273AECC3E702F68F259B5A16980E7703CC678E9F68DCA5BDF6D7F597966C4ECBB5C996F9A387618960F613D050492AAC888BF4CADAB61744796F353398BA9A4165351D205545DBD1121BF41F84B93F11534BE7A4EAE90465D3AD84B1571207F364E8BEABD1B7237EC5E564592D3C4CD5464DD4580B8104876E6672572118EFAF4A4847ED0360EDBF7C5F42B57698A738BA66C239700F41D5E30D8212C5425CF731F96855D3BF5B466313592F9CC818A79076415841F6DF9EBA13933532FFB3D48D093378E7390F01F0CA1B8F4DF01063857AE8E9FFE9107BD51BF799B8C0927D8E335361ED93E53CED7486513471E5D6A1353D7FC9F93CEBFD70E349664F815EF2DCAEF925A8A5BAB15FB97DF710D85B26505EBAD35C97EE436EE50C40E893EC844F717047180088044E7602E3054122D4726F24EB088EF5BF7D7CDB55D64E8D38C95827A10659C5521C760152A57818F0F4ED01D04D49052C2B3AC3072DE5EC04151D86283A3B43C4C9A4BEC81E05744AE6C730EFB05D1DEFD9A2BE22DE5E34FF0024BBC220A2F0B9F58C32AA50E549132116710B406B6298B4FE6625F1F066EB0F44D504FD8DD38D1F3803C6444DC2169E453585554ED3B5C101DF3C07C65E9E31AB62C778B0B0696AB0F051B0C2528B5E21B9F9CD90E8009E49DEE656619052593CE3265603641C088FDCE3B1C1F82D3F7B2188DFF8AE16C4DF24EFEF5CB53264D89716900C2A132D798C6875FEF690A9DEEB2C55AFE7F81A3B85E0C4EF9C70B7EAC737839D9B3BA57B6836EF77EDE89941B577AC01B78F4729F473A24E5A270F5EBABF9CC3652C503EA51EFD7C167FF4ADA786AAECDF6FFBC50293479EB00F7358685BC17EDC79C58AA71FA87E62AF8AD186AB5A7C915475B343C811E2FA89596B3FAAC1DB58FF44FAF160654502A54E0
, DECRYPTION BY PASSWORD = 'EncryptionPwd' /* Decrypt using the same password from the previous step */, ENCRYPTION BY PASSWORD = 'Privatekey' /* You can set the same or new private key password */)
--create table in DB2
USE [CertDB2]
CREATE TABLE [dbo].[TableRead](
[id] [int] NULL,
[test] [nchar](10) NULL
) ON [PRIMARY]
INSERT INTO [TableRead] (id,test) values (1,'test1')
--create user from certificate
USE [CertDB2]
CREATE USER [CrossDBCertUser] FROM CERTIFICATE CrossDBCert
use [CertDB2]
GO
GRANT SELECT ON [dbo].[TableRead] TO [CrossDBCertUser]
GO
---create procedure in first DB1 for select to second
USE [CertDB1]
go
create or alter PROCEDURE [dbo].[ReadDB2]
WITH EXECUTE AS OWNER -- remove and add for testing issue
AS
BEGIN
SELECT
SUSER_NAME() AS serverLogin
, USER_NAME() AS dbUser
, ORIGINAL_LOGIN() AS originalLogin
SELECT
COUNT(*) FROM [CertDB2].dbo.[TableRead]
END
------------------------------------------------------
--add signature to procedure
ADD SIGNATURE TO [CertDB1].[dbo].[ReadDB2] BY CERTIFICATE CrossDBCert WITH PASSWORD = 'Privatekey' -- <- Password from PasswordSafe
--create login
use master
go
If not Exists (select loginname from master.dbo.syslogins
where name = 'TestCert' )
BEGIN
CREATE LOGIN TestCert WITH PASSWORD = 'TestCert'
END
GO
USE [CertDB1]
CREATE USER TestCert FROM LOGIN TestCert
GRANT EXECUTE ON [CertDB1].[dbo].[ReadDB2] TO TestCert
--testing
USE [CertDB1]
EXECUTE AS LOGIN = 'TestCert' /* Impersonating a Server principal *//* After impersonation */SELECT
SUSER_NAME() AS serverLogin
, USER_NAME() AS dbUser
, ORIGINAL_LOGIN() AS originalLogin
EXEC [CertDB1].[dbo].[ReadDB2]
REVERT -- end the impersonation
July 14, 2022 at 7:34 am
This was removed by the editor as SPAM
fixed with
use [CertDB2]
GO
GRANT AUTHENTICATE TO [CrossDBCertUser]
GO
Viewing 3 posts - 1 through 2 (of 2 total)
You must be logged in to reply to this topic. Login to reply