CREATE CERTIFICATE (Transact-SQL)

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

將憑證加入至 SQL Server 資料庫中。

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

主題連結圖示 Transact-SQL 語法慣例

注意

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

語法

-- 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 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 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 個字元,並會對 SQL Server on Linux 強制執行這項限制。 若是 SQL Server on Windows,主旨長度最多可達 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 2014 (12.x) 止,SQL Server 產生的私密金鑰長度為 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  

另請參閱

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)