Schließlich kam ich nur auf die Lösung unten basierend auf this Beispiel. Ich füge <Connector>
Instanz der Tomcat-Konfiguration mit sslImplementationName
-Eigenschaft hinzu, die auf den benutzerdefinierten Klassennamen JSSEImplementation
verweist, und Erweitere JSSEImplementation
mit benutzerdefinierten JSSESocketFactory
und Klassen.
Tomcat-Konfiguration wie folgt aussieht:
<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
Klasse:
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
Klasse:
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
Schnittstelle ist:
interface CustomSslContext {
KeyManager[] getKeyManagers(JSSESocketFactory factory) throws Exception;
}
HsmKeyManagerImpl
, die von einer keyAlias
Eigenschaft im HSM privaten Schlüsseln Referenz wie folgt aussieht:
public class HsmKeyManagerImpl implements X509KeyManager {
...
@Override
public PrivateKey getPrivateKey(String alias) {
// HSM Vendor specific API calls
}
}
ich den Code nicht zeigte, wie Zertifikat zu erhalten, die an den privaten entspricht, aber das gleiche Alias definiert durch Die keyAlias
Eigenschaft der <Connector>
wird verwendet, um es von der JKS zu bekommen.