1

これは2日間私を悩ませています。EXTERNAL_ACCESS を必要とする CLR sp があります。TRUSTWORTHY ON を設定することで、VS2010 経由で開発ボックスにデプロイできますが、運用サーバーにはそれを実行したくありません。AuthentiCode と互換性のある証明書を購入し、それを使用してアセンブリに署名しようとしましたが、チェーンが原因で失敗したため、ここで説明されている手順に従って証明書からチェーンを削除しました

次に、VS でアセンブリに署名しようとしましたが、「存在しないトークンを参照しようとしました」というエラーが表示されました。

コマンドラインに移動し、いくつかのブロガーが推奨しているように、SignTool.exe を使用してチェーン解除された証明書でアセンブリに署名しました。ユーティリティは、署名が成功したことを報告します。

次に、開発ボックスの SQL Server (express 2008R2) にアセンブリをインポートします。この手順は運用サーバーに適用する必要があるため、最初に TRUSTWORTHY をオフに設定します。それから私は走ります

   CREATE ASSEMBLY SqlClrProcedures from 'c:\<snip>\SqlClrProcedures.dll'
   WITH PERMISSION_SET = EXTERNAL_ACCESS

これにより、次のエラーが発生します: *アセンブリ 'SqlClrProcedures' の CREATE ASSEMBLY が失敗しました。アセンブリは、次のいずれかに該当する場合に承認されます。データベース所有者 (DBO) に EXTERNAL ACCESS ASSEMBLY 権限があり、データベースに TRUSTWORTHY データベース プロパティがオンになっている。または、アセンブリは、EXTERNAL ACCESS ASSEMBLY アクセス許可を持つ対応するログインを持つ証明書または非対称キーで署名されています。

saでログインしました。ユーザーを作成し、データベースの所有権を割り当て、外部アクセスを許可します。

GRANT EXTERNAL ACCESS Assembly to ClrLogin

それから試してください

CREATE ASSEMBLY SqlClrProcedures AUTHORIZATION ClrLogin from 'c:\<snip>\SqlClrProcedures.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS

上記と同じエラーが発生します。

dbo には EXTERNAL ACCESS ASSEMBLY が付与されており、アセンブリは署名されていますが、対応するログインに関する部分がわかりません。証明書にログインする必要がありますか?

CREATE ASSEMBLY を通過するためだけに TRUSTWORTHY ON を設定すると、アセンブリは正常にインポートされますが、sp を実行すると次のエラーが発生します。

An error occurred in the Microsoft .NET Framework while trying to load assembly id 65573. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: 
System.IO.FileLoadException: Could not load file or assembly 'sqlclrprocedures, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An error relating to security occurred. (Exception from HRESULT: 0x8013150A)
System.IO.FileLoadException: 
   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)

そのため、証明書が認識されていないようです。誰かが私が間違っていることを教えてもらえますか?

4

2 に答える 2

1
  1. に設定するTRUSTWORTHY 必要OFFがあります。詳細については、私の投稿を参照してください: PLEASE, Please, Please Stop Using Impersonation, TRUSTWORTHY, and Cross-DB Ownership Chaining

  2. Visual Studio でアセンブリに署名することは、厳密な名前キーを適用することを意味します。証明書で署名することはできませ(残念ながら)。

  3. EXTERNAL ACCESS ASSEMBLY署名されたアセンブリを使用するため、データベース所有者 (dbo) がまたは権限のいずれかが付与されたログインにリンクされていることを心配する必要はありませんUNSAFE ASSEMBLY(エラー メッセージは、dbo の権限が の場合にのみ重要であることを示していますTRUSTWORTHY) ON。 . 署名されたアセンブリを使用する場合、非対称キーまたは証明書 (アセンブリの署名に使用されたもの) から作成されたログインに対して、EXTERNAL ACCESS ASSEMBLYまたはのUNSAFE ASSEMBLYアクセス許可が付与されます。

  4. その部分は必要ありませんAUTHORIZATION ClrLogin

  5. あなたがする必要がある(または必要な)ことは次のとおりです。

    1. データベースに証明書を作成しますmaster。証明書は、いくつかの異なる方法で作成できます。

      • 既に読み込まれているSAFEアセンブリ (これはFROM ASSEMBLYオプションです)。ただし、SQL Server 2017 で導入された変更により、これはオプションではなくなりました。
      • ファイル システムからの.cerファイル (つまり、公開鍵) (これはFROM FILEオプションです)
      • ファイル システムからの.dllファイル (これはFROM EXECUTABLE FILEオプションです)
      • リテラルから直接.cerファイル(これはオプションです)。そのファイルを 16 進バイト文字列 (つまり) に簡単に変換するには、私が作成したオープン ソースのBinaryFormatterコマンドライン ユーティリティを使用できます。これは、自動化 / 継続的統合で使用できます (インポート / インクルードするファイルに変換することによって)。 、またはステートメントを手動でスクリプト化するために使用されます (クリップボードに直接変換してスクリプトに貼り付けます)。VARBINARYFROM BINARY0x12AB00003D...CREATE CERTIFICATE
    2. その証明書からログインを作成する
    3. そのログインにEXTERNAL ACCESS ASSEMBLYまたはUNSAFE ASSEMBLYアクセス許可を付与します (SQL Server 2017 以降では、UNSAFE ASSEMBLYアクセス許可のみ)。

SQL Server 2017 について

SQL Server 2017 introduced a new security feature ("CLR strict security", an advanced option) that is enabled by default and requires that ALL Assemblies, even those marked as SAFE, be signed with either an Asymmetric Key (i.e. strong name) or Certificate and have a Login (based on whatever was used to sign the Assembly) that has the UNSAFE ASSEMBLY permission. For details on how to make this work, with or without Visual Studio / SSDT, please see the following two posts of mine:

Please avoid the new Trusted Assemblies "feature" as it has many more flaws than benefits, not to mention it being entirely unnecessary in the first place given that existing functionality already handled the situation "Trusted Assemblies" was meant to address. For full details on that and a demo of the proper way to handle existing, unsigned Assemblies, please see: SQLCLR vs. SQL Server 2017, Part 4: “Trusted Assemblies” – The Disappointment.

于 2018-03-16T02:44:56.370 に答える
1

Kent Tegels は、証明書を使用して clr アセンブリに署名し、アセンブリが信頼できると見なされるように証明書をサーバーに読み込むためのセキュリティ プロセスを示す段階的な例を示しています。

于 2011-08-26T14:35:28.890 に答える