web-dev-qa-db-ja.com

特定のクライアントハードウェアデバイス用の一意でコピー不可能なVPN証明書/キーを生成する方法は?

問題は次のとおりです。ユーザーが証明書/キーを別のハードウェアデバイスにコピーして別のハードウェアデバイスから使用することを妨げるものは何もありません...

ハードウェアを考慮して本当にユニークな証明書を生成することは可能ですか?

7
Erwan

Trusted Platform Module(TPM)で仮想スマートカードを生成できます。 TPMはハードウェアセキュリティモジュール(HSM)に似ていますが、TPMがコンピューターのマザーボードに物理的に接続されており、移植性がない点が異なります。

多くのマザーボードにはTPMが搭載されていますが、多くの人々はそれを知らないため、TPMを使用しないことがよくあります。 TPMの主な利点は、おそらくHSMに比べてコストが低いことです。 TPMはスマートカードよりも手頃な価格で、すべてのユーザーにプロビジョニングし、紛失した場合は交換する必要があります。スマートカードと比較したTPMのもう1つの利点は、移植性がないために見当違いが発生しにくいことです。

VSCについて:仮想スマートカード(VSC)はTPM上にあり、証明書の秘密キーを格納します。 VSCはPINで保護することができ、PINは、VSCの作成方法に応じて最小レベルの複雑さに設定できます。

ここにあなたが始めるためのいくつかの指示があります(注:Windowsが必要です

TPMがアクティブかどうかを確認してください:

  • Windowsアイコンをクリックして、次のコマンドを入力し、アイコンを右クリックして実行します管理者として:

    tpm.msc
    
  • ステータスの値を確認します。 「TPMを使用する準備ができました」と表示されている場合、TPMはアクティブです。

  • TPMがアクティブでない場合は、BIOSでTPMを探して、存在する場合は有効にする必要があります。
  • TPMがシステムに存在しない場合は、次の手順が適用されないため、ここで停止します。

TPMで仮想スマートカードを作成する方法:

  • こちらのスクリーンキャストビデオ: https://youtu.be/MSw59AKvwSo

  • 次の情報が必要になりますbefore仮想スマートカードの作成:

    • Name:同じTPM上の他のカードと区別するための仮想スマートカードの名前(最大10個まで可能)。
    • PIN:パスワード。パスワードは、次の複雑さのルールに準拠している必要があります。
      • 10文字以上
      • 大文字と小文字の混在
      • 特殊文字を含める必要があります
    • AdminKey:これはパスワードに似ていますが、AdminKeyは16進形式である必要があり、16進形式の文字数は48である必要があります。これは24のプレーンテキスト文字に相当します。 テキストから16進数への変換ユーティリティが役立つ場合があります。
      • プレーンテキストから16進数に変換された16進キーの例:
        • プレーンテキスト(24文字):abcdefghijklmnopqrstuvwx
        • Hex(スペースを省略した48文字):6162636465666768696a6b6c6d6e6f707172737475767778
      • 独自の24文字の管理キーを選択します(上記の例は使用しないでください)。convertプレーンテキストの24文字を48文字の16進値に変換し、 48文字の16進値で、次のステップに備えます。
    • PUK: A PINロック解除キー、つまり別のパスワード。誤ったパスワードを何度も入力してロックを解除する必要がある場合は、PUKが必要です。
  • コマンドラインターミナルを開きます管理者モード。

  • 次のコマンドを編集して、「MyVSCName」を仮想スマートカード用に上で選択した名前に置き換えます。次に、編集したコマンドをコピーしてターミナルに貼り付けます。

    tpmvscmgr.exe create /name "MyVSCName" /pin Prompt /pinpolicy minlen 10 uppercase REQUIRED lowercase REQUIRED digits REQUIRED specialchars REQUIRED /AdminKey Prompt /puk Prompt /attestation AIK_AND_CERT /generate

  • PIN、管理者キー、PUKを尋ねる一連の質問が表示されます。上記で準備した対応する値を貼り付けます。

  • これで、仮想スマートカードがTPMに存在するはずです。次のコマンドを使用して、TPM内のすべての仮想スマートカードを一覧表示することで、その存在を確認できます。

    wmic path win32_PnPEntity where "DeviceID like '%smartcardreader%'" get DeviceID,Name,Status

TPMで仮想スマートカードを破棄する方法:

  • コマンドラインターミナルを開きます管理者モード。

  • TPMで仮想スマートカードを一覧表示します。

    wmic path win32_PnPEntity where "DeviceID like '%smartcardreader%'" get DeviceID,Name,Status

  • 削除する仮想スマートカードの「DeviceID」の下の値をメモします。

  • "MyDeviceID"を削除する仮想スマートカードの実際のDeviceIDに置き換えて、次のコマンドを編集して実行します。

    tpmvscmgr destroy /instance "MyDeviceID"
    

TPM内の秘密キーで署名された証明書署名リクエストを生成します:

  • メモ帳やSublime Textなどのテキストエディターを開きます。

  • 次のコードをコピーして、テキストエディターに貼り付けます。

    [NewRequest]
    Subject = "CN=[user's e-mail address or server's domain name],O=[Organisation],L=[Locality],ST=[State],C=[Country]"
    Keylength = 2048
    Exportable = FALSE
    UserProtected = TRUE
    MachineKeySet = FALSE
    ProviderName = "Microsoft Base Smart Card Crypto Provider"
    ProviderType = 1
    RequestType = PKCS10
    KeyUsage = 0x80
    
  • Subject行については、状況に合わせて、括弧内の値を独自の値に置き換えます。 (括弧文字自体は省略してください。)

  • .inf」ファイル拡張子を付けてテキストファイルを保存します。例えば:

    TPM-cert-template.inf
    
  • コマンドラインターミナルを開きます管理者モード。

  • コマンドラインターミナルから、ディレクトリ(cd)を上記の ".inf"ファイルを保存した場所に変更します。

  • 次に、証明書署名要求(CSR)を生成します。次のコードをコピーしてコマンドラインターミナルに貼り付けます。

    certreq -new -f TPM-cert-template.inf TPM-cert.csr
    
  • Windowsのポップアップダイアログが表示され、証明書署名要求を生成する仮想スマートカードを選択するよう求められます。 TPMは複数の仮想スマートカードを格納できますが、このポップアップダイアログには、そのうちの1つだけが表示される場合があります(複数存在する場合)。 仮想スマートカードを選択する前に、リストを展開してくださいを確認してください。その後、特定の仮想スマートカードを選択することが明確に表示されます。署名リクエストを生成する必要があります。

  • 仮想スマートカードを選択したら、PINを入力する必要があります。

  • 正しいPINを入力すると、同じファイルに新しいファイルが生成されます。

    TPM-cert.csr
    

キーペアを認証するためにサーバーを準備します:

  • これで、認証局による署名が必要なCSRができました。認証局がCSRに署名すると、PEMまたはDER形式の証明書が送り返されます。

  • 認証局をお持ちでない場合は独自に作成できますただし、独自に作成すると、署名付き証明書を使用するすべてのクライアントが証明書を認識する必要があります作成した権限。これを行うには、最初に探していた署名付き証明書だけでなく、認証局独自のルート証明書も送信する認証局が必要です。

    • 独自のプライベート認証局を使用している場合、プライベート認証局を認識するために認証するすべてのサーバーを取得する必要があります。これには、認証の対象となるすべてのサーバーでのプライベート認証局のルート証明書のインストールが関係します。
  • 認証局から署名付き証明書を取得したら、認証する必要があるすべてのサーバーまたはVPNで署名済み証明書をインストールする必要があります。

ユーザーを認証するためにサーバーを準備します:

  • 証明書をインストールしたサーバーまたはVPNでクライアントソフトウェアを認証するには、TPMに接続するAPIを利用できるソフトウェアが必要です。このために、Windows用のユーティリティPuTTYWinCryptがあり、これは人気のあるPuTTYプログラムのフォークです。 SSHまたはSCPを介してサーバーに接続できます。 PuTTYWinCryptのソースコードは、この記事の執筆時点でGitHubから入手できます。このソフトウェアの作成者は、PageantWinCryptと呼ばれるPuTTYWinCryptと組み合わせられることが多い関連ソフトウェアのフォークも作成しました。

  • サーバーが認証局を認識するようになったので、接続する特定のユーザーの公開鍵を認識するようにサーバーを準備する必要があります。公開鍵はOpenSSH形式である必要があります。つまり、鍵のテキスト全体が1行で書き出されます。おそらく、公開鍵をPEMからOpenSSH形式に変換することはできません。そのような変換には、秘密鍵へのアクセス権が必要だからです。あなたの場合、秘密鍵はTPMに限定されているため、直接アクセスできません。次の手順は、対応する秘密鍵に直接アクセスせずにOpenSSHで公開鍵を取得するのに役立ちます。

  • PageantWinCryptをダウンロードして実行します。このソフトウェアは、人気のプログラムPageantのパッチバージョンであり、メモリにキーを保存し、Windowsシステムトレイのアイコンとしてバックグラウンドで実行されます。実行可能ファイルをダブルクリックしても、システムトレイにPageantWinCryptのアイコンが表示され、PageantWinCryptが実行中であることを除いて、それほど明白ではありません。 PageantWinCryptのアイコンには「Pageant」ではなく「PageantWinCrypt」というラベルが付いているため、これが機能するためには、PageantWinCryptを実行していることを確認する必要があります。

  • 画面の左下隅にあるWindowsアイコンをクリックして次のように入力し、アイコン(入力すると表示されるはずです)を右クリックして、[Run as administrator]を選択します。

    certmgr.msc
    
  • ウィンドウがポップアップし、証明書のリストが展開可能なフォルダアイコンとともに表示されます。署名済み証明書をインストールした特定のフォルダーを見つけて展開する必要があります。その展開されたフォルダー内で、「Certificates」というサブフォルダーを左クリックします。特定の証明書を左クリックして選択します。次に、「Action」メニュー項目に移動し、ドロップダウンから「Copy」を選択します。これで証明書がメモリにあります。メモリからPageantWinCryptにインポートする必要があります。

  • システムトレイのPageantWinCryptのアイコンを右クリックし、[Add Certificate]を選択します。 「証明書を選択してください」というポップアップダイアログが表示される場合があります。 OKをクリックします。これで、キーはPageantWinCryptにあるはずです。これを確認するには、ページェントアイコンをもう一度右クリックし、[View Keys]を選択します。キーに対応する行エントリがあるはずです。明白ではないかもしれませんが、その行エントリをダブルクリックするだけでメモリにコピーできます。コピーした行をメモ帳などのテキストエディタに貼り付けます。

  • 貼り付けたテキストを確認します。すべて1行で入力してください。しかし、この長い行には2つの部分があり、それらの部分を2つの行に分割する必要があります。 2番目の部分は次で始まり、行の終わりまで続きます。

    cert://
    
  • テキストエディタで、cert://の直前までマウスをクリックして、キーボードのEnterキーを数回押します。これで2行のテキストが表示され、2行目はcert:\\で始まります。次の点に注意してください。

    • 1行目は、OpenSSH形式の公開鍵です。サーバーがLinux上にある場合は、OpenSSH形式のパブリックをサーバーのauthorized_keysファイルに追加する必要があります。

      • authorized_keysファイルの場所を見つけるには、SSH経由でLinuxサーバーに接続し、次のコマンドを入力します。検索が行われ、authorized_keysファイルへのパスが出力されます。

        Sudo find / -name "authorized_keys" 2>/dev/null
        
      • 上記のステップからauthorized_keysへのパスをメモしてください。次に、authorized_keysを編集して、OpenSSH形式の公開鍵を貼り付ける必要があります。次のコマンドを実行し、テキスト「[path-to-authorized-keys] "を実際のパスに置き換えます(以下の例では括弧を省略します)。

        Sudo nano "[path-to-authorized-keys]"
        
      • Linuxベースのテキストエディタnanoが開き、authorized_keysの内容が表示されます。一番下までスクロールし、コピーしたOpenSSH形式の公開鍵を貼り付けて、新しい行を追加します。貼り付けたら、ファイルを保存して終了します。

    • これで、LinuxサーバーがTPM対応のSSH接続を認証するように構成されました。 Windowsで、SPM接続を容易にするために、TPM互換ソフトウェアをセットアップする必要があります。

    • テキストエディタでは、先ほど貼り付けたテキストの2行目が認証文字列です。 TPMの秘密鍵に対応します。 cert:\\で始まるこの行は、以下で説明するようにPuTTYWinCryptに貼り付ける必要があるものです。

TPMにアクセス可能なソフトウェアを使用してログイン:

  • PuTTYWinCryptを開きます。カテゴリConnectionSSHAuthの下の「Private key file for authentication」というラベルが付いたスペースに、cert:\\で始まるテキストを貼り付けます。通常、TPMを使用せずに、このスペースに、ハードドライブにある秘密鍵へのパスを貼り付けます。しかし、あなたがフォローしているプロセスでここでは、秘密鍵はTPMに安全に格納されています。比較すると、はるかに安全です。そのスペースにこのテキスト(cert:\\で始まる)を貼り付けると、公開鍵をインストールしたのと同じサーバーで認証できるようになります。変更を永続化するには、接続を保存してください。 PuTTYWinCryptのカテゴリSessionで、[保存]ボタンをクリックします。

  • PuTTYWinCryptで、SSH経由で今すぐ接続してみてください。すべてを適切に構成した場合は、TPMの仮想スマートカードからポップアップを取得し、PINを要求する必要があります。 PINを入力します。 PINが正確であれば、SSH接続は続行され、期待どおりに接続するはずです。

  • これで完了です! TPMに安全に保存されている秘密鍵を使用して、SSH経由でサーバーに接続しました。

上記の情報は、クリスヴァンマールの参考情報blog postに触発され、一部から得られたものです。

最後に、IBMの研究者たちは現在、彼らが呼ぶVirtual TPMsを開発しています。これにより、TPM機能をクラウドホスト間で移行することが可能になります。

12
vrtjason