CREATE CERTIFICATE (Transact-SQL)

適用于:SQL Server (所有支援的版本) Azure SQL Database Azure SQL 受控執行個體 Azure Synapse Analytics

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

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

注意

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

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

主題連結圖示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 與更早版本的 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) Preview 和更新版本
指定從 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 (從 2012 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產生的私密金鑰長度為 1024 位到 2014 SQL Server 2014 (12.x) ,且從 2016 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) CERTPRI加值稅EKEY (Transact-SQL) 函式來建立憑證的二進位描述。 如需使用 CERTPRI加值稅EKEYCERTENCODED 將憑證複製到另一個資料庫的範例,請參閱 CERTENCODED (Transact-SQL) 一文中的範例 B。

MD2、MD4、MD5、SHA 和 SHA1 演算法在 SQL Server 2016 (13.x) 中已被取代。 最多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 不支援從檔案建立憑證。

重要

從 2017 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)