diff options
| author | Christof Rabensteiner <christof.rabensteiner@iaik.tugraz.at> | 2019-05-21 13:47:34 +0200 | 
|---|---|---|
| committer | Christof Rabensteiner <christof.rabensteiner@iaik.tugraz.at> | 2019-05-21 13:47:34 +0200 | 
| commit | 59a13bea5783aa666bcbcec793df19f129965ff3 (patch) | |
| tree | 15049405249a0940484e3f177e5c5b51cb5458e9 | |
| parent | 96f82d09c22853ce3b37db0983ce6ccc34c2587f (diff) | |
| download | moa-zs-59a13bea5783aa666bcbcec793df19f129965ff3.tar.gz moa-zs-59a13bea5783aa666bcbcec793df19f129965ff3.tar.bz2 moa-zs-59a13bea5783aa666bcbcec793df19f129965ff3.zip | |
WIP: SSL Client Auth
- Refactor MsgClient: Not a Singleton anymore. Use MsgClientFactory to
  make a client. Make request and config private fields.
- Add configuration parameters to application.yaml.
- Init SSL client auth testcase, but dont include in testsuite because
  it aint working yet.
| -rw-r--r-- | pom.xml | 7 | ||||
| -rw-r--r-- | src/main/java/at/gv/egiz/moazs/msg/MsgClient.java | 54 | ||||
| -rw-r--r-- | src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java | 14 | ||||
| -rw-r--r-- | src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java | 10 | ||||
| -rw-r--r-- | src/main/resources/application.yaml | 41 | ||||
| -rw-r--r-- | src/test/java/at/gv/egiz/moazs/MsgClientTest.java | 31 | ||||
| -rw-r--r-- | src/test/java/at/gv/egiz/moazs/SameThreadDeliveryPipelineTest.java | 9 | 
7 files changed, 143 insertions, 23 deletions
| @@ -25,6 +25,7 @@      <jaxwsapi.version>2.3.1</jaxwsapi.version>      <jwsapi.version>1.1</jwsapi.version>      <jedisclient.version>2.9.3</jedisclient.version> +    <!--<egovutils.version>2.0.7-snapshot</egovutils.version>-->      <guava.version>27.1-jre</guava.version>      <immutable-xjc-plugin.version>1.5</immutable-xjc-plugin.version>      <jacoco.version>0.8.3</jacoco.version> @@ -96,6 +97,12 @@        <artifactId>javax.jws-api</artifactId>        <version>${jwsapi.version}</version>      </dependency> + +    <!--<dependency>--> +      <!--<groupId>at.gv.util</groupId>--> +      <!--<artifactId>egovutils</artifactId>--> +      <!--<version>${egovutils.version}</version>--> +    <!--</dependency>-->    </dependencies>    <build> diff --git a/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java b/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java index 47ee8c3..6f0b1d9 100644 --- a/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java +++ b/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java @@ -4,24 +4,64 @@ import at.gv.zustellung.app2mzs.xsd.ConfigType;  import at.gv.zustellung.msg.xsd.App2ZusePort;  import at.gv.zustellung.msg.xsd.DeliveryRequestStatusType;  import at.gv.zustellung.msg.xsd.DeliveryRequestType; +import org.apache.cxf.jaxws.JaxWsClientFactoryBean;  import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; -import org.springframework.stereotype.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -@Component  public class MsgClient { -    public DeliveryRequestStatusType send(DeliveryRequestType msgRequest, ConfigType config) { -        var address = config.getServer().getZUSEUrlID(); -        var proxy = connect(address); +    private static final Logger log = LoggerFactory.getLogger(MsgClient.class); + +    private final DeliveryRequestType msgRequest; +    private final ConfigType config; + +    MsgClient(DeliveryRequestType msgRequest, ConfigType config) { +        this.msgRequest = msgRequest; +        this.config = config; +    } + +    public DeliveryRequestStatusType send() { + +        var proxy = connect(config); +          return proxy.delivery(msgRequest);      } -    private App2ZusePort connect(String address) { +    private App2ZusePort connect(ConfigType config) { + +        new JaxWsClientFactoryBean(); + +        var address = config.getServer().getZUSEUrlID();          var factory = new JaxWsProxyFactoryBean();          factory.setServiceClass(App2ZusePort.class);          factory.setAddress(address); -        return (App2ZusePort) factory.create(); + +        var proxy = factory.create(); + +//        var client = ClientProxy.getClient(proxy); +//        var conduit = (HTTPConduit) client.getConduit(); +// +//        if (addressIsHttps(address)) { +//            var tlsParams = new TLSClientParameters(); +//            tlsParams.setSSLSocketFactory(createSSLContext().getSocketFactory()); +//            conduit.setTlsClientParameters(tlsParams); +//        } + +        return (App2ZusePort) proxy; +    } + +//    private SSLContext createSSLContext() { +//        java.util.Properties props = new Properties(); +//        props.entrySet(); +// +//        // return SSLUtils.getPropertiesSSLContext(this.props, this.configDir, this.propsPrefix, forceTrustAllManager); +//        return null; +//    } + +    private boolean addressIsHttps(String address) { +        return address.startsWith("https://");      }  } diff --git a/src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java b/src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java new file mode 100644 index 0000000..9884bd5 --- /dev/null +++ b/src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java @@ -0,0 +1,14 @@ +package at.gv.egiz.moazs.msg; + +import at.gv.zustellung.app2mzs.xsd.ConfigType; +import at.gv.zustellung.msg.xsd.DeliveryRequestType; +import org.springframework.stereotype.Component; + +@Component +public class MsgClientFactory { + +    public MsgClient create(DeliveryRequestType msgRequest, ConfigType config) { +        return new MsgClient(msgRequest, config); +    } + +} diff --git a/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java b/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java index 3d7f8e9..bfd05b2 100644 --- a/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java +++ b/src/main/java/at/gv/egiz/moazs/pipeline/SameThreadDeliveryPipeline.java @@ -2,6 +2,7 @@ package at.gv.egiz.moazs.pipeline;  import at.gv.egiz.moazs.msg.MsgClient; +import at.gv.egiz.moazs.msg.MsgClientFactory;  import at.gv.egiz.moazs.tnvz.TnvzClient;  import at.gv.egiz.moazs.repository.DeliveryRepository;  import at.gv.egiz.moazs.scheme.Mzs2MsgConverter; @@ -27,17 +28,17 @@ public class SameThreadDeliveryPipeline implements DeliveryPipeline {      private final DeliveryRepository repository;      private final TnvzClient tnvzClient;      private final Mzs2MsgConverter converter; -    private final MsgClient msgClient; +    private final MsgClientFactory msgClientFactory;      @Autowired      public SameThreadDeliveryPipeline(DeliveryRepository repository,                                        TnvzClient tnvzClient,                                        Mzs2MsgConverter converter, -                                      MsgClient msgClient) { +                                      MsgClientFactory msgClientFactory) {          this.repository = repository;          this.tnvzClient = tnvzClient;          this.converter = converter; -        this.msgClient = msgClient; +        this.msgClientFactory = msgClientFactory;      }      @Override @@ -48,7 +49,8 @@ public class SameThreadDeliveryPipeline implements DeliveryPipeline {                  ? converter.convert(mzsRequest, queryPerson(mzsRequest))                  : converter.convert(mzsRequest); -        var status = msgClient.send(msgRequest, mzsRequest.getConfig()); +        var msgClient = msgClientFactory.create(msgRequest, mzsRequest.getConfig()); +        var status = msgClient.send();          repository.add(status);      } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index a59c460..d43e7dc 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -13,9 +13,31 @@ spring:  # Order: DeliveryRequest/Config > [chosen-profile] > default  delivery-request-configuration-profiles:    default: +    ## All parameters for MSG client.      msg: -      url: http://localhost:8081/ -      x509: todo! + +      ## How to reach +      url: http://localhost:8081/services/DeliveryRequest +      ssl: + +        ## Parameters for ssl client auth +        keystore: +          ## Absolute path to file +          filename: +          ## Password to unlock key store. +          password: 1233 +          ## JKS or PKCS12 +          type: JKS + +        ## Boolean; if true, app will trust all server certificates; +        ## if false, server certificate needs to be in truststore. +        trustall: false + +        ## Boolean; if true, app ignores mismatches between server's host name and +        ## Certificate's common name / alternative subject name. +        laxhostnameverification: false + +      perform-query-person-request: false    app-profile-1: @@ -27,7 +49,20 @@ delivery-request-configuration-profiles:      msg:        url: https://msg-url2.com +key-store-profiles: +  msg-key-store: + + + +  ## If set to false, moa zs ignores an incomplete default DeliveryRequest-configuration  ## profile and continues startup. See 'delivery-request-configuration-profiles'.  ## Default value: true -# verify-completeness-of-default-delivery-request-configuration: false
\ No newline at end of file +# verify-completeness-of-default-delivery-request-configuration: false + + +#  ssl.keystore.file=../keys/www.egiz.gv.at.p12 +#  egovutil.mis.ssl.keystore.password=OSgmSn! +#  egovutil.mis.ssl.keystore.type=PKCS12 +#  egovutil.mis.ssl.trustall=true +#  egovutil.mis.ssl.laxhostnameverification=false
\ No newline at end of file diff --git a/src/test/java/at/gv/egiz/moazs/MsgClientTest.java b/src/test/java/at/gv/egiz/moazs/MsgClientTest.java index 6dc94e0..5b6419f 100644 --- a/src/test/java/at/gv/egiz/moazs/MsgClientTest.java +++ b/src/test/java/at/gv/egiz/moazs/MsgClientTest.java @@ -1,6 +1,7 @@  package at.gv.egiz.moazs;  import at.gv.egiz.moazs.msg.MsgClient; +import at.gv.egiz.moazs.msg.MsgClientFactory;  import at.gv.egiz.moazs.scheme.Marshaller;  import at.gv.zustellung.app2mzs.xsd.ConfigType;  import at.gv.zustellung.msg.xsd.DeliveryRequestType; @@ -28,25 +29,41 @@ public class MsgClientTest {      private final static Logger logger = LoggerFactory.getLogger(MsgClient.class); -    private final String serviceUri = "http://localhost:8081/services/DeliveryRequest"; +    private String httpServiceUri =  "http://localhost:8081/services/DeliveryRequest"; +    private String sslServiceUri = "https://localhost/zusemsg/services/DeliveryRequest"; +      private final String basePath = "src/test/resources/at/gv/egiz/moazs/MsgClientTest/"; +    private MsgClientFactory factory = new MsgClientFactory(); +      @Autowired      private Marshaller msgMarshaller;      private static final ObjectFactory OF = new ObjectFactory(); -    // this test requires that a zusemsg service runs under serviceUri! +    // this test requires that a zusemsg service runs under httpServiceUri!      @Test      public void sendValidMessage() throws IOException {          var request = loadFromFile("validDeliveryRequest.xml"); -        var config = generateConfig(); -        var client = new MsgClient(); +        var config = generateConfig(httpServiceUri); +        var client = factory.create(request, config); + +        var status = client.send(); + +        logger.info("status: " + msgMarshaller.marshallXml(OF.createDeliveryRequestStatus(status))); +    } + +    //@Test +    public void sendValidMessageToSSL() throws IOException { + +        var request = loadFromFile("validDeliveryRequest.xml"); +        var config = generateConfig(sslServiceUri); +        var client = factory.create(request, config); -        var status = client.send(request, config); +        var status = client.send();          logger.info("status: " + msgMarshaller.marshallXml(OF.createDeliveryRequestStatus(status)));      } @@ -58,10 +75,10 @@ public class MsgClientTest {          }      } -    private ConfigType generateConfig() { +    private ConfigType generateConfig(String zuseUrl) {          var server = serverTypeBuilder() -                .withZUSEUrlID(serviceUri) +                .withZUSEUrlID(zuseUrl)                  .build();          return configTypeBuilder() diff --git a/src/test/java/at/gv/egiz/moazs/SameThreadDeliveryPipelineTest.java b/src/test/java/at/gv/egiz/moazs/SameThreadDeliveryPipelineTest.java index 9ee3ceb..5e4b9b0 100644 --- a/src/test/java/at/gv/egiz/moazs/SameThreadDeliveryPipelineTest.java +++ b/src/test/java/at/gv/egiz/moazs/SameThreadDeliveryPipelineTest.java @@ -1,6 +1,7 @@  package at.gv.egiz.moazs;  import at.gv.egiz.moazs.msg.MsgClient; +import at.gv.egiz.moazs.msg.MsgClientFactory;  import at.gv.egiz.moazs.pipeline.DeliveryPipeline;  import at.gv.egiz.moazs.pipeline.SameThreadDeliveryPipeline;  import at.gv.egiz.moazs.repository.DeliveryRepository; @@ -46,6 +47,9 @@ public class SameThreadDeliveryPipelineTest {      private TnvzClient tnvzClient;      @Mock +    private MsgClientFactory msgClientFactory; + +    @Mock      private MsgClient msgClient;      @Mock @@ -56,7 +60,7 @@ public class SameThreadDeliveryPipelineTest {      @Before      public void setup() { -        pipeline = new SameThreadDeliveryPipeline(repository, tnvzClient, converter, msgClient); +        pipeline = new SameThreadDeliveryPipeline(repository, tnvzClient, converter, msgClientFactory);      }      @Test @@ -129,7 +133,8 @@ public class SameThreadDeliveryPipelineTest {          when(tnvzClient.queryPerson(any(), any())).thenReturn(setupTnvzSuccess(acceptedTypes));          when(converter.convert(eq(mzsRequest)       )).thenReturn(msgRequest);          when(converter.convert(eq(mzsRequest), any())).thenReturn(msgRequest); -        when(msgClient.send(msgRequest, mzsRequest.getConfig())).thenReturn(status); +        when(msgClientFactory.create(msgRequest, mzsRequest.getConfig())).thenReturn(msgClient); +        when(msgClient.send()).thenReturn(status);          return status; | 
