Premier Training & Business Partner Red Hat

JBoss EAP-7.0 – creare un listener https in Undertow

EXTRAORDY
Ti piacerebbe diventare anche tu uno di noi e
pubblicare i tuoi articoli nel blog degli RHCE italiani?

Da pochi giorni è stata rilasciata la beta1 di JBoss EAP 7.0. La nuova versione del popolare application server open source nasce dal progetto community Wildfly (ex JBoss Application Server). Si possono vedere le numerose novità qui nelle release notes.

Una delle cose che si può apprezzare maggiormente ad una prima esecuzione è la nuovissima Management Console che finalmente rispecchia, per organizzazione logica, i nodi della CLI.

Schermata 2016-01-20 alle 23.10.05

Schermata 2016-01-23 alle 19.56.42

Il secondo screenshot punta, non proprio casualmente, al nuovo web subsystem di JBoss EAP 7.0: Undertow. Undertow è un web server leggero scritto in java e integrato come estensione in Wildfly dalla versione 8 in poi. Tra le principali caratteristiche dichiarate:

  • Leggero e performante
  • HTTP/2
  • HTTP Upgrade (possibilità di fare multiplexing di più protocolli sulla porta HTTP)
  • Supporto per il protocollo Web Sockets
  • Supporto per Servlet 3.1
  • Reverse Proxy

 

In particolare il supporto per il nuovo protocollo HTTP/2 rende Undertow molto più perfornamante. Questo perché abbiamo un protocollo binario che supporta Multiplexing (possibilità di gestire più richiste in parallelo all’interno di una sessione), Header Compression, e una nuova feature denominata Server Push, che permette ai server di inviare dati alla cache dei client prima ancora che ne facciano richiesta.

In Undertow si introduce il concetto di listener che è simile al connector del web subsystem di AS7/EAP6.x. Tutte le richieste arrivano ad un listener che può essere di tipo http, https, ajp, spdy.

In una nuova installazione è abilitato soltanto l’http listener. Vediamo come configurare un listener https con un certificato self-signed. Un certificato self-signed è generato dal server stesso ma non convalidato da una Certification Authority. Per rendere le cose leggermente più interessanti, faremo il tutto utilizzando la modalità domain di JBoss EAP, anziché la standalone. Ricordo che dalla versione 6.0 di EAP il domain mode è stato introdotto in EAP 6.0 ed è stato un importante passo in avanti dal punto di vista della semplificazione di gestione di istanze multiple.

Ma ora torniamo al nostro certificato: per generarlo useremo keytool, un’utility Java per la gestione di chiavi pubbliche/private e di certificati. Con keytool possiamo generare dei keystore contenenti le chiavi private e i certificati necessari.

keytool -genkey -alias srvcert -keyalg RSA -sigalg MD5withRSA \
-keystore srv.jks -storepass extraordy -keypass extraordy -validity 365

Seguirà una serie di domande interattive in cui passeremo credenziali per la creazione di un Distinguished Name da incorporare nel certificato.
Alla fine otterremo un file keystore nominato srv.jks. Copiamo il file nella directory corrispondente alla proprietà jboss.domain.config.dir. Questa, in modalità domain, corrisponde alla directory “configuration” dell’host. E’ importante notare che il certificato andrà copiato nella configuration di OGNI host.
Nota per la modalità standalone: Se lavorassi in questa modalità potrei usare la proprietà jboss.server.config.dir e copiare il file nella directory standalone/configuration.

Una volta fatto cià dobbiamo definire un Security Realm per Undertow. Questa è una novità rispetto alla configurazione del connector https in EAP-6.x, dove si crea prima il connector e successivamente si customizzavano i parametri ssl in un nodo inferiore a quest’ultimo. In EAP-7.0 se non si definisce prima il Security Realm (che conterrà il puntamento al nostro keystore), non è possibile creare il nuovo listener https.

Il nuovo Security Realm va creato a nei vari host.xml all’interno dei tags <SecurityRealms></SecurityRealms>. Qui troveremo già i due Security Realm ManagementRealm e ApplicationRealm.

 

<security-realm name="UndertowRealm">
    <server-identities>
        <ssl>
            <keystore path="srv.jks" relative-to="jboss.domain.config.dir" keystore-password="extraordy" alias="srvcert" key-password="extraordy"/>
        </ssl>
    </server-identities>
</security-realm>

Come si può vedere il blocco contiene il path e le informazioni del nostro keystore.

Finalmente possiamo generare il nuovo listener https sotto il subsystem Undertow.
Poiché stiamo lavorano in domain mode il listener va configurato per ogni profilo o perlomeno sotto i profili utilizzati dai server group definiti.
Nel presente esempio si è utilizzato un server group che utilizza il profilo “full”. Per chi non lo sapesse ricordiamo il profilo full abilita il subsystem di messaging (HornetQ in EAP-6.x e ActiveMQ Artemis in EAP-7.0).

Invece di editare l’XML possiamo effettuare questa operazione direttamente dalla CLI. Quest’ultima ha vari vantaggi rispetto alla modifica diretta dell’XML. Oltre a usufruire dei comodissimi completamenti automatici, la possibilità di fare typo che possano causare errori di parsing del file è abbastanza limitata.
Per accedervi il comando da digitare è:

/jboss-cli.sh --connect --controller=

Una volta entrati nella CLI si può eseguire il comando per la configurazione del nuovo listener.

:take-snapshot
/host=host1:take-snapshot
/profile=full/subsystem=undertow/server=default-server/https-listener=https:add(socket-binding=https, security-realm=UndertowRealm)

Con i primi due comandi ho creato uno snapshot del domain.xml, (che viene salvato nella directory domain_xml_history) e uno snapshot dell’host-slave.xml di host1 (salvato nella directory host_xml_history). In qualsiasi momento si potrà fare rollback a queste due versioni dei file.
Successivamente eseguiamo il comando di creazione del nuovo listener. Dovremo definire almeno due parametri obbligatori: il security-realm che abbiamo definito precedentemente e il socket-binding che in questo caso sarà https. Ricordiamo che un socket-binding definisce un mapping ad una specifica porta, in questo caso la 8443.I socket-binding in domain mode sono organizzati in gruppi contestuali detti socket-binding-group. Esistono di default (ma possiamo crearne di altri) quattro socket-binding-group: standard-sockets, full-sockets, full-ha-sockets, ha-sockets.

A questo punto la configurazione è completa: possiamo testare il nuovo listener https
In questo caso il server che utilizzo ha port-offset=0 e quindi risponderà sulla porta 8443. Posso raggiungerlo all’url https://<HOST_IP_ADDRESS>:8443. Ovviamente il browser ci avviserà che la connessione in questione non è sicura in quanto proveniente da un server che utilizza un certificato self-signed: è possibile visualizzare il certificato e riconoscere i dati che abbiamo immesso durante l’esecuzione del keytool.
Una volta aggiunta l’eccezione potremo finalmente visualizzare la welcome page di JBoss EAP 7.

Schermata 2016-01-23 alle 20.00.39

Info about author

EXTRAORDY