Программная настройка SSL для потребителя WS-Notification - PullRequest
0 голосов
/ 29 мая 2019

Компания, с которой я пытаюсь взаимодействовать, публикует данные, используя стандарт 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...