Компания, с которой я пытаюсь взаимодействовать, публикует данные, используя стандарт WS-Notification (или, по крайней мере, их использование). Унаследованный проект, над которым я работаю, уже имеет Apache CXF и настраивает SSL программно, а не через конфигурацию XML или любое использование Spring. Пример кода этого находится внизу. Можно ли сделать что-то подобное с ws-уведомлениями? Я подозреваю, что все сильно отличается, так как я на самом деле не клиент в этом случае.
Я просматриваю пример ws-уведомлений при загрузке Apache CXF, полный исходный код клиента выглядит следующим образом:
Consumer consumer = new Consumer( new Consumer.Callback()
{
public void notify( NotificationMessageHolderType message )
{
Object o = message.getMessage().getAny();
System.out.println( message.getMessage().getAny() );
if( o instanceof Element )
{
System.out.println( ( ( Element ) o ).getTextContent() );
}
}
}, url );
// Create a subscription for a Topic on the broker
NotificationBroker notificationBroker
= new NotificationBroker( "https://localhost:" + wsnPort + "/wsn/NotificationBroker" );
Subscription subscription = notificationBroker.subscribe( consumer, "MyTopic" );
Вот фрагменты кода того, как мы делали это как клиент в прошлом. По сути, ищем, как установить эти же свойства программно, чтобы вышеуказанные экземпляры Consumer и NotificationBroker были настроены соответствующим образом.
// Configure wss4j properties for SSL
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass( WebService.class );
factory.setAddress( serviceUrl );
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor( outProps );
factory.getOutInterceptors().add( wssOut );
// configure WS-Security interceptor
Map<String, Object> outProps = Maps.newHashMap();
java.util.Properties sig_props = new java.util.Properties();
sig_props.put( "org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin" );
sig_props.put( "org.apache.ws.security.crypto.merlin.keystore.type", "PKCS12" );
sig_props.put( "org.apache.ws.security.crypto.merlin.keystore.file", tempPathForCertFileKeystore );
sig_props.put( "org.apache.ws.security.crypto.merlin.keystore.alias", pfxFileAlias );
sig_props.put( "org.apache.ws.security.crypto.merlin.keystore.password", pfxFilePassword );
sig_props.put( "org.apache.ws.security.crypto.merlin.keystore.private.password", pfxFilePassword );
sig_props.put( "org.apache.ws.security.crypto.merlin.truststore.type", "PKCS12" );
sig_props.put( "org.apache.ws.security.crypto.merlin.truststore.file", tempPathForCertFileKeystore );
sig_props.put( "org.apache.ws.security.crypto.merlin.truststore.password", pfxFilePassword );
sig_props.put( "org.apache.ws.security.crypto.merlin.truststore.private.password", pfxFilePassword );
outProps.put( WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE + " " + WSHandlerConstants.TIMESTAMP );
outProps.put( WSHandlerConstants.USER, pfxFileAlias );
outProps.put( WSHandlerConstants.SIG_KEY_ID, "DirectReference" );
outProps.put( WSHandlerConstants.SIGNATURE_USER, pfxFileAlias );
outProps.put( WSHandlerConstants.PW_CALLBACK_REF, new Utility.ClientPasswordHandler( pfxFilePassword ) );
outProps.put( "cryptoProperties", sig_props );
outProps.put( WSHandlerConstants.SIG_PROP_REF_ID, "cryptoProperties" );
webService = ( WebService ) factory.create();
Client cp = ClientProxy.getClient( webService );
HTTPConduit httpConduit = ( HTTPConduit ) cp.getConduit();
TLSClientParameters params =
httpConduit.getTlsClientParameters();
if( params == null )
{
params = new TLSClientParameters();
httpConduit.setTlsClientParameters( params );
}
SSLContext sslContext = SSLContext.getInstance( "TLS" );
char[] sslTslKeyPairPasswordCharArray = sslTslKeyPairPassword.toCharArray();
//clear out the keystore, we create a new one every time
if( Files.exists( Paths.get( tempPathForCertFileKeystore ) ) )
Files.delete( Paths.get( tempPathForCertFileKeystore ) );
KeyStore ks = KeyStore.getInstance( "PKCS12" );
ks.load( new FileInputStream( sslTlsKeyPairPath ), sslTslKeyPairPasswordCharArray );
// Store away the newly created keystore.
FileOutputStream fos = new FileOutputStream( tempPathForCertFileKeystore );
ks.store( fos, sslTslKeyPairPasswordCharArray );
fos.close();
for( String certFilePath : serverCertFilePaths )
AddCertToKeystore( ks, sslTslKeyPairPasswordCharArray, tempPathForCertFileKeystore, certFilePath, new File( certFilePath ).getName().replace( '.', '_' ) );
TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm() );
tmf.init( ks );
KeyManagerFactory kmf = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm() );
kmf.init( ks, sslTslKeyPairPasswordCharArray );
sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom() );
SSLContext.setDefault( sslContext );
params.setSSLSocketFactory( sslContext.getSocketFactory() );
params.setTrustManagers( tmf.getTrustManagers() );
params.setKeyManagers( kmf.getKeyManagers() );
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout( 36000 );
httpClientPolicy.setAllowChunking( false );
httpConduit.setClient( httpClientPolicy );