最後に、私はthisの例に基づいて、以下の解決策にしか到達しませんでした。私は、sslImplementationName
プロパティがカスタムJSSEImplementation
クラス名を指し示すTomcat構成に<Connector>
インスタンスを追加し、カスタムJSSESocketFactory
とX509KeyManager
クラスで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から取得するために使用されます。