2016-11-15 20 views
1

私のHSM(ハードウェアセキュリティモジュール)は秘密鍵を格納(または使用を許可)していますが、PKCS#11などの方法はサポートしていません。次に、Apache Tomcatは、JKS、PKCS#11、またはプログラムを使用して証明書とキーを処理します。私の目標は、Webサーバー上でHTTPSサポートを有効にすることですが、構成ファイルの変更だけでその方法を実現する方法はありません。HTTPS用のApache TomcatでのHSM使用

証明書をJKSに保存し、HSMベンダー提供のAPIを使用してそれに関連付けられた秘密鍵を取得するオプションがあると思います。そのためには、私が正しいとすれば、JSSEImplementationとそれに対応する工場を再実装する必要があります。また、特定のキーおよびトラストマネージャを実装する必要があります。

そのような問題を解決するための唯一の方法はありますか?

実行中のApache Tomcatのスタンドアロンインスタンス(たとえば、起動直後)でJSSEImplementationを置き換えることは安全ですか?

答えて

1

最後に、私はthisの例に基づいて、以下の解決策にしか到達しませんでした。私は、sslImplementationNameプロパティがカスタムJSSEImplementationクラス名を指し示すTomcat構成に<Connector>インスタンスを追加し、カスタムJSSESocketFactoryX509KeyManagerクラスでJSSEImplementationを拡張します。

Tomcatの設定のようになります。

<Connector 
     protocol="org.apache.coyote.http11.Http11Protocol" 
     port="8443" maxThreads="200" 
     scheme="https" secure="true" SSLEnabled="true" 
     clientAuth="true" sslProtocol="TLS" SSLEnabled="true" 
     sslImplementationName="x.y.z.CustomJSSEImplementation" 
     keyAlias="alias_of_key_in_HSM_and_cert_in_JKS" 
/> 

CustomJSSEImplementationクラスは次のとおりです。

public class CustomJSSEImplementation extends JSSEImplementation { 
    @Override 
    public ServerSocketFactory getServerSocketFactory(AbstractEndpoint endpoint) { 
     return new CustomSslContextSocketFactory(endpoint); 
    } 

    @Override 
    public SSLUtil getSSLUtil(AbstractEndpoint endpoint) { 
     return new CustomSslContextSocketFactory(endpoint); 
    } 
} 

CustomSslContextSocketFactoryクラスは次のとおりです。

public class CustomSslContextSocketFactory extends JSSESocketFactory { 

    public static final AtomicReference<CustomSslContext> customSslContext = 
     new AtomicReference<CustomSslContext>(); 

    public CustomSslContextSocketFactory(AbstractEndpoint endpoint) { 
     super(endpoint); 
    } 

    @Override 
    public KeyManager[] getKeyManagers() throws Exception { 
     return (customSslContext.get() == null ? super.getKeyManagers() : customSslContext.get().getKeyManagers(this)); 
    } 
} 

CustomSslContextインタフェースは次のとおりです。

プロパティでHSMで秘密鍵を参照
interface CustomSslContext { 
    KeyManager[] getKeyManagers(JSSESocketFactory factory) throws Exception; 
} 

HsmKeyManagerImplは、次のようになります。

public class HsmKeyManagerImpl implements X509KeyManager { 
    ... 

    @Override 
    public PrivateKey getPrivateKey(String alias) { 
     // HSM Vendor specific API calls 
    } 
} 

私は民間に対応した証明書を取得する方法のコードを示しますが、によって定義された同じエイリアスませんでした<Connector>keyAliasプロパティがJKSから取得するために使用されます。

関連する問題