CREATE CERTIFICATE (Transact-SQL)

向数据库中添加证书。

主题链接图标Transact-SQL 语法约定

语法

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> ) ] 
      }
        
<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' ]  

<date_options> ::=
    START_DATE ='datetime' | EXPIRY_DATE ='datetime'

参数

  • certificate_name
    证书在数据库中所使用的名称。

  • AUTHORIZATION user_name
    将拥有该证书的用户的名称。

  • ASSEMBLY assembly_name
    指定已经加载到数据库中的已签名的程序集。

  • [ EXECUTABLE ] FILE ='path_to_file'
    指定包含证书的 DER 编码文件的完整路径(包括文件名)。如果使用 EXECUTABLE 选项,则文件为已使用证书签名的 DLL。path_to_file 可以是本地路径,也可以是网络位置的 UNC 路径。将在 SQL Server 服务帐户的安全上下文中访问该文件。该帐户必须具有所需的文件系统权限。

  • WITH PRIVATE KEY
    指定将证书的私钥加载到 SQL Server 中。该子句只有在通过文件创建证书时才有效。若要加载程序集的私钥,请使用 ALTER CERTIFICATE

  • FILE ='path_to_private_key'
    指定私钥的完整路径(包括文件名)。path_to_private_key 可以是本地路径,也可以是网络位置的 UNC 路径。将在 SQL Server 服务帐户的安全上下文中访问该文件。该帐户必须具有必需的文件系统权限。

  • DECRYPTION BY PASSWORD = 'key_password'
    指定对从文件中检索的私钥进行解密所需的密码。如果私钥受空密码的保护,则该子句为可选项。建议不要将私钥保存到无密码保护的文件中。如果需要密码,但是未指定密码,则该语句将失败。

  • ENCRYPTION BY PASSWORD ='password'
    指定将用于对私钥进行加密的密码。只有在需要使用密码对证书进行加密时,才使用该选项。如果省略该子句,则使用数据库主密钥对私钥进行加密。password 必须符合运行 SQL Server 实例的计算机的 Windows 密码策略要求。有关详细信息,请参阅 密码策略

  • SUBJECT = 'certificate_subject_name'
    根据 X.509 标准中的定义,术语“主题”是指证书的元数据中的字段。主题的长度最多是 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 会检查过期日期;但是,在将证书用于加密时,不会强制应用过期日期。

  • ACTIVE FOR BEGIN_DIALOG = { ON | OFF }
    使证书可用于 Service Broker 对话会话的发起方。默认值为 ON。

注释

证书是一个数据库级的安全对象,它遵循 X.509 标准并支持 X.509 V1 字段。CREATE CERTIFICATE 可以通过文件或程序集加载证书。该语句也可生成密钥对并创建自我签名的证书。

SQL Server 生成的私钥的长度为 1024 位。从外部源导入的私钥的最小长度为 384 位,最大长度为 3,456 位。导入的私钥的长度必须是 64 位的整数倍。

私钥必须与 certificate_name 指定的公钥相对应。

当您通过容器创建证书时,可选择是否加载私钥。但是当 SQL Server 生成自我签名的证书时,始终会创建私钥。默认情况下,私钥使用数据库主密钥进行加密。如果数据库主密钥不存在并且未指定密码,则该语句将失败。

当使用数据库主密钥对私钥进行加密时,不需要 ENCRYPTION BY PASSWORD 选项。只有在使用密码对私钥进行加密时,才使用该选项。如果未指定密码,则使用数据库主密钥对证书的私钥进行加密。如果数据库主密钥无法打开,则省略该子句会导致错误。

如果使用数据库主密钥对私钥进行加密,则不一定必须指定解密密码。

注意注意

内置的加密和签名功能不会检查证书的过期日期。使用这些功能的用户必须决定何时检查证书的过期日期。

权限

要求对数据库具有 CREATE CERTIFICATE 权限。只有 Windows 登录名、SQL Server 登录名和应用程序角色才能拥有证书。其他组和角色不能拥有证书。

示例

A. 创建自我签名的证书

下面的示例创建名为 Shipping04 的证书。该证书的私钥是使用一个密码来保护的。

USE AdventureWorks;
CREATE CERTIFICATE Shipping04 
   ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
   WITH SUBJECT = 'Sammamish Shipping Records', 
   EXPIRY_DATE = '10/31/2009';
GO

B. 通过文件创建证书

以下示例在数据库中创建证书,并从文件加载密钥对。

USE AdventureWorks;
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 

C. 通过已签名的可执行文件创建证书

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

或者,您还可以先通过 dll 文件创建程序集,然后通过程序集创建证书。

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