Visualizzazione post con etichetta TOMCAT. Mostra tutti i post
Visualizzazione post con etichetta TOMCAT. Mostra tutti i post

lunedì 24 agosto 2015

Tomcat LDAP

Per configurare Tomcat in LDAP (es. accesso active directory) è sufficiente:

1) definire il Realm JNDI dentro il file conf/server.xml

2) mettere la web application in sicurezza via web.xml

Per recuperare lo username loggato si può utilizzare il metodo getUserPrincipal() dell'oggetto HttpServletRequest.

Per prima cosa è necessario conoscere l'indirizzo IP del nostro server Ldap. Se siamo in una intranet possiamo da dos lanciare il comando nslookup.

Per configurare il realm inserire il seguente xml (la porta di default è la 389 verificare comunque presso il proprio ambiente):

 <Realm className="org.apache.catalina.realm.JNDIRealm" 
      connectionURL="ldap://[IP]:389/" debug="99" userPattern="{0}"/>


Per il valore debug si noti che un valore alto genera un maggiore dettaglio di log. Al valore 0 corrisponde nessun log.
userPattern definisce invece il DN (Distinguished Name) .

Nel web.xml dell'applicazione web invece inseriamo il security constraint :

 <security-role>
        <role-name>*</role-name>
    </security-role>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>
                Applicazione
            </web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>*</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>INSERIRE CREDENZIALI ACCESSO PC</realm-name>
    </login-config>


All'utente sarà richiesto quindi di autenticarsi solo la prima volta in modalità BASIC auth, e bisognerà immettere le credenziali di accesso al pc in LAN.

mercoledì 29 aprile 2015

BAT per stop Tomcat clean directory e restart servizio

Con questo script è possibile stoppare tomcat ripulire le directory e fare il restart.
E' meglio utilizzare il comando NET START o NET STOP piuttosto che sc in quanto sc è asincrono per cui si rischia vada in errore la cancellazione dei file.
Lo script è il seguente:


    @echo OFF

    set CATALINA_HOME=D:\lavoro\apache-tomcat-7.0.53
    net stop TomcatService
   
    
    

    echo removing work
    rmdir /S /Q "%CATALINA_HOME%\work"
    echo making new work dir
    mkdir "%CATALINA_HOME%\work"
 
    echo removing temp
    rmdir /S /Q "%CATALINA_HOME%\temp"
    echo making new temp dir
    mkdir "%CATALINA_HOME%\temp"
 
    echo removing logs
    rmdir /S /Q "%CATALINA_HOME%\logs"
    echo making new logs dir
    mkdir "%CATALINA_HOME%\logs"
 
    echo starting tomcat service
  
    net start TomcatService


sabato 14 giugno 2014

Tomcat7 cifrare password per autenticazione basic web application

Per abilitare l'autenticazione BASIC (con prompt del browser per username e password) in una web application occorre agire sul web.xml e quindi sull'application server.
In Tomcat è possibile utilizzare il file tomcat-users.xml presente nella directory conf di Tomcat.
Ad esempio supponiamo di avere il seguente codice nel web.xml della nostra web app:

 <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Richiesta autenticazione per gestione utenze</realm-name>
  </login-config>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>restricted methods</web-resource-name>
      <url-pattern>/index.jsf</url-pattern>
      <http-method>GET</http-method>
      <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>APP_ADMIN</role-name>
    </auth-constraint>
  </security-constraint>
  <security-role>
    <role-name>APP_ADMIN</role-name>
  </security-role>


Quindi nel Tomcat devono essere definite le credenziali dell'utente APP_ADMIN.

Tipicamente nel file tomcat-users.xml si inseriranno le seguenti indicazioni:


<role rolename="LEASING_ADMIN"/>
  <user password="qawsedrf" roles="APP_ADMIN" username="master"/>


Come possiamo vedere l'inconveniente di questo approccio è che la password è memorizzata in chiaro dentro Tomcat.

E' possibile cifrare la password utilizzando i seguenti algoritmi di cifratura
  • SHA;
  • MD2;
  • MD5 
Si può utilizzare l'utility digest.bat per cifrare la password (digest.sh su sistemi linux).
Digitando quindi da prompt di dos il comando

digest.bat -a md5 qawsedrf  

premendo invio si ottiene la risposta

qawsedrf:d1c2dcfcbfd41ce1103a25475b64f7a5

Quindi dobbiamo inserire la password cifrata al posto di quella in chiaro nel tomcat-users.xml.

Ora dobbiamo comunicare a Tomcat che la modalità di controllo password deve passare per un hash md5 della password digitata dall'utente.

Nel file conf/server.xml occorre cercare il Realm UserDataBaseRealm ed inserire l'attributo digest="md5" in questo modo:

<Realm className="org.apache.catalina.realm.LockOutRealm">
    <!-- This Realm uses the UserDatabase configured in the global JNDI
         resources under the key "UserDatabase".  Any edits
         that are performed against this UserDatabase are immediately
         available for use by the Realm.  -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" digest="md5"/>
</Realm>



martedì 4 febbraio 2014

Tomcat 7 web console

Per attivare la web console di tomcat occorre che siano presenti nel file

[TOMCAT_DIR]/conf/tomcat-users.xml

le seguenti voci:



  <role rolename="tomcat"/>
 <role rolename="manager-gui"/>
  <user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/>


Quindi in console cliccando su Manager App verranno chieste le credenziali (in questo caso tomcat tomcat) in modalità basic (con il pop up sul browser).
E si può accedere e deployare/undeployare le applicazioni.

Alcune accortezze (se il tomcat è su sistemi windows ed è su un server remoto):

1) Modificare il file [TOMCAT_DIR]/conf/context.xml aggiungendo i 2 attributi antiJARLocking e antiResourceLocking a true:


<Context antiJARLocking="true"
      antiResourceLocking="true">


2) Nel file [TOMCAT_DIR]/webapps/manager/WEB-INF/web.xml innalzare il limite del multipart config (il default è 50 MB) per consentire l'upload anche di war più grossi

Es:

 <multipart-config>

            <!-- 90MB max -->

            <max-file-size>91798008</max-file-size>

            <max-request-size>91798008</max-request-size>

            <file-size-threshold>0</file-size-threshold>

          </multipart-config>


giovedì 28 novembre 2013

Tomcat 7 personalizzare parametri allo start up

Per modificare dei parametri specifici per un singolo Tomcat (es per cambiare il path oppure per definire una variabile di utilità) occorre modificare lo script startup.bat inserendo all'inizio istruzioni di questo tipo. Qui cambiamo la CATALINA_HOME, inseriamo un percorso diverso dallo standard nel path e definiamo una variabile di ambiente valida solo per questo tomcat senza definirla sul S.O.:


set CATALINA_HOME=d:\prove\apache-tomcat-7.0.39
set path=d:\miaDirectory;%path%
set @TESTVARIABILE=c:\pippo 

sabato 23 novembre 2013

Tomcat 7 settare connessione HTTPS

In questo post vediamo come:
  1. Creare un certificato per l'https;
  2. Visionare le caratteristiche del certificato;
  3. Configurare Tomcat 7 in modo da poter rispondere in https.
CREARE UN CERTIFICATO PER L'HTTPS

 Per effettuare questa operazione si utilizza la JDK 1.6, in particolare il programma keytool.
L'opzione -keystore consente di specificare dove creare il file. Attenzione è obbligatorio specificare un nome di file; va bene anche se non esistente, l'importante è che non sia  una directory la procedura va in errore dicendo "Errore keytool: java.lang.Exception: Il file keystore esiste ma Þ vuoto: c:\lav\certificati"

Da cmd:

C:\lav\ApplicationServers\apache-tomcat-7.0.23\bin>keytool -genkey -alias carlo
-keyalg RSA -keystore c:\lav\certificati\certificato.txt
Immettere la password del keystore:
Immettere nuovamente la nuova password:
Specificare nome e cognome
 [Unknown]:  MARIO BREGA
Specificare il nome dell'unitÓ aziendale
 [Unknown]:  AZIENDA ABC
Specificare il nome dell'azienda
 [Unknown]:  AZIENDA TEST
Specificare la localitÓ
 [Unknown]:  ROMA
Specificare la provincia
 [Unknown]:  RM
Specificare il codice a due lettere del paese in cui si trova l'unitÓ
 [Unknown]:  IT
Il dato CN=MARIO BREGA, OU=AZIENDA ABC, O=AZIENDA TEST, L=ROMA, ST=RM, C=IT Þ co
rretto?
 [no]:  s

Immettere la password della chiave per <carlo>
        (INVIO se corrisponde alla password del keystore):


VISIONARE LE CARATTERISTICHE DEL CERTIFICATO

Sempre utilizzando la keytool con l'opzione -list e specificando il keystore è possibile visionare le caratteristiche del certificato appena creato:


C:\lav\ApplicationServers\apache-tomcat-7.0.23\bin>keytool -list -keystore c:\la
v\certificati\certificato.txt
Immettere la password del keystore:

Tipo keystore: JKS
Provider keystore: SUN

Il keystore contiene 1 entry

carlo, 23-nov-2013, PrivateKeyEntry,
Impronta digitale certificato (MD5): F5:F9:15:AB:98:31:2D:19:C3:65:5C:EF:EA:7E:4
8:B1


CONFIGURARE TOMCAT7 IN HTTPS

Per configurare Tomcat7 in modo da essere raggiungibile in HTTPS con il certificato appena creato è sufficiente agire sul file server.xml presente nella directory conf dell'application server.
Bisogna scommentare il nodo Connector dove troviamo il commento:
Define a SSL HTTP/1.1 Connector on port 8443 e modificarlo nel nostro caso così:

 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" keystorePass="xxxx" keystoreFile="c:\lav\certificati\certificato.txt "
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />


aggiungendo le opzioni keystoreFile e keystorePass.

Per testare il tutto è sufficiente andare via browser all'indirizzo https://localhost:8443. Il certificato ovviamente non è trusted e quindi dovremmo aggiungere una eccezione di sicurezza al browser per accettarlo.

venerdì 19 luglio 2013

Exception in thread "main" java.lang.NoSuchMethodError: javax.xml.ws.WebFault.messageName()Ljava/lang/String

Questo errore si è verificato nell'interrogazione di un web service scritto utilizzando JAX-WS 2.2.8
su un Tomcat 7 con la jdk 1.6.
Il problema è che di default la jdk 1.6 utilizza JAX.WS 2.1 e  l'attributo messageName sulla annotation javax.xml.ws.WebFault è stato introdotto solo con la versione JAX WS 2.2.
Per risolverlo ho utilizzato il sistema delle librerie endorsed di Tomcat.
I passi da seguire sono abbastanza semplici.
Bisogna creare una directory denominata endorsed dentro la root di Tomcat,tipicamente allo stesso livello della cartella webapps.
Qui dentro bisogna inserire i 2 jar (versione 2.2 ovviamente):

  • jaxb-api.jar;
  • jaxws-api.jar

Occorre poi verificare che la variabile java.endorsed.dirs punti correttamente alla nostra directory.
Ad esempio nei parametri di start up del servizio (nel tab java se lanciamo l'utiliti tomcat7w.exe //ES//nomeServizio) assicuriamoci che ci sia il seguente settaggio:

 -Djava.endorsed.dirs=D:\lavoro\apache-tomcat-7.0.3\endorsed

martedì 14 maggio 2013

Problemi installazione Tomcat 7 come servizio su Windows 7 (64 bit)

Installando Tomcat 7 come servizio nella consueta maniera (utilizzando il service.bat) avevo il seguente errore allo start up del servizio:

"Windows could not start the Crowd (Apache Tomcat) on Local Computer. For more information, review the System Event Log. If this is a non-Microsoft service, contact the service vendor, and refer to service-specific error code 0."

Ho provato a seguire le istruzione contenute qui ma non sono riuscito a farlo funzionare.
Allora ho confrontato il servizio con un servizio a 32 bit già installato, utilizzando la modalità vista qui

Ho notato che mancavano i seguenti parametri sul tab Java:

Java Virtual Machine

Java ClassPath

Ho quindi inserito a mano sulla console del servizio i parametri:

Java Virtual Machine: C:\Program Files\Java\jdk1.6.0_20\jre\bin\server\jvm.dll
Java Classpath:  D:\apache-tomcat-7.0.39\bin\bootstrap.jar;D:\apache-tomcat-7.0.39\bin\tomcat-juli.jar;D:\apache-tomcat-7.0.39\bin\tomcat-juli.jar

Come nell'immagine sottostante


A questo punto il servizio è ripartito correttamente.

mercoledì 20 marzo 2013

Tomcat - IOException while loading persisted sessions

Questo errore si verifica quando Tomcat non riesce a ripristinare il valore della sessione.
Tale valore si trova in un file serializzato denominato SESSION.ser all'interno della directory work di Tomcat.
E' necessaria la pulizia della directory work o anche la sola cancellazione del file .ser.


lunedì 28 gennaio 2013

Tomcat 7 installato come servizio modificare heap size

Per modificare e/o monitorare la quantità di memoria allocata dal servizio sotto Windows si utilizza l'utility tomcat7w.exe in questo modo:
  1. Prendere nota del nome del servizio;
  2. Posizionarsi via shell sotto la directory bin;
  3. Digitare il comando tomcat7w.exe  //ES//[NOME_SERVIZIO].

Appare la seguente schermata:



Quindi selezionare il tab JAVA e modificare i valori minimi e massimi del pool di memoria


Per tenere sempre sotto monitoraggio il servizio ed accedervi successivamente sempre da shell digitiamo:

tomcat7w.exe  //MS//[NOME_SERVIZIO]

A questo punto accedendo al server in basso si potrà notare l'icona di Tomcat e con un semplice doppio click si riesce ad accedere al pannello di controllo del servizio sopra mostrato.

martedì 6 novembre 2012

Tomcat 7 : [org.apache.xml.resolver.tools.ResolvingXMLReader]

Sono incappato nel seguente errore allo start up di Tomcat 7 (jdk 1.7 di riferimento).


Unable to load class [org.apache.xml.resolver.tools.ResolvingXMLReader] 
to check against the @HandlesTypes annotation of one or more ServletContentInitializers. 
java.lang.ClassNotFoundException: org.apache.xml.resolver.tools.ResolvingXMLReader

L'errore si ripeteva in continuazione e di fatto il war che stavo provando (un web service) non veniva deployato.
Il web.xml era versione 3.0.
La soluzione del problema è mettere il seguente attributo dentro il nodo web-app del web.xml:

metadata-complete="true"

Questo attributo dice al server di non scansionare tutta la directory web-inf/lib alla ricerca di annotazioni compatibili con il modello di servlet 3.0.
Un vantaggio di questo attributo inoltre è che migliora di molto la velocità dell'application server allo start up.

giovedì 1 novembre 2012

Installare Tomcat 7 come servizio windows rinominandolo

Per installare Tomcat 7 come servizio occorre andare da command sulla bin del server e digitare

>> service.bat install
Per installarlo mentre per disinstallarlo


>> service.bat uninstall
Se vogliamo rinominarlo possiamo editare il file service.bat oppure farne una copia, quindi inserire nelle linee


rem Set default Service name
set SERVICE_NAME=Tomcat7
set PR_DISPLAYNAME=Apache Tomcat 7

Il SERVICE_NAME e il PR_DISPLAYNAME che si desidera.
Il  PR_DISPLAYNAME è quello che si vedrà andando sulla lista dei servizi di windows

domenica 13 maggio 2012

Definire Data Source su Tomcat 4.1

Con Tomcat 4 non è possibile definire i datasource nel file context.xml (dentro la META-INF del war); o quantomeno così facendo sono incappato in errori del tipo "Cannot create JDBC driver of class '' for connect URL 'null'" (in molti hanno avuto questi problemi).
Seguendo il tutorial presente sul sito sono riuscito a definire un datasource specifico per una web application.
I passi da seguire sono:
  1. Scaricare il driver per la connessione JDBC e posizionarlo nella directory commons/lib dell'AS;
  2. Modificare il file conf/server.xml definendo il contesto dell'applicazione e il datasource;
  3. Inserire all'interno del web.xml della web application il nodo <resource-ref> (altrimenti si incappa in errori del tipo "JDBC not bound").
 Vediamo in dettaglio i passi 2 e 3 e poi un esempio di chiamata da una servlet per recuperare la connection.
Il db di test è Mysql

Punto 2

All'interno del conf/server.xml, dopo la chiusura dell'ultimo nodo </Context>  e prima della chiusura del nodo </Host>, inserire il seguente xml (NOTA : TestDs è il nome della nostra Web App mentre jdbc/TestDB è il nome del datasource):

<Context path="/TestDs" docBase="TestDs"
        debug="5" reloadable="true" crossContext="true">

  <Logger className="org.apache.catalina.logger.FileLogger"
             prefix="localhost_DBTest_log." suffix=".txt"
             timestamp="true"/>

  <Resource name="jdbc/TestDB"
               auth="Container"
               type="javax.sql.DataSource"/>

  <ResourceParams name="jdbc/TestDB">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>

    <!-- Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to -1 for no limit.
         -->
    <parameter>
      <name>maxActive</name>
      <value>100</value>
    </parameter>

    <!-- Maximum number of idle dB connections to retain in pool.
         Set to 0 for no limit.
         -->
    <parameter>
      <name>maxIdle</name>
      <value>30</value>
    </parameter>

    <!-- Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->
    <parameter>
      <name>maxWait</name>
      <value>10000</value>
    </parameter>

    <!-- MySQL dB username and password for dB connections  -->
    <parameter>
     <name>username</name>
     <value>root</value>
    </parameter>
    <parameter>
     <name>password</name>
     <value>root</value>
    </parameter>

    <!-- Class name for mm.mysql JDBC driver -->
    <parameter>
       <name>driverClassName</name>
       <value>org.gjt.mm.mysql.Driver</value>
    </parameter>

    <!-- The JDBC connection url for connecting to your MySQL dB.
         -->
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://localhost:3306/world</value>
    </parameter>
  </ResourceParams>
</Context>

Punto 3

Nel web.xml inserire:

 <resource-ref>
    <description>nome jndi del ds</description>
    <res-ref-name>jdbc/TestDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

Per richiamare il datasource dall'applicazione è sufficiente inserire il seguente codice:

 Context context = new InitialContext();
javax.sql.DataSource ds =(javax.sql.DataSource)context.lookup("java:comp/env/jdbc/TestDB");
 Connection connection = ds.getConnection();

NOTA: Con Tomcat 6 e 7 è possibile inserire una notazione più compatta del ds con una serie di attributi che specificano i vari username password url etc. , ho provato anche con tomcat 4.1 ma non mi ha funzionato per cui deduco che non sia possibile