Wildfly 9 de http vers https

je veux rediriger la requête de https://over.wiki/http/" class="blnk">HTTP vers HTTPS. J'utilise wildfly 9. Après une recherche google j'ai trouvé ce qui suit, mais il 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>
18
demandé sur Karthikeyan Vaithilingam 2015-08-14 13:43:17

2 réponses

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

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

la première chose que vous voulez faire est de créer votre keystore tel que décrit dans la documentation.

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

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

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

NOTE:, 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 standalone-XXX.xml le fichier dans le même {jboss.accueil} / autonome / répertoire de configuration. Je suis l'aide de la autonome.xml dossier, Cependant je crois que cela fonctionnera pour les autres aussi bien.

la prochaine étape dans la documentation à laquelle j'ai fait référence ci-dessus nous dit de mettre la référence SSL keystore dans le ManagementRealm. Cela peut conduire à beaucoup de confusion. Pour les besoins de cette réponse, j'essaie D'obtenir WildFly pour activer SSL sur le port 8443 pour accéder à mes applications. Alors que J'ai aussi activé SSL pour la console de gestion (via le port 9993), c'est pour plus tard.

je suggère de mettre l'information de keystore dans le 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>

NOTE:, les seuls changements au fichier par défaut dans cette section devraient être serveur-identités tag. La balise d'authentification doit être laissée seule sauf si vous avez d'autres raisons de la modifier).

NOTE:, 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élicat. Vous avez maintenant besoin de faire défiler vers le bas un peu pour faire l'étape suivante, mais malheureusement, il ne vous dit pas de le faire. Maintenant que vous avez le keystore installé dans Wildfly et configuré dans le domaine de la sécurité approprié, vous devez installer L'écouteur HTTPS et le relier au keystore.

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

HTTPS listener

Https listener fournit un accès sécurisé au serveur. La plupart des l'option de configuration importante est security realm qui définit SSL cadre sécurisé.

malheureusement, le la documentation ne reste pas cohérente avec l'attribut security-realm (précédemment l'installation du keystore dans ManagementRealm et ici le référencement dans le ssl-realm). Depuis que j'ai mis la clé de voûte dans le ApplicationRealm, nous devons y faire référence en tant que tel.

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

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

ci-Dessous est le corps même de sous-système de contre-courant.

<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 douille de liaison-groupe balise 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>

NOTE:, vous remarquerez dans L'écouteur HTTPS que nous avons référencé nom= "httpsServer" (cette valeur 'httpServer' est arbitraire et peut être définie à tout ce que vous voulez), socket-binding= "https" (cette valeur 'https' doit correspondre à la socket listée dans le groupe socket-binding) et security-realm= "ApplicationRealm" (cette valeur 'ApplicationRealm' doit être quel que soit le domaine de sécurité dans lequel vous avez installé le keystore).

avec cette configuration, vous devriez trouver que les ports 8443 (secure) et 8080 (unsecure) fonctionnent tous les deux pour accéder au service d'application de WildFly. Le Port 9990 (unsecure) fonctionne toujours pour accéder à L'interface D'administration web, mais pas le port 9993 (secure admin UI).

SECURE ADMIN CONSOLE

j'ai trouvé ces instructions et ils ont fonctionné parfaitement.

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: rappelez-vous que le nom de votre serveur doit être utilisé lorsqu'il demande un prénom / nom de famille.

ensuite, configurer le ManagementRealm dans le standalone-XXX.xml to include the keystore. Ajouter dans le balise server-identities 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>

Suivant gestion des interfaces section de la standalone-XXX.xml le fichier utilise une liaison de socket HTTP et nous voulons la relier à la socket HTTPS (en particulier, la socket management-https).

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

NOTE: voir comment l'interface fait référence au managementrealm security-realm. Je l'ai essayé juste en référencement L'ApplicationRealm, sans créer un keystore séparé et il a toujours fonctionné en quelque sorte. Il est probablement préférable de ne pas réutiliser ce code à ces deux fins.

NOTE: ci-dessous se trouve la définition de socket management-https référencée dans l'interface de gestion.

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

NOTE: pour toutes les définitions de socket, vous pouvez (si nécessaire) changer le numéro de port.

rediriger HTTP vers HTTPS

dans votre web.fichier 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>

NOTE: vous devez mettre le nom de votre application où il est écrit WEB_APPLICATION_NAME. Je ne peux pas être sûr de ce que serait, dans tous les scénarios, mais pour moi, si le fichier war déployé est MyApp.war, puis J'y ai mis MyApp.

vous pouvez utiliser soit confidentiel, intégral ou Aucun pour le transport-garantie. Remarque l' below URL:https://docs.oracle.com/cd/E19798-01/821-1841/bncbk/index.html qui décrira les différences, mais il précise aussi que confidentiel et intégral sont effectivement les mêmes.

une fois que ce code est installé, c'est terminé. Allez-y et faites le test en utilisant https via le port 8443 et ensuite en utilisant http via le port 8080. Vous remarquerez que lorsque vous utilisez http/8080, c'réponses et votre navigateur commutateurs https/8443. Si tu es comme moi et que tu n'y crois pas, vous pouvez curl.

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

Vous verrez une sortie semblable au suivant, démontrant la redirection fonctionne:

nom D'hôte N'a pas été trouvé dans le cache DNS

Essayer 127.0.0.1...

Connecté à localhost (127.0.0.1) le port 8080 (#0)

GET /MyApp/repos/point de terminaison HTTP/1.1

User-Agent: curl / 7.35.0

Host: localhost: 8080

Accepter: /

HTTP/1.1 302 Found

Connexion: keep-alive

X-Powered-By: Undrow / 1

Server WildFly / 9 n'est pas sur la liste noire

Server: WildFly / 9

Emplacement: https://localhost:8443/MyApp/rest/endpoint

Content-Length: 0

Date:VEN, 04 Sep 2015 18:42: 08 GMT

Connexion de #0 à l'hôte localhost laissé intact

Envoyez une autre requête à cette URL:'https://localhost:8443/MyApp/rest/endpoint'

Trouvé bundle pour l'hôte localhost: 0x8d68f0

Nom d'hôte N'a pas été trouvé dans le cache DNS

Essayer 127.0.0.1...

Connecté à localhost (127.0.0.1) le port 8443 (#1)

vérification réussie du certificat emplacements:

CAfile: none

CApath: / etc / ssl / certs

SSLv3, TLS handshake, Client hello (1):

SSLv3, poignée de main TLS, le Serveur bonjour (2):

SSLv3, TLS handshake, CERT (11):

SSLv3, poignée de main TLS, le Serveur d'échange de clé (12):

SSLv3, poignée de main TLS, le Serveur fini (14):

SSLv3, TLS handshake, échange de clés Client (16):

SSLv3, TLS changement de chiffrement, Client hello (1):

SSLv3, poignée de main TLS, Fini (20):

SSLv3, TLS changement de chiffrement, Client hello (1):

SSLv3, poignée de main TLS, Fini (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

Vérification du certificat SSL résultat: certificat auto-signé (18), continuant de toute façon.

GET /MyApp/repos/point de terminaison HTTP/1.1

User-Agent: curl / 7.35.0

Hôte: localhost: 8443

Accepter: /

HTTP/1.1 200 Forbidden

Connexion: keep-alive

X-Powered-By: Undrow / 1

Server WildFly / 9 n'est pas sur la liste noire

Server: WildFly / 9

Content-Type: application / json

Contenu-Durée: 42

Date:VEN, 04 Sep 2015 18:42: 08 GMT

Connexion n ° 1 de l'hôte localhost laissé intact

52
répondu Brooks 2015-09-08 16:37:42

UPDATE FOR Wildfly 10

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 exemple avec keytool (ou vous pouvez utiliser openSSL aussi bien)

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

2) Ajouter SSL dans votre ManagementRealm. E. g.:

<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"/>
...

THE IMPORTANT DIFFERENCE IS AS FOLLOWS:

http-interface au lieu de socket-binding vous avez juste socket.

À défaut, il pourrait regarder par exemple comme le suivant:

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

il suffit de changer port secure-port et le travail est fait.

        <http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
            <socket interface="management" secure-port="${jboss.management.http.port:9990}"/>
        </http-interface>
12
répondu TomS 2016-02-07 14:03:52