CREATE CERTIFICATE (Transact-SQL)

为 SQL Server 中的数据库添加证书。

适用范围:SQL Server(SQL Server 2008 到当前版本)。

主题链接图标 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> ) ] 
      }
    | { 
        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'

参数

  • 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 服务帐户的安全上下文中访问该文件。 该帐户必须具有所需的文件系统权限。

    备注

    此选项在包含数据库中不可用。

  • asn_encoded_certificate
    指定为二进制常量的 ASN 编码证书位。

  • BINARY =private_key_bits

    适用于:SQL Server 2012 到 SQL Server 2014。

    指定为二进制常量的专有键位。 这些位可采用加密形式。 如果加密,则用户必须提供解密密码。 不会对此密码执行密码策略检查。 私钥位应该采用 PVK 文件格式。

  • 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 位,最大长度为 4,096 位。 导入的私钥的长度必须是 64 位的整数倍。

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

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

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

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

备注

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

可以使用 CERTENCODED (Transact-SQL)CERTPRIVATEKEY (Transact-SQL) 函数创建证书的二进制描述。 有关使用 CERTPRIVATEKEY 和 CERTENCODED 将证书复制到其他数据库中的示例,请参阅主题 CERTENCODED (Transact-SQL) 中的示例 B。

权限

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

示例

A.创建自我签名的证书

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

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

B.通过文件创建证书

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

USE AdventureWorks2012;
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 AdventureWorks2012;
CREATE CERTIFICATE Shipping19 
    FROM EXECUTABLE FILE = 'c:\Shipping\Certs\Shipping19.dll';
GO

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

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

请参阅

参考

ALTER CERTIFICATE (Transact-SQL)

DROP CERTIFICATE (Transact-SQL)

BACKUP CERTIFICATE (Transact-SQL)

EVENTDATA (Transact-SQL)

CERTENCODED (Transact-SQL)

CERTPRIVATEKEY (Transact-SQL)

概念

加密层次结构