CREATE CERTIFICATE (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse Analytics

將憑證新增至 SQL Server 資料庫中。

此功能與使用資料層應用程式架構 (DACFx) 的資料庫匯出不相容。 您必須在匯出之前先卸除所有憑證。

注意

在 SQL Server 2022 (16.x) 中,可以使用公開金鑰組 (PKCS) #12 或個人資訊交換 (PFX) 格式,直接從檔案或二進位 Blob 備份或還原具有私密金鑰的憑證。 所有系統產生的憑證在 SQL Server 2022 (16.x) 中具有 RSA-3072 的最低強度。

PKCS #12 或 PFX 格式是二進位格式,用於將伺服器憑證、任何中繼憑證和私密金鑰儲存在一個檔案中。 PFX 檔案通常會有 .pfx.p12 等副檔名。 這可讓客戶更輕鬆地遵守目前的安全性最佳做法指導方針和禁止 RC4 加密的合規性標準,因為不需要使用 PVKConverter 之類的轉換工具 (針對 PVK 或 DER 格式)。

Transact-SQL 語法慣例

注意

Azure Synapse Analytics 的無伺服器 SQL 集區不支援此語法。

Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
CREATE CERTIFICATE certificate_name [ AUTHORIZATION user_name ]   
    { FROM <existing_keys> | <generate_new_keys> }  
    [ ACTIVE FOR BEGIN_DIALOG = { ON | OFF } ]  
  
<existing_keys> ::=   
    ASSEMBLY assembly_name  
    | {   
        [ EXECUTABLE ] FILE = 'path_to_file'  
        [ WITH [FORMAT = 'PFX',]
          PRIVATE KEY ( <private_key_options> ) ]   
      }  
    | {   
        BINARY = asn_encoded_certificate  
        [ WITH PRIVATE KEY ( <private_key_options> ) ]  
      }  
<generate_new_keys> ::=   
    [ ENCRYPTION BY PASSWORD = 'password' ]   
    WITH SUBJECT = 'certificate_subject_name'   
    [ , <date_options> [ ,...n ] ]   
  
<private_key_options> ::=  
      {   
        FILE = 'path_to_private_key'  
         [ , DECRYPTION BY PASSWORD = 'password' ]  
         [ , ENCRYPTION BY PASSWORD = 'password' ]    
      }  
    |  
      {   
        BINARY = private_key_bits  
         [ , DECRYPTION BY PASSWORD = 'password' ]  
         [ , ENCRYPTION BY PASSWORD = 'password' ]    
      }  
  
<date_options> ::=  
    START_DATE = 'datetime' | EXPIRY_DATE = 'datetime'  
-- Syntax for Parallel Data Warehouse  
  
CREATE CERTIFICATE certificate_name   
    { <generate_new_keys> | FROM <existing_keys> }  
    [ ; ]  
  
<generate_new_keys> ::=   
    WITH SUBJECT = 'certificate_subject_name'   
    [ , <date_options> [ ,...n ] ]   
  
<existing_keys> ::=   
    {   
      FILE ='path_to_file'  
      WITH PRIVATE KEY   
         (   
           FILE = 'path_to_private_key'  
           , DECRYPTION BY PASSWORD ='password'   
         )  
    }  
  
<date_options> ::=  
    START_DATE ='datetime' | EXPIRY_DATE ='datetime'  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

certificate_name
為資料庫憑證的名稱。

AUTHORIZATION user_name
為擁有此憑證的使用者名稱。

ASSEMBLY assembly_name
指定已載入資料庫中之簽署的組件。

[ EXECUTABLE ] FILE = 'path_to_file'
指定包含憑證之 DER 編碼檔案的完整路徑,包括檔案名稱。 如有使用 EXECUTABLE 選項,該檔案即是已經過憑證簽署的 DLL。 path_to_file 可以是本機路徑或通往網路位置的 UNC 路徑。 您可在 SQL Server 服務帳戶的安全性內容中存取這個檔案。 這個帳戶必須有所需的檔案系統權限。

重要

Azure SQL Database 不支援從檔案或使用私密金鑰檔案建立憑證。

BINARY = asn_encoded_certificate
指定為二進位常數的 ASN 編碼憑證位元組。
適用於:SQL Server 2012 (11.x) 和更新版本。

WITH FORMAT = 'PFX'
適用於:SQL Server 2022 (16.x) 和更新版本
指定從 PFX 檔案產生憑證。 此子句是選擇性子句。

WITH PRIVATE KEY
指定憑證的私密金鑰必須載入 SQL Server 中。 從組件建立憑證時,這個子句無效。 若要載入從組件所建立憑證的私密金鑰,請使用 ALTER CERTIFICATE

FILE ='path_to_private_key'
指定通往私密金鑰的完整路徑 (包括檔案名稱)。 path_to_private_key 可以是本機路徑或通往網路位置的 UNC 路徑。 您可在 SQL Server 服務帳戶的安全性內容中存取這個檔案。 這個帳戶必須有必要的檔案系統權限。

重要

此選項在自主資料庫或 Azure SQL Database 中無法使用。

BINARY = private_key_bits
適用於:SQL Server (從 SQL Server 2012 (11.x) 開始) 與 Azure SQL Database。

指定為二進位常數的私密金鑰位元。 這些位元可以是加密形式。 如果加密的話,使用者必須提供解密密碼。 不會針對這個密碼執行密碼原則檢查。 私密金鑰位元應該採用 PVK 檔案格式。

DECRYPTION BY PASSWORD = 'key_password'
指定解密從檔案擷取的私密金鑰時所需的密碼。 如果私密金鑰由 Null 密碼保護,則這個子句是選擇性的。 建議您不要將私密金鑰儲存至一個沒有密碼保護的檔案。 如果需要密碼但並未指定,則陳述式會失敗。

ENCRYPTION BY PASSWORD = 'password'
指定用來加密私密金鑰的密碼。 請只在您要利用密碼來加密憑證時才使用這個選項。 如果省略這個子句,則會使用資料庫主要金鑰加密此私密金鑰。 password 必須符合執行 SQL Server 執行個體的電腦的 Windows 密碼原則需求。 如需詳細資訊,請參閱< Password Policy>。

SUBJECT = 'certificate_subject_name'
「主旨」一詞是指憑證中繼資料的欄位,如 X.509 標準所定義。 主旨不應超過 64 個字元,並會對 Linux 上的 SQL Server 強制執行這項限制。 若是 Windows 上的 SQL Server,主旨長度最多可達 128 個字元。 超過 128 個字元的主旨在儲存至目錄時會被截斷,但包含憑證的二進位大型物件 (BLOB) 會保留完整的主旨名稱。

START_DATE = 'datetime'
這是憑證生效的日期。 若未指定,會將 START_DATE 設為等於目前的日期。 START_DATE 為 UTC 時間,可以用任何可轉換成日期和時間的格式指定。

EXPIRY_DATE = 'datetime'
這是憑證到期的日期。 若未指定,會將 EXPIRY_DATE 設為 START_DATE 之後一年的日期。 EXPIRY_DATE 為 UTC 時間,可以用任何可轉換成日期和時間的格式指定。 SQL Server Service Broker 會檢查到期日。 使用憑證進行加密的備份也會檢查到期日,而且將不會允許使用已過期憑證來建立新備份,但將會允許使用已過期的憑證來還原。 不過當憑證用於資料庫加密或 Always Encrypted 時,不會強制執行到期設定。

ACTIVE FOR BEGIN_DIALOG = { ON | OFF }
讓 Service Broker 對話交談的起始端能夠使用該憑證。 預設值是 ON。

備註

憑證是遵照 X.509 標準及支援 X.509 V1 欄位的資料庫層級安全性實體。 CREATE CERTIFICATE 可以從檔案、二進位常數或組件載入憑證。 這個陳述式也可以產生金鑰組及建立自簽憑證。

私密金鑰必須為 <= 2500 位元組的加密格式。 SQL Server 到 SQL Server 2014 (12.x) 所產生的私密金鑰長度為 1024 位元,從 SQL Server 2016 (13.x) 開始為 2048 位元。 從外部來源匯入的私密金鑰,其最小長度為 384 個位元,其最大長度為 4,096 個位元。 匯入的私密金鑰,其長度必須為 64 個位元的整數倍。 用於 TDE 的憑證限制在 3456 位元的私密金鑰大小。

系統會儲存憑證的完整「序號」,但只有前 16 個位元組會出現在 sys.certificates 目錄檢視中。

系統會儲存憑證的完整「簽發者」欄位,但只有前 884 個位元組會出現在 sys.certificates 目錄檢視中。

私密金鑰必須對應至 certificate_name 所指定的公開金鑰。

當您從容器建立憑證時,載入私密金鑰是選擇性的。 但是當 SQL Server 產生自簽憑證時,永遠會建立私密金鑰。 依預設,私密金鑰是利用資料庫主要金鑰來加密的。 如果資料庫主要金鑰不存在且未指定密碼,則陳述式會失敗。

若是使用資料庫主要金鑰來加密私密金鑰,則不需要 ENCRYPTION BY PASSWORD 選項。 只有要使用密碼加密私密金鑰時,才使用這個選項。 如果未指定密碼,則會利用資料庫主要金鑰加密憑證的私密金鑰。 如果無法開啟資料庫的主要金鑰,省略這個子句時會造成錯誤。

如果是利用資料庫主要金鑰加密私密金鑰,就不必指定解密密碼。

注意

用於加密及簽署的內建函數不會檢查憑證的到期日期。 這些函數的使用者必須決定何時檢查憑證到期日期。

您可以使用 CERTENCODED (Transact-SQL)CERTPRIVATEKEY (Transact-SQL) 函式來建立憑證的二進位描述。 如需使用 CERTPRIVATEKEYCERTENCODED 將憑證複製到其他資料庫的範例,請參閱 CERTENCODED (Transact-SQL) 一文中的範例 B。

SQL Server 2016 (13.x) 中已淘汰 MD2、MD4、MD5、SHA 和 SHA1 演算法。 在 SQL Server 2016 (13.x) 之前,會使用 SHA1 建立自我簽署憑證。 從 SQL Server 2017 (14.x) 開始,會使用 SHA2_256 建立自我簽署憑證。

權限

需要資料庫的 CREATE CERTIFICATE 權限。 只有 Windows 登入、SQL Server 登入,以及應用程式角色可以擁有憑證。 群組和角色無法擁有憑證。

範例

A. 建立自我簽署憑證

下列範例會建立一個稱為 Shipping04 的憑證。 這個憑證的私密金鑰是利用密碼來保護的。

CREATE CERTIFICATE Shipping04   
   ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'  
   WITH SUBJECT = 'Sammamish Shipping Records',   
   EXPIRY_DATE = '20201031';  
GO  

B. 從檔案建立憑證

下列範例在資料庫中建立憑證,並從檔案載入金鑰組。

CREATE CERTIFICATE Shipping11   
    FROM FILE = 'c:\Shipping\Certs\Shipping11.cer'   
    WITH PRIVATE KEY (FILE = 'c:\Shipping\Certs\Shipping11.pvk',   
    DECRYPTION BY PASSWORD = 'sldkflk34et6gs%53#v00');  
GO   

重要

Azure SQL Database 不支援從檔案建立憑證。

C. 從簽署的可執行檔建立憑證

CREATE CERTIFICATE Shipping19   
    FROM EXECUTABLE FILE = 'c:\Shipping\Certs\Shipping19.dll';  
GO  

另外,您也可以從 dll 檔建立組件,然後從該組件建立憑證。

CREATE ASSEMBLY Shipping19   
    FROM 'c:\Shipping\Certs\Shipping19.dll'   
    WITH PERMISSION_SET = SAFE;  
GO  
CREATE CERTIFICATE Shipping19 FROM ASSEMBLY Shipping19;  
GO  

重要

Azure SQL Database 不支援從檔案建立憑證。

重要

從 SQL Server 2017 (14.x) 開始,'CLR strict security' 伺服器組態選項可防止在未先為其設定安全性的情況下載入組件。 請載入憑證,從中建立登入,向該登入授與 UNSAFE ASSEMBLY,然後載入組件。

D. 建立自我簽署憑證

下列範例會建立稱為 Shipping04 的憑證,而不指定加密密碼。 此範例可與 Analytics Platform System (PDW) 搭配使用。

CREATE CERTIFICATE Shipping04   
   WITH SUBJECT = 'Sammamish Shipping Records';  
GO  

E. 從 PFX 檔案建立憑證

CREATE CERTIFICATE Shipping04
    FROM FILE = 'c:\storedcerts\shipping04cert.pfx'
    WITH 
    FORMAT = 'PFX', 
	PRIVATE KEY (
        DECRYPTION BY PASSWORD = '9n34khUbhk$w4ecJH5gh'
	);  

另請參閱

ALTER CERTIFICATE (Transact-SQL)
DROP CERTIFICATE (Transact-SQL)
BACKUP CERTIFICATE (Transact-SQL)
加密階層
EVENTDATA (Transact-SQL)
CERTENCODED (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
CERT_ID (Transact-SQL)
CERTPROPERTY (Transact-SQL)