CREATE CERTIFICATE (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 = 'mm/dd/yyyy' | EXPIRY_DATE = 'mm/dd/yyyy'
参数
- 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
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'
指定将用于对私钥进行加密的密码。只有在需要使用密码对证书进行加密时,才使用该选项。如果省略该子句,则使用数据库主密钥对私钥进行加密。密码必须符合密码复杂性策略。有关详细信息,请参阅密码策略。
- SUBJECT = 'certificate_subject_name'
根据 X.509 标准中的定义,术语“主题**”是指证书的元数据中的字段。主题的长度最多是 128 个字符。将主题存储到目录中时,如果主题的长度超过 128 个字符,则主题会被截断,但是包含证书的二进制大型对象 (BLOB) 将保留完整的主题名称。
- START_DATE ='mm/dd/yyyy'
证书生效的日期。如果未指定,则将 START_DATE 设置为当前日期。
- EXPIRY_DATE ='mm/dd/yyyy'
证书过期的日期。如果未指定,则将 EXPIRY_DATE 设置为 START_DATE 一年之后的日期。
- 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 选项。只有在使用密码对私钥进行加密时,才使用该选项。如果未指定密码,则使用数据库主密钥对证书的私钥进行加密。如果数据库主密钥无法打开,则省略该子句会导致错误。
如果使用数据库主密钥对私钥进行加密,则不一定必须指定解密密码。
注意: |
---|
内置的加密和签名功能不会检查证书的过期日期。使用这些功能的用户必须决定何时检查证书的过期日期。 |
使用 START_DATE 和 EXPIRY_DATE 参数无法指定这些日期中的具体时间。但是,可以使用 SQL Server 提供的日期和时间函数来指定证书起始日期和过期日期中的具体时间。有关详细信息,请参阅以下主题:
权限
要求对数据库具有 CREATE CERTIFICATE 权限。
示例
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
请参阅
参考
ALTER CERTIFICATE (Transact-SQL)
DROP CERTIFICATE (Transact-SQL)
BACKUP CERTIFICATE (Transact-SQL)
EVENTDATA (Transact-SQL)