CREATE CERTIFICATE (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL Server のデータベースに証明書を追加します。
この機能は、データ層アプリケーション フレームワーク (DACFx) を使用してデータベースのエクスポートとの互換性はありません。 エクスポートする前に、すべての証明書を削除する必要があります。
注意
SQL Server 2022 (16.x) では、公開キー ペア (PKCS) #12 または個人情報交換 (PFX) 形式を使って、ファイルまたはバイナリ BLOB との間で直接、秘密キーを含む証明書をバックアップまたは復元できます。 SQL Server 2022 (16.x) でシステムによって生成されたすべての証明書には、RSA-3072 の最小の強度が含まれます。
PKCS #12 または PFX 形式は、サーバー証明書、中間証明書、秘密キーを 1 つのファイルに格納するためのバイナリ形式です。 通常、PFX ファイルには .pfx
や .p12
のような拡張子が付きます。 これにより、お客様は (PVK または DER 形式に対する) PVKConverter などの変換ツールを使用する必要がなくなるため、RC4 暗号化を禁止する最新のセキュリティ上のベスト プラクティス ガイドラインとコンプライアンス標準に準拠しやすくなります。
注意
この構文は、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 [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'
Note
SQL Server 2014 (12.x) 以前のバージョンの 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 データベース では、ファイルからの証明書の作成や秘密キー ファイルの使用はサポートされません。
BINARY = asn_encoded_certificate
バイナリ定数として指定された、ASN でエンコードされた証明書バイト。
適用対象: SQL Server 2012 (11.x) 以降。
WITH FORMAT = 'PFX'
適用対象: SQL Server 2022 (16.x) 以降
PFX ファイルから証明書を生成することを指定します。 この句は省略可能です。
WITH PRIVATE KEY
証明書の秘密キーを SQL Server に読み込むように指定します。 この句は、アセンブリから証明書を作成する場合には無効です。 アセンブリから作成された証明書の秘密キーを読み込むには、ALTER CERTIFICATE を使用します。
FILE ='path_to_private_key'
秘密キーへの完全なパスを、ファイル名を含めて指定します。 path_to_private_key には、ローカル パスまたはネットワーク上の場所を示す UNC パスを指定できます。 ファイルには、SQL Server サービス アカウントのセキュリティ コンテキストでアクセスします。 このアカウントは、ファイル システムで必要となる権限を保持している必要があります。
重要
このオプションは、包含データベースまたは Azure SQL データベース では使用できません。
BINARY = private_key_bits
適用対象:SQL Server (開始値 SQL Server 2012 (11.x)) および Azure SQL データベース。
バイナリ定数として指定された秘密キーのビット。 これらのビットは暗号化された形式でもかまいません。 暗号化されている場合は、ユーザーは暗号化解除パスワードを指定する必要があります。 パスワード ポリシーのチェックは、このパスワードに対しては実行されません。 秘密キーのビットは PVK ファイル形式にする必要があります。
DECRYPTION BY PASSWORD = 'key_password'
ファイルから取得する秘密キーの暗号化解除に必要なパスワードを指定します。 秘密キーが NULL パスワードで保護されている場合、この句は省略可能です。 パスワード保護なしで秘密キーをファイルに保存することはお勧めしません。 パスワードが必要な場合にパスワードを指定しない場合、ステートメントは失敗します。
ENCRYPTION BY PASSWORD = 'password'
秘密キーの暗号化に使用するパスワードを指定します。 このオプションは、証明書をパスワードで暗号化する場合にのみ使用します。 この句を省略した場合、秘密キーはデータベースのマスター キーで暗号化されます。 password は、Windows のパスワード ポリシーが SQL Server のインスタンスを実行するコンピューターに要求する条件を満足する必要があります。 詳細については、「 Password Policy」をご参照ください。
SUBJECT = 'certificate_subject_name'
"サブジェクト" という用語は、X.509 標準で定義されている、証明書のメタデータ内にあるフィールドを指します。 Linux 上の SQL Server の場合、サブジェクトは半角 64 文字以下の長さでなければなりません。 Windows 上の SQL Server の場合は、サブジェクトは半角 128 文字まで設定できます。 128 文字を超えた場合、サブジェクトはカタログに格納されるときには切り捨てられますが、証明書を含むバイナリ ラージ オブジェクト (BLOB) では、完全なサブジェクト名が保持されます。
START_DATE = 'datetime'
証明書が有効となる日付を指定します。 指定しない場合、START_DATE は現在の日付に設定されます。 START_DATE は UTC 時刻で、日時に変換可能な任意の形式で指定できます。
EXPIRY_DATE = 'datetime'
証明書が期限切れとなる日付を指定します。 指定しない場合、EXPIRY_DATE は START_DATE の 1 年後の日付に設定されます。 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 によって生成される秘密キーの長さは、SQL Server 2014 (12.x) までは 1024 ビット、SQL Server 2016 (13.x) 以降は 2048 ビットです。 外部ソースからインポートされる秘密キーの最小の長さは 384 ビットで、最大の長さは 4,096 ビットです。 インポートされる秘密キーの長さは、64 ビットの整数倍であることが必要です。 TDE に使用される証明書では、秘密キーのサイズが 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)」の例 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 データベース では、ファイルからの証明書の作成はサポートされません。
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 データベース では、ファイルからの証明書の作成はサポートされません。
重要
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
E. 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)