問題は次のとおりです。ユーザーが証明書/キーを別のハードウェアデバイスにコピーして別のハードウェアデバイスから使用することを妨げるものは何もありません...
ハードウェアを考慮して本当にユニークな証明書を生成することは可能ですか?
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で仮想スマートカードを作成する方法:
こちらのスクリーンキャストビデオ: https://youtu.be/MSw59AKvwSo
次の情報が必要になりますbefore仮想スマートカードの作成:
abcdefghijklmnopqrstuvwx
6162636465666768696a6b6c6d6e6f707172737475767778
コマンドラインターミナルを開きます管理者モード。
次のコマンドを編集して、「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を開きます。カテゴリConnection
:SSH
:Auth
の下の「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機能をクラウドホスト間で移行することが可能になります。