リモート サーバーに保存されている秘密キーを使用して SSL 暗号化を使用するように Tomcat を構成する方法を教えてください。

リモート サーバーに保存されている秘密キーを使用して SSL 暗号化を使用するように Tomcat を構成する方法を教えてください。

Tomcat を設定して、サーバー上にリモートで保存された秘密鍵で SSL 暗号化を使用する方法があるかどうかを知りたいのですserver.xmlが、サーバーの設定は次のようになると思います。

Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
proxyPort=""
keystoreFile="{./script-return}/keystore.jks"
keystorePass="12345"
keystoreType="jks"
truststorePass="12345"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />

ただし、このkeystoreFileディレクティブは、リモート サーバーから秘密キーを抽出するスクリプトを指すものです。

Tomcat の設定で、キーを抽出するためのシェル スクリプトを指定する方法はありますか?

私は何かを見つけたトラストマネージャーしかし、パスはファイル システム パスを指す必要があることがわかりますが、これは代替手段ではありません。

答え1

「鍵の抽出」はHSMを使用する意味を全く失わせます。秘密鍵はTomcatのメモリに保存されたままになるので(つまりHeartbleedなどを使って盗むことが可能になる)、それを見た人は誰server.xmlでも盗むことができるのです。まったく同じコマンドを実行するだけでTomcat と同じです。

あなたのアイデアはTomcatが作れる場合にのみ意味を成す署名リクエストを送信するHSM へ。これにより、レイテンシが若干増加します (すべての TLS 接続が HSM に到達する必要があるため) が、実際にセキュリティをいくらか強化できる唯一の方法です。

(実際の HSM である必要はありません。同じシステムで実行されている SoftHSM2 でもかまいません。その場合、一方のユーザー アカウントにキーをしっかりと保持し、もう一方のユーザー アカウントに Tomcat をしっかりと保持する限り、より安全になります。)

同じシステムでPKCS#11モジュールを使用する

このセクションを早送りすることもできますが、Tomcat で PKCS#11 を使用する基本的な手順は次のとおりです。

  1. 次のファイルを作成します:/etc/java-<name>.cfg
    名前 =<hsm_name>
    ライブラリ = /usr/lib/p11-kit-proxy.so
    (ライブラリパスはディストリビューションに応じて調整してください。この設定ファイルの完全なドキュメントはJava PKCS#11 ガイド
  2. ファイルに新しい行を追加しますjava.security:
    セキュリティプロバイダー。=sun.security.pkcs11.SunPKCS11 /etc/java-<名前>.cfg
  3. keytool を実行し、HSM の内容が表示されることを確認します。
    キーツール --list --storetype PKCS11
  4. 最後に、Tomcat が PKCS#11 を使用するように設定します。

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-hsm_name"
               keystorePass="[HSM PIN here]" />
    

リモートサーバーからのPKCS#11モジュールの使用

p11キットパッケージには、これを実現できる 2 つのコンポーネントが付属しています。

  1. PKCS p11-kit-proxy.so#11 モジュールはマルチプレクサとして機能し、構成に応じてさまざまな他のモジュールをロードするように構成できます。特に、パイプを介してプロセス外モジュールと通信できます。

  2. このp11-kit remoteツールは、p11-kit のプロセス外モジュール サポートのもう一方のパイプ エンドとして機能します。SSH またはその他のトンネル経由で使用できます。

まず HSM 側から:

  1. p11-kit をインストールし、それを使用するユーザー アカウントを選択または作成します。
  2. そのユーザー アカウントにファイルを作成し、p11-kit に HSM PKCS#11 モジュールについて伝えます。ファイルの内容は 1 行で構成されます。~/.config/pkcs11/modules/<name>.module
    モジュール: /usr/lib/<hsm_pkcs11_name>。それで
    (あるいは、システム全体のディレクトリにこれを作成することもできます/usr/share/p11-kit/modules/。)
  3. 必ずHSM を使用してくださいp11-kit listp11tool --list-tokens

注: 手順 2 ~ 3 は、この計画では実際には必要ありません。これらは、起こりうる問題を早期に発見できるようにするためにのみ存在します。p11-kit が HSM モジュールと互換性がないことが判明した場合、作業が軽減されます。(互換性がある場合は、 を使用してp11tool管理できます。)

次にTomcat側で:

  1. p11-kitもインストールします。
  2. authorized_keysTomcat 用の SSH キー ペアを作成し、パスワードなしの SSH を使用するためにHSM アカウントに配置します。
  3. 再度、Tomcat ユーザー アカウントのホーム ディレクトリにファイルを作成しますが、今回はファイルの内容は次のようになります。~/.config/pkcs11/modules/<name>.module
    リモート: |ssh user@hsmserver p11-kit リモート /usr/lib/<hsm_pkcs11_name>。それで
  4. もう一度、確認してp11-kit list動作p11tool --list-tokensを確認してください。SSH 接続が魔法のように確立され、リモート HSM に関する情報が表示されるはずです。
  5. リモート アクセスを高速化するには、次の方法で SSH の接続多重化を有効にします~/.ssh/config
    ホストhsmサーバー
    コントロールパス ~/.ssh/S.%r@%h:%p
    コントロールマスター 自動
    コントロールパーシスト 1h

すべてがうまくいったら、keytoolp11-kit-proxy PKCS#11 モジュールを使用してみてください。

  1. 次のファイルを作成します/etc/java-p11-kit.cfg:
    名前 = p11-kit
    ライブラリ = /usr/lib/p11-kit-proxy.so
    (ライブラリパスはディストリビューションに応じて調整してください。この設定ファイルの完全なドキュメントはJava PKCS#11 ガイド
  2. ファイルに新しい行を追加しますjava.security:
    セキュリティプロバイダー。=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
  3. keytool を実行し、HSM の内容が表示されることを確認します。
    キーツール --list --storetype PKCS11
  4. 最後に、p11-kit-proxy PKCS#11 モジュールを使用するように Tomcat を構成します。

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-p11-kit"
               keystorePass="[HSM PIN here]" />
    

関連情報