2009-05-18 74 views
6

約50個のCRLを週に1回ダウンロードしてインストールし、複数のWindowsサーバーにインストールする必要があります。ダウンロードは簡単ですが、CRLインポートプロセスをスクリプト化する方法はありますか?プログラムで証明書失効リスト(CRL)をインストールする

+0

ダウンロードは簡単な部分ですか?これを達成するために使用した技術を共有できますか?ありがとう – Raj

+0

@Rajほとんどすべての認証機関または署名者は、証明書メタデータの一部としてCRLの場所を公開します。問題の証明書を開き、「CRL配布ポイント」というフィールドを探します。本当にこれはあなたがコメントとして残すだけではなく、尋ねるべき一般的な質問です。 – Goyuix

+0

はい、配布ポイントを証明書のフィールドとして認識しています。現在、私はリモートオブジェクト検索関数[CryptoAPI]を使ってCDPから検索します。また、URLをコピーしてブラウザに貼り付けるだけで、CRLもダウンロードされることを理解しています。私がコメントとしてあなたに尋ねたのは、あなたがCRLの取得が簡単な部分であると言われたので、あなたには何かユーティリティや何かがあると仮定しました。しかし明らかに私の仮定は間違っていた。応答していただきありがとうございます。 – Raj

答えて

3

私はスクリプトを使ってそれを行う方法を知らない。 Cコードを書くことはできますか?あなたが何をしたいのか分かっていれば、CryptUiWizImport関数とCRYPTUI_WIZ_IMPORT_SRC_INFO構造体を使用します。

ここにはsample of code that installs a Certがあります。対応するCRLインポートは似ています。

補遺:PowerShellスクリプト内から、動的に行いC#コードを生成し、コンパイル:
This postは(例えばCryptUiWizImportなど)のWin32 APIはPowerShellのから直接アクセスすることはできませんし、その後可能な回避策を記載していることを指摘しますP/Invokeを実行し、結果のアセンブリを実行します。これにより、CryptUiWizImportを厳密にpowershellスクリプトから実行できますが、かなりエキゾチックなスクリプトになります。

+1

私はC#のコンソールアプリケーションとしてCryptUIWizImport関数をラップし、証明書とCRLの両方をインストールするための魅力のように機能します。どうもありがとうございました! – Goyuix

+1

あなたは次の人を助けるために、ソースを投稿することに興味がありますか? – Cheeso

+0

私は本当にソースに興味があるでしょう...私はまったく同じ問題を抱えています。 – Mephisztoe

1

Powershellには、証明書ストアを表すCert:プロバイダがあります。それを操作することは標準のコマンドレットを介して行われるため、失効リストをどこかに統合することができます。私は、Windowsが証明書をどのように処理して、これ以上の助けになるかについて十分に知りません。

2

hm。 certutil.exeユーティリティを使用しない理由はありますか? (少し公共用スクラブ)ここで

certutil -addstore CA <FileName>.crl 
+0

certutilは標準インストールの一部ではありません。私は、証明書サービスがインストールされている場合にのみインストールされると信じています(私は間違っているかもしれませんが)。 – Goyuix

11

は私の最後の源である - しかし、動作するはずです:私は、次のコマンドを実行して、適切なストアに証明書失効リストをインポートすることができます。私は受け入れられた答えを変更しませんが、私はこれが助けてくれることを願っています(質問と回答をupvotingしていますように!)。

注:これは、ローカルマシンの信頼されたルートストアにCRLまたは通常の証明書の両方をインポートします。 CertOpenStoreの呼び出しでCERT_SYSTEM_STORE_LOCAL_MACHINECERT_SYSTEM_STORE_CURRENT_USERに変更すると、現在のユーザーストアで動作するように変更されます。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
    public struct CRYPTUI_WIZ_IMPORT_SRC_INFO 
    { 
     public Int32 dwSize; 
     public Int32 dwSubjectChoice; 
     [MarshalAs(UnmanagedType.LPWStr)]public String pwszFileName; 
     public Int32 dwFlags; 
     [MarshalAs(UnmanagedType.LPWStr)]public String pwszPassword; 
    } 

    [DllImport("CryptUI.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern Boolean CryptUIWizImport(
     Int32 dwFlags, 
     IntPtr hwndParent, 
     IntPtr pwszWizardTitle, 
     ref CRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, 
     IntPtr hDestCertStore 
    ); 

    [DllImport("CRYPT32.DLL", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern IntPtr CertOpenStore(
     int storeProvider, 
     int encodingType, 
     IntPtr hcryptProv, 
     int flags, 
     String pvPara 
    ); 

    public const Int32 CRYPTUI_WIZ_IMPORT_SUBJECT_FILE = 1; 
    public const Int32 CRYPT_EXPORTABLE = 0x00000001; 
    public const Int32 CRYPT_USER_PROTECTED = 0x00000002; 
    public const Int32 CRYPTUI_WIZ_NO_UI = 0x0001; 

    private static int CERT_STORE_PROV_SYSTEM = 10; 
    private static int CERT_SYSTEM_STORE_CURRENT_USER = (1 << 16); 
    private static int CERT_SYSTEM_STORE_LOCAL_MACHINE = (2 << 16); 

    static void Main(string[] args) 
    { 
     if (args.Length != 1) 
     { 
     Console.WriteLine("Usage: certimp.exe list.crl"); 
     Environment.ExitCode = 1; 
     } 
     else 
     { 
     IntPtr hLocalCertStore = CertOpenStore(
      CERT_STORE_PROV_SYSTEM, 
      0, 
      IntPtr.Zero, 
      CERT_SYSTEM_STORE_LOCAL_MACHINE, 
      "ROOT" 
     ); 

     CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc = new CRYPTUI_WIZ_IMPORT_SRC_INFO(); 
     importSrc.dwSize = Marshal.SizeOf(importSrc); 
     importSrc.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_FILE; 
     importSrc.pwszFileName = args[0]; 
     importSrc.pwszPassword = null; 
     importSrc.dwFlags = CRYPT_EXPORTABLE | CRYPT_USER_PROTECTED; 

     if (!CryptUIWizImport(
      CRYPTUI_WIZ_NO_UI, 
      IntPtr.Zero, 
      IntPtr.Zero, 
      ref importSrc, 
      hLocalCertStore 
     )) 
     { 
      Console.WriteLine("CryptUIWizImport error " + Marshal.GetLastWin32Error()); 
      Environment.ExitCode = -1; 
     } 
     } 
    } 
    } 
} 
+1

注:X509Store、Open()を作成し、そのStoreHandleプロパティをCryptUIWizImportの最後の引数として渡すこともできます。 – voetsjoeba

+0

注:ドキュメントに記載されている内容にもかかわらず、CRYPTUI_WIZ_NO_UIフラグのいずれも、「現在のCRLを置き換えますか?」と尋ねるポップアップダイアログが表示されません。ターゲットストアにすでに同じまたはより新しい有効時間のCRLが含まれている場合(Win2008 R2でテスト済み) – voetsjoeba

+1

注:Crypt32.dllからCertAddCRLContextToStore Win32関数をP/Invokeすることができます(潜在的にUIを経由するよりも、CRLをWindows証明書ストアに追加する方法)。 – voetsjoeba

関連する問題