web-dev-qa-db-fra.com

Wildfly 9 http à https

Je souhaite rediriger la demande de HTTP vers HTTPS. J'utilise wildfly 9. Après une recherche sur google, j'ai trouvé ce qui suit, mais cela ne fonctionne pas. J'espère que quelqu'un

<subsystem xmlns="urn:jboss:domain:undertow:2.0">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https"/>
        <https-listener name="https" socket-binding="https" security-realm="SSLRealm"/>
        <Host name="default-Host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
        </Host>
    </server>
    <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <filters>
        <response-header name="server-header" header-name="Server" header-value="WildFly/9"/>
        <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
    </filters>
</subsystem>
21
phil

Tout d'abord, je fonde cela sur WildFly 9.0.1.Final et je suppose que vous essayez simplement d'activer SSL via HTTPS et que vous ne vous inquiétez pas de l'authentification. Je viens de passer environ une journée à tout comprendre. Utilisez cette documentation:

https://docs.jboss.org/author/display/WFLY9/Admin+Guide

La première chose que vous voulez faire est de créer votre magasin de clés comme indiqué dans la documentation.

https://docs.jboss.org/author/display/WFLY9/Admin+Guide#AdminGuide-EnableSSL

La question vraiment importante pour répondre correctement est celle qui demande votre prénom et votre nom. Là, vous devez mettre le nom d'hôte du serveur d'applications (par exemple localhost). Ouvrez une fenêtre de terminal dans le dossier {jboss.home}/standalone/configuration et entrez la commande suivante:

keytool -genkey -alias MY_ALIAS -keyalg RSA -keystore MY_KEYSTORE_FILENAME -validity 365`

REMARQUE: , MY_ALIAS, MY_KEYSTORE_FILENAME et MY_PASSWORD sont arbitraires et vous pouvez les définir comme vous le souhaitez.

L'étape suivante consiste à modifier le fichier standalone-XXX.xml dans le même répertoire {jboss.home}/standalone/configuration. J'utilise le fichier standalone-full.xml , mais je pense que cela fonctionnera également pour les autres.

L'étape suivante de la documentation que j'ai liée à ci-dessus nous dit de mettre la référence du magasin de clés SSL dans ManagementRealm. Cela peut conduire à beaucoup de confusion. Aux fins de cette réponse, j'essaie d'obtenir que WildFly active SSL sur le port 8443 pour accéder à mes applications. Bien que j'aie également activé SSL pour la console de gestion (via le port 9993), c'est pour plus tard.

Je suggère de mettre les informations du fichier de clés dans ApplicationRealm comme suit:

<security-realm name="ApplicationRealm">
    <server-identities>
        <ssl>
            <keystore path="MY_KEYSTORE_FILENAME" relative-to="jboss.server.config.dir" keystore-password="MY_PASSWORD" alias="MY_ALIAS" key-password="MY_PASSWORD"/>
        </ssl>
    </server-identities>
    <authentication>
        <local default-user="$local" allowed-users="*" skip-group-loading="true"/>
        <properties path="application-users.properties" relative-to="jboss.server.config.dir"/>
    </authentication>
    <authorization>
        <properties path="application-roles.properties" relative-to="jboss.server.config.dir"/>
    </authorization>
</security-realm>

REMARQUE: , les seules modifications apportées au fichier par défaut dans cette section doivent être la balise d'identité du serveur. La balise d'authentification doit être laissée seule, sauf si vous avez d'autres raisons de la modifier).

REMARQUE: , MY_KEYSTORE_FILENAME, MY_ALIAS et MY_PASSWORD doivent correspondre aux valeurs que vous avez fournies lors de la création de la clé.

Maintenant, la documentation devient un peu délicate. Vous devez maintenant faire défiler un peu pour passer à l'étape suivante, bien que cela ne vous dise malheureusement pas de le faire. Maintenant que le magasin de clés est installé dans Wildfly et configuré dans le domaine de sécurité approprié, vous devez installer l'écouteur HTTPS et le lier au magasin de clés.

https://docs.jboss.org/author/display/WFLY9/Admin+Guide#AdminGuide-HTTPSlistener

Écouteur HTTPS

L'écouteur HTTP fournit un accès sécurisé au serveur. L'option de configuration la plus importante est le domaine de sécurité qui définit le contexte sécurisé SSL.

Malheureusement, la documentation ne reste pas cohérente avec l'attribut security-realm (précédemment en installant le magasin de clés dans ManagementRealm et en le référençant ici dans ssl-realm). Puisque j'ai mis le fichier de clés dans ApplicationRealm, nous devons le référencer comme tel.

De plus, juste pour clarifier, vous devez mettre cela dans le sous-système sous-flux . Voici ce que j'ai inséré, juste en dessous de la balise http-listener:

<https-listener name="httpsServer" socket-binding="https" security-realm="ApplicationRealm"/>

Ci-dessous, le corps complet du sous-système sous-flux .

<subsystem xmlns="urn:jboss:domain:undertow:2.0">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https"/>
        <https-listener name="httpsServer" socket-binding="https" security-realm="ApplicationRealm"/>
        <Host name="default-Host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
        </Host>
    </server>
    <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <filters>
        <response-header name="server-header" header-name="Server" header-value="WildFly/9"/>
        <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
    </filters>
</subsystem>

Et aussi, la balise socket-binding-group qui définit les ports eux-mêmes:

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
    <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
    <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
    <socket-binding name="http" port="${jboss.http.port:8080}"/>
    <socket-binding name="https" port="${jboss.https.port:8443}"/>
    <socket-binding name="iiop" interface="unsecure" port="3528"/>
    <socket-binding name="iiop-ssl" interface="unsecure" port="3529"/>
    <socket-binding name="txn-recovery-environment" port="4712"/>
    <socket-binding name="txn-status-manager" port="4713"/>
    <outbound-socket-binding name="mail-smtp">
        <remote-destination Host="localhost" port="25"/>
    </outbound-socket-binding>
</socket-binding-group>

REMARQUE: , vous remarquerez dans l'écouteur HTTPS que nous avons référencé name = "httpsServer" (cette valeur 'httpServer' est arbitraire et peut être définie sur tout ce que vous souhaite), socket-binding = "https" (cette valeur 'https' doit correspondre au socket https répertorié dans le groupe de liaison de socket) et security-realm = "ApplicationRealm" (cette valeur 'ApplicationRealm' doit être le domaine de sécurité que vous avez installé le magasin de clés).

Avec cette configuration, vous devriez constater que les ports 8443 (sécurisé) et 8080 (non sécurisé) fonctionnent tous les deux pour accéder au service d'application de WildFly. Le port 9990 (non sécurisé) fonctionne toujours pour accéder à l'interface d'administration Web, contrairement à 9993 (interface d'administration sécurisée).

CONSOLE ADMIN SÉCURISÉE

J'ai trouvé ces instructions et elles ont parfaitement fonctionné.

http://www.mastertheboss.com/jboss-server/jboss-security/securing-access-to-jboss-wildfly-management-console

La première étape consiste à créer la clé SSL:

keytool -genkeypair -alias serverkey -keyalg RSA -keysize 2048 -validity 7360 -keystore server.keystore -keypass mypassword -storepass mypassword

[~ # ~] note [~ # ~] : N'oubliez pas, le nom de votre serveur doit être utilisé lorsqu'il demande le prénom/nom.

Ensuite, configurez ManagementRealm dans le standalone-XXX.xml pour inclure le magasin de clés. Ajoutez la balise d'identités de serveur ci-dessous:

<server-identities>
    <ssl>
        <keystore path="server.keystore" relative-to="jboss.server.config.dir" keystore-password="mypassword" alias="serverkey" key-password="mypassword"/>
    </ssl>
</server-identities>

Voici à quoi ressemble le ManagementRealm complet:

<security-realm name="ManagementRealm">
    <server-identities>
        <ssl>
            <keystore path="server.keystore" relative-to="jboss.server.config.dir" keystore-password="mypassword" alias="serverkey" key-password="mypassword"/>
        </ssl>
    </server-identities>
    <authentication>
        <local default-user="$local" skip-group-loading="true"/>
        <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
    </authentication>
    <authorization map-groups-to-roles="false">
        <properties path="mgmt-groups.properties" relative-to="jboss.server.config.dir"/>
    </authorization>
</security-realm>

Ensuite, la section management-interfaces du fichier standalone-XXX.xml utilise une liaison de socket HTTP et nous voulons la lier au socket HTTPS (en particulier , le socket de gestion-https).

<management-interfaces>
    <http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
              <socket-binding https="management-https"/>
    </http-interface>
</management-interfaces>

REMARQUE: voyez comment l'interface fait référence au domaine de sécurité ManagementRealm. Je l'ai essayé en référençant simplement ApplicationRealm, sans créer de magasin de clés distinct et cela fonctionnait toujours. Il est probablement préférable de ne pas réutiliser ce code dans les deux cas.

REMARQUE: ci-dessous est la définition de socket de gestion-https référencée dans l'interface de gestion.

<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>

REMARQUE: pour n'importe quelle définition de socket, vous pouvez (si nécessaire) changer le numéro de port.

REDIRECT HTTP vers HTTPS

Dans votre fichier web.xml, insérez le morceau de code suivant dans la balise web-app.

<security-constraint>
    <web-resource-collection>
        <web-resource-name>WEB_APPLICATION_NAME</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

REMARQUE: Vous devez mettre le nom de votre application là où il est indiqué WEB_APPLICATION_NAME. Je ne peux pas être sûr de ce que ce serait dans tous les scénarios, mais pour moi, si le fichier de guerre en cours de déploiement est MyApp.war, alors je mets MyApp là.

Vous pouvez utiliser CONFIDENTIEL, INTÉGRAL ou AUCUN pour la garantie de transport. Notez l'URL ci-dessous: https://docs.Oracle.com/cd/E19798-01/821-1841/bncbk/index.html qui décrira les différences, mais il indique également que CONFIDENTIEL et INTEGRAL sont effectivement les mêmes.

Une fois ce code installé, vous avez terminé. Allez-y et testez-le en utilisant https via le port 8443 puis en utilisant http via le port 8080. Vous remarquerez que lorsque vous utilisez http/8080, il répond et votre navigateur passe à https/8443. Si vous êtes comme moi et que vous n'y faites pas confiance, vous pouvez le boucler.

curl -vv -k -L -X GET http://localhost:8080/MyApp/rest/endpoint

Vous verrez une sortie similaire à la suivante, démontrant que la redirection fonctionne:

Le nom d'hôte est introuvable dans le cache DNS
Essayer 127.0.0.1 ...
Connecté au port local 8080 (127.0.0.1) (# 0)
GET/MyApp/rest/endpoint HTTP/1.1
User-Agent: curl/7.35.0
Hôte: localhost: 8080
Accepter: /

HTTP/1.1 302 trouvé
Connexion: garder en vie
X-Powered-By: Undertow/1
Le serveur WildFly/9 n'est pas sur liste noire
Serveur: WildFly/9
Emplacement: https: // localhost: 8443/MyApp/rest/endpoint
Longueur du contenu: 0
Date: ven. 04 sept. 2015 18:42:08 GMT

La connexion # 0 à l'hôte localhost est restée intacte
Envoyez une autre demande à cette URL: ' https: // localhost: 8443/MyApp/rest/endpoint '
Ensemble trouvé pour l'hôte localhost: 0x8d68f0
Le nom d'hôte est introuvable dans le cache DNS
Essayer 127.0.0.1 ...
Connecté au port 8443 (# 1) de l'hôte local (127.0.0.1)
a réussi à définir les emplacements de vérification des certificats:
CAfile: aucun
CApath:/etc/ssl/certs
SSLv3, prise de contact TLS, bonjour client (1):
SSLv3, négociation TLS, bonjour du serveur (2):
SSLv3, prise de contact TLS, CERT (11):
SSLv3, négociation TLS, échange de clés de serveur (12):
SSLv3, prise de contact TLS, serveur terminé (14):
SSLv3, négociation TLS, échange de clés client (16):
SSLv3, changement de chiffrement TLS, bonjour client (1):
SSLv3, prise de contact TLS, terminé (20):
SSLv3, changement de chiffrement TLS, bonjour client (1):
SSLv3, prise de contact TLS, terminé (20):
Connexion SSL utilisant ECDHE-RSA-DES-CBC3-SHA
Certificat de serveur:
sujet: C = US; ST = inconnu; L = inconnu; O = Org; OU = inconnu; CN = localhost
date de début: 2015-09-04 15:23:06 GMT
date d'expiration: 2016-09-03 15:23:06 GMT
émetteur: C = US; ST = inconnu; L = inconnu; O = Org; OU = inconnu; CN = localhost
Certificat SSL vérifier le résultat: certificat auto-signé (18), continue quand même.
GET/MyApp/rest/endpoint HTTP/1.1
User-Agent: curl/7.35.0
Hôte: localhost: 8443
Accepter: /

HTTP/1.1 200 interdit
Connexion: garder en vie
X-Powered-By: Undertow/1
Le serveur WildFly/9 n'est pas sur liste noire
Serveur: WildFly/9
Type de contenu: application/json
Longueur du contenu: 42
Date: ven. 04 sept. 2015 18:42:08 GMT

La connexion n ° 1 à l'hôte localhost est restée intacte

54
Brooks

MISE À JOUR POUR Wildfly 1

Dans Wildlfy 10, il est encore plus facile de sécuriser l'interface de gestion. Les deux premières étapes sont les mêmes:

1) Préparez une clé, par ex. avec keytool (ou vous pouvez également utiliser openSSL)

keytool -genkeypair -alias serverkey -keyalg RSA -keysize 2048 -validity 7360 -keystore server.keystore -keypass mypassword -storepass mypasswor

2) Ajoutez SSL dans votre ManagementRealm. Par exemple.:

<security-realm name="ManagementRealm">
    <server-identities>
        <ssl>
            <keystore path="server.keystore" relative-to="jboss.server.config.dir" keystore-password="mypassword" alias="serverkey" key-password="mypassword"/>
        </ssl>
    </server-identities>
    <authentication>
        <local default-user="$local" skip-group-loading="true"/>
...

LA DIFFÉRENCE IMPORTANTE IS COMME SUIT:

Dans http-interface, au lieu de socket-binding vous venez de socket.

Par défaut, il pourrait ressembler par exemple comme ceci:

        <http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
            <socket interface="management" port="${jboss.management.http.port:9990}"/>
        </http-interface>

Remplacez simplement port par secure-port et le travail est terminé.

        <http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
            <socket interface="management" secure-port="${jboss.management.http.port:9990}"/>
        </http-interface>
12
TomS