web-dev-qa-db-fra.com

Où placer web.xml en dehors du fichier WAR pour une redirection sécurisée?

J'exécute Tomcat 7 et déploie un ensemble d'applications fournies par une tierce partie sous forme de fichiers WAR.

Je voudrais forcer certains de ces applications à toujours utiliser SSL. (Toutes les applications "SSL" appartiennent à un service; les autres applications en dehors de cette discussion font partie d'un autre service.)

J'ai compris comment utiliser conf\web.xml pour rediriger les applications de HTTP vers HTTPS, mais cela s'applique à toutes les applications hébergées par Tomcat. J'ai également compris comment mettre web.xml dans le répertoire d'une application décompressée web-inf; cela fait l'affaire pour cette application spécifique, mais risque d'être écrasé si notre fournisseur nous donne un nouveau fichier war à déployer.

J'ai également essayé de placer le fichier web.xml à différents endroits sous conf\service\Host, ou sous appbase, mais aucun ne semble travail.

Est-il possible de rediriger certaines applications vers SSL sans forcer toutes les applications à être redirigées, ou de placer le fichier web.xml dans le fichier WAR extrait?

Voici mon server.xml:

<Service name="secure">
    <Connector port="80" connectionTimeout="20000" redirectPort="443"
        URIEncoding="UTF-8" enableLookups="false" compression="on"
        protocol="org.Apache.coyote.http11.Http11Protocol"
        compressableMimeType="text/html,text/xml,text/plain,text/javascript,application/json,text/css"/>
    <Connector port="443"
        URIEncoding="UTF-8" enableLookups="false" compression="on"
        protocol="org.Apache.coyote.http11.Http11Protocol"
        compressableMimeType="text/html,text/xml,text/plain,text/javascript,application/json,text/css"
        scheme="https" secure="true" SSLEnabled="true" sslProtocol="TLS"
        keystoreFile="..." keystorePass="..." keystoreType="PKCS12" 
        truststoreFile="..." truststorePass="..." truststoreType="JKS"
        clientAuth="false" 
        ciphers="SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_AES_128_CBC_SHA"/>
    <Engine name="secure" defaultHost="localhost">
        <Realm className="org.Apache.catalina.realm.UserDatabaseRealm" 
            resourceName="UserDatabase"/>
        <Host name="localhost" appBase="webapps" unpackWARs="false" 
            autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        </Host>
    </Engine>
</Service>
<Service name="mutual-secure">
    ...
</Service>

Le contenu des fichiers web.xml avec lesquels je joue est le suivant:

<web-app xmlns="http://Java.Sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0"
    metadata-complete="true">
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>All applications</web-resource-name>
                <url-pattern>/*</url-pattern>
            </web-resource-collection>
            <user-data-constraint>
                <description>Redirect all requests to HTTPS</description>
                <transport-guarantee>CONFIDENTIAL</transport-guarantee>
            </user-data-constraint>
    </security-constraint>
</web-app>

(Pour conf\web.xml, la contrainte de sécurité est ajoutée juste avant la fin du fichier existant, plutôt que de créer un nouveau fichier.)

Mon répertoire webapps (actuellement) ne contient que les fichiers WAR.

1
Silverhalide

Je ne connais pas d'endroits supplémentaires où vous pouvez avoir des fichiers web.xml pour Tomcat.

Une chose que je fais est d'exécuter Tomcat en tant que serveur secondaire sur le port 8080 derrière Apache. J'utilise mod_proxy pour inverser les domaines de proxy du port 80 d'Apache au port 8080 de Tomcat. De cette façon, je peux mettre tout le SSL sur Apache et configurer Apache pour les redirections non SSL à l'aide d'hôtes virtuels. Ainsi, la logique du protocole SSL est configurée séparément et en dehors du contrôle des applications Web.

1