Инструкция CREATE CERTIFICATE (Transact-SQL)

Область применения:yesSQL Server (все поддерживаемые версии) YesБаза данных SQL Azure YesУправляемый экземпляр SQL Azure yesAzure Synapse Analytics

Добавляет сертификат в базу данных SQL Server.

Эта функция несовместима с экспортом базы данных с использованием платформы приложения уровня данных (DACFx). Необходимо удалить все сертификаты перед экспортом.

Примечание

В SQL Server 2022 можно создавать или восстанавливать резервные копии сертификатов с закрытыми ключами непосредственно в файлы или двоичные BLOB-объекты, а также из них, с помощью пар открытых ключей (PKCS) #12 или формата обмена личной информацией (PFX). Все создаваемые системой сертификаты в SQL Server 2022 имеют минимальную стойкость RSA-3072.

Формат PKCS #12 или PFX — это двоичный формат для хранения сертификата сервера, всех промежуточных сертификатов и закрытого ключа в одном файле. PFX-файлы обычно имеют такие расширения, как .pfx и .p12. Для клиентов это упрощает соблюдение текущих рекомендаций по обеспечению безопасности и стандартов соответствия требованиям, запрещающих шифрование RC4, устраняя необходимость использования таких средств преобразования, как PVKConverter (для формата PVK или DER).

Topic link iconСинтаксические обозначения в Transact-SQL

Примечание

Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.

Синтаксис

-- 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'  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

certificate_name
Имя сертификата в базе данных.

AUTHORIZATION user_name
Имя пользователя, которому принадлежит сертификат.

ASSEMBLY assembly_name
Указывает подписанную сборку, уже загруженную в базу данных.

[ EXECUTABLE ] FILE = 'path_to_file'
Указывает полный путь, включающий имя файла, к файлу, зашифрованному по правилам DER и содержащему сертификат. Если используется параметр EXECUTABLE, то файл является библиотекой DLL, заверенной с использованием данного сертификата. path_to_file может быть локальным путем или UNC-путем к расположению в сети. Доступ к файлу осуществляется в контексте безопасности учетной записи службы SQL Server. Эта учетная запись должна иметь соответствующие разрешения на доступ в файловой системе.

Важно!

База данных SQL Azure не поддерживает создание сертификата на основе файла или с использованием файлов закрытых ключей.

BINARY = asn_encoded_certificate
Биты закодированного в ASN сертификата, указанного в качестве двоичной константы.
Область применения: SQL Server 2012 (11.x) и более поздних версий.

WITH FORMAT = 'PFX'
Область применения: SQL Server 2022 и более поздние версии
Указывает на создание сертификата из PFX-файла. Это предложение является необязательным.

WITH PRIVATE KEY
Указывает, что закрытый ключ сертификата загружен в SQL Server. Это предложение действительно лишь в случае, когда сертификат создается из сборки. Для загрузки закрытого ключа сертификата, созданного из сборки, следует использовать команду ALTER CERTIFICATE.

FILE ='path_to_private_key'
Указывает полный путь к закрытому ключу, включая имя файла. path_to_private_key может быть локальным путем или UNC-путем к расположению в сети. Доступ к файлу осуществляется в контексте безопасности учетной записи службы SQL Server. Эта учетная запись должна иметь соответствующие разрешения на доступ в файловой системе.

Важно!

Этот параметр недоступен в автономной базе данных или в База данных SQL Azure.

BINARY = private_key_bits
Область применения: SQL Server (начиная с SQL Server 2012 (11.x)) и База данных SQL Azure.

Биты закрытого ключа, указанного в качестве двоичной константы. Биты могут находиться в зашифрованном виде. Если они зашифрованы, пользователь должен предоставить пароль для расшифровки. Проверка политики паролей для данного пароля не выполняется. Биты закрытого ключа должны быть в формате файла PVK.

DECRYPTION BY PASSWORD = 'key_password'
Указывает пароль, необходимый для расшифровки закрытого ключа, получаемого из файла. Это предложение необязательно, если закрытый ключ защищен пустым паролем. Не рекомендуется сохранять закрытый ключ в файл без защиты паролем. Если требуется ввод пароля, но верный пароль не указан, выполнение инструкции завершится ошибкой.

ENCRYPTION BY PASSWORD = 'пароль'
Указывает пароль для шифрования закрытого ключа. Этот аргумент нужно использовать лишь в том случае, если необходимо зашифровать сертификат с помощью пароля. Если аргумент опущен, закрытый ключ шифруется с использованием главного ключа базы данных. password должен соответствовать требованиям политики паролей Windows применительно к компьютеру, на котором запущен экземпляр SQL Server. Дополнительные сведения см. в разделе Политика паролей.

SUBJECT = 'certificate_subject_name'
Термин subject (субъект) относится к полю в метаданных сертификата, определяемому стандартом X.509. Длина субъекта не должна превышать 64 символов, и это ограничение действует для SQL Server в Linux. Для SQL Server в 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, имеют длину 1024 бит до SQL Server 2014 (12.x), и 2048 бит, начиная с SQL Server 2016 (13.x);. Закрытые ключи, импортированные из внешнего источника, имеют минимальную длину в 384 бит и максимальную длину в 4 096 бит. Длина импортируемого закрытого ключа должна быть кратной 64 бит. Для сертификатов, используемых для прозрачного шифрования данных, размер закрытого ключа ограничен 3456 битами.

Сохраняется весь серийный номер сертификата, но в представлении каталога sys.certificates отображаются только первые 16 байт.

Сохраняется все поле издателя, но в представлении каталога sys.certificates отображаются только первые 884 байта.

Закрытый ключ должен соответствовать открытому ключу, заданному аргументом certificate_name.

При создании сертификата из контейнера загрузка закрытого ключа необязательна. Однако в случае, когда SQL Server создает самостоятельно подписанный сертификат, закрытый ключ создается всегда. По умолчанию закрытый ключ шифруется главным ключом базы данных. Если главного ключа базы данных не существует, а пароль не указан, при выполнении инструкции произойдет сбой.

Параметр ENCRYPTION BY PASSWORD не требуется, если закрытый ключ зашифрован главным ключом базы данных. Использовать этот параметр следует лишь тогда, когда закрытый ключ будет зашифрован паролем. Если пароль не указан, закрытый ключ будет зашифрован с использованием главного ключа базы данных. Если главный ключ базы данных не может быть открыт, пропуск этого предложения вызовет ошибку.

Если закрытый ключ зашифрован главным ключом базы данных, указывать пароль расшифровки не требуется.

Примечание

Встроенные функции шифрования и цифровой подписи не проверяют даты истечения срока действия сертификатов. Пользователи этих функций должны самостоятельно определять, когда следует проверять сроки действия сертификатов.

Двоичное описание сертификата можно создать с помощью функций CERTENCODED (Transact-SQL) и CERTPRIVATEKEY (Transact-SQL). Пример использования функций CERTPRIVATEKEY и CERTENCODED для копирования сертификата в другую базу данных см. в примере Б в руководстве по использованию CERTENCODED в Transact-SQL.

Алгоритмы 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  

Б. Создание сертификата из файла

В следующем примере будет создан сертификат в базе данных путем загрузки пары ключей из файлов.

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   

Важно!

База данных SQL Azure не поддерживает создание сертификата на основе файла.

В. Создание сертификата из заверенного исполняемого файла

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  

Важно!

База данных SQL Azure не поддерживает создание сертификата на основе файла.

Важно!

Начиная с версии SQL Server 2017 (14.x); параметр конфигурации сервера CLR strict security запрещает загрузку сборок без предварительной настройки безопасности для них. Загрузить сертификат, создайте имя входа из него, предоставьте UNSAFE ASSEMBLY для этого имени входа и затем загрузите сборку.

Г. Создание самозаверяющего сертификата

В следующем примере создается сертификат Shipping04 без указания пароля шифрования. Этот пример можно использовать с Система платформы аналитики (PDW).

CREATE CERTIFICATE Shipping04   
   WITH SUBJECT = 'Sammamish Shipping Records';  
GO  

Д. Создание сертификата из 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)