Sql-Server

還原證書時 Docker SQL Server 2017 中的權限問題

  • October 2, 2019

Docker SQL Server 2017 容器 @latest。使用master數據庫。

我面臨的錯誤如下:

[S00019][15208] The certificate, asymmetric key, or private key file is not valid or does not exist; or you do not have permissions for it.

我發現最接近這個確切問題的是Stackoverflow 上的這個問題。但是,答案對我不起作用。這個問題也有類似的答案。

我也嘗試過這里這裡的說明。

因此,通過錯誤的部分:

  1. 我已經重新創建了兩次文件,所以我不認為這是“無效”部分。這顯然不是“不存在”部分(如果我輸入了錯誤的密碼,它會告訴我這是錯誤的密碼)。
  2. 我已經備份並恢復了 SMK 和 Master Key 沒有問題,所以我不認為這是權限問題。這些文件具有完全相同的權限。

無論我嘗試什麼,我都無法恢復證書。我搜尋了GitHub 問題無濟於事,所以我不認為這是一個錯誤。我一定做錯了什麼。

相關程式碼:

--on Prod
BACKUP CERTIFICATE sqlserver_backup_cert
TO FILE = '/var/opt/mssql/certs/sqlserver_backup_cert.cer'
WITH PRIVATE KEY (
   FILE = '/var/opt/mssql/certs/sqlserver_backup_cert.key',
   ENCRYPTION BY PASSWORD = 'foobar'
   )
--on Test
CREATE CERTIFICATE sqlserver_backup_cert
FROM FILE = '/var/opt/mssql/certs/sqlserver_backup_cert.crt'
WITH PRIVATE KEY (
   FILE = '/var/opt/mssql/certs/sqlserver_backup_cert.key',
   DECRYPTION BY PASSWORD = 'foobar'
   )

值得注意的/var/opt/mssql/certs是 Docker 卷。但是,我也嘗試在容器內創建自己的目錄並使用docker cp. 不用找了。

“相關程式碼:”下顯示的程式碼(在問題中)是否是正在執行的確切程式碼,如複製並粘貼到此處而不是重新輸入?我問是因為sqlserver_backup_cert文件上的文件副檔名在BACKUPCREATE(即恢復)語句之間是不同的。它作為.cer備份,但隨後您在 .crt中尋找**.crt**CREATE

另外,您是否嘗試過完全跳過文件並使用十六進製字節(即VARBINARY文字)?您將執行以下操作:

在生產

SELECT CERTENCODED(CERT_ID(N'sqlserver_backup_cert')) AS [CertificateAndPublicKey],
      CERTPRIVATEKEY(CERT_ID(N'PrivateKeyTest'),
                     'new_password_for_extract(A)',
                     'current_password(B)') AS [PrivateKey];

測試中

CREATE CERTIFICATE [sqlserver_backup_cert]
   FROM BINARY = {output of CERTENCODED}
   WITH PRIVATE KEY (
       BINARY = {output of CERTPRIVATEKEY},
                DECRYPTION BY PASSWORD = 'new_password_for_extract(A)',
                ENCRYPTION BY PASSWORD = 'current_password(B)'
                    );

更新

OP 已確認問題確實是文件副檔名不匹配。

引用自:https://dba.stackexchange.com/questions/249327