Wildfly 9 http到https

时间:2015-08-14 10:43:18

标签: http https wildfly helper

我想将请求从HTTP重定向到HTTPS。我正在使用wildfly 9.谷歌搜索后我找到了以下内容,但它无法正常工作。 我希望有人

<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>

2 个答案:

答案 0 :(得分:54)

首先,我基于WildFly 9.0.1.Final进行此操作,我假设您只是尝试通过HTTPS启用SSL并且不担心身份验证。我花了大约一天时间搞清楚这一切。废除此文档:

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

您要做的第一件事是按照文档中的说明创建密钥库。

  

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

     

正确回答的一个非常重要的问题是要求的问题   你的名字和姓氏。在那里,你需要把主机名   应用程序服务器(例如localhost)。   在{jboss.home} / standalone / configuration文件夹中打开一个终端窗口,然后输入以下命令:

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

注意:,MY_ALIAS,MY_KEYSTORE_FILENAME和MY_PASSWORD是任意的,您可以根据需要进行设置。

下一步是修改同一{jboss.home} / standalone / configuration目录中的 standalone-XXX.xml 文件。我正在使用 standalone-full.xml 文件,但我相信这也适用于其他人。

我上面链接的文档中的下一步告诉我们将SSL密钥库引用放在ManagementRealm中。这可能导致很多混乱。出于此响应的目的,我试图让WildFly通过端口8443启用SSL以访问我的应用程序。虽然我也为管理控制台启用了SSL(通过端口9993),但以后也是如此。

我建议将密钥库信息放在 ApplicationRealm 中,如下所示:

<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>

注意:,本节中对默认文件的唯一更改应该是server-identityities标记。除非您有其他理由对其进行修改,否则应保留身份验证标记。)

注意:,MY_KEYSTORE_FILENAME,MY_ALIAS和MY_PASSWORD必须与您在创建密钥时提供的值相匹配。

现在,文档有点棘手。您现在需要向下滚动一下以执行下一步,但不幸的是它并没有告诉您这样做。现在您已在Wildfly中安装了密钥库并在相应的安全领域中进行了配置,您需要安装HTTPS侦听器并将其链接到密钥库。

  

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

     

HTTPS侦听器

     

Https侦听器提供对服务器的安全访问。最多   重要的配置选项是定义SSL的安全领域   安全的背景。

不幸的是,文档与security-realm属性保持一致(以前在ManagementRealm中安装密钥库并在此处在ssl-realm中引用它)。由于我将密钥库放在ApplicationRealm中,因此我们需要引用它。

此外,为了澄清,您需要将其置于下位子系统中。这是我在http-listener标签下面插入的内容:

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

以下是下位子系统的全部内容

<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>

还有 socket-binding-group 标记,用于定义端口本身:

<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>

注意:,您会注意到在HTTPS监听器中我们引用了name =&#34; httpsServer&#34; (这个值&#39; httpServer&#39;是任意的,可以设置为你想要的任何东西),socket-binding =&#34; https&#34; (此值&#39; https&#39;必须与套接字绑定组中列出的https套接字匹配)和security-realm =&#34; ApplicationRealm&#34; (此值&#39; ApplicationRealm&#39;必须是您安装密钥库的安全领域。)

使用此配置,您会发现端口8443(安全)和8080(不安全)都可用于访问WildFly的应用程序服务。端口9990(不安全)仍可用于访问Web管理UI,但9993(安全管理UI)不能。

安全管理员控制台

我找到了这些说明,但效果很好。

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

第一步是创建SSL密钥:

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

注意:请记住,当您要求提供名字/姓氏时,应使用您的服务器名称。

接下来,在standalone-XXX.xml中配置ManagementRealm以包含密钥库。添加下面的server-identities标记:

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

以下是完整的ManagementRealm的样子:

<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>

接下来,standalone-XXX.xml文件的 management-interfaces 部分使用HTTP套接字绑定,我们希望将其绑定到HTTPS套接字(特别是management-https套接字)。

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

注意:查看接口如何引用ManagementRealm安全领域。我只是通过引用ApplicationRealm来尝试它,而没有创建一个单独的密钥库,它仍然以某种方式工作。最好不要将这些代码用于这两个目的。

注意:下面是管理界面中引用的management-https套接字定义。

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

注意:对于任何套接字定义,您可以(如果需要)更改端口号。

将HTTP重定向到HTTPS

在您的web.xml文件中,在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>

注意:您需要将应用程序的名称放在WEB_APPLICATION_NAME所在的位置。我无法确定在所有情况下会出现什么情况,但对我而言,如果部署的war文件是MyApp.war,那么我将MyApp放在那里。

您可以使用CONFIDENTIAL,INTEGRAL或NONE作为传输保证。请注意以下URL:https://docs.oracle.com/cd/E19798-01/821-1841/bncbk/index.html,它将描述差异,但它也说明了CONFIDENTIAL和INTEGRAL实际上是相同的。

安装完代码后,您就完成了。继续使用https通过端口8443进行测试,然后使用http通过端口8080进行测试。您会注意到当您使用http / 8080时,它会回复并且您的浏览器会切换到https / 8443。如果你像我一样并且不相信它,你可以卷曲它。

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

您将看到类似于以下内容的输出,证明重定向正在起作用:

  

在DNS缓存中找不到主机名
       尝试127.0.0.1 ...
     连接到localhost(127.0.0.1)端口8080(#0)
     GET / MyApp / rest / endpoint HTTP / 1.1
     用户代理:curl / 7.35.0
     主持人:localhost:8080
     接受: /

     

发现HTTP / 1.1 302      连接:保持活力
     X-Powered-By:Undertow / 1
     服务器WildFly / 9未列入黑名单
     服务器:WildFly / 9
     地点:https://localhost:8443/MyApp/rest/endpoint
     内容长度:0
     日期:2015年9月4日星期五18:42:08 GMT

     

连接#0到主机localhost保持完整
     向此网址发出另一个请求:&#39; https://localhost:8443/MyApp/rest/endpoint&#39;
     找到主机localhost的包:0x8d68f0
     在DNS缓存中找不到主机名
       尝试127.0.0.1 ...
     连接到localhost(127.0.0.1)端口8443(#1)
     成功设置证书验证位置:
       CAfile:无
      CApath:/ etc / ssl / certs
     SSLv3,TLS握手,客户端问候(1):
     SSLv3,TLS握手,服务器问候(2):
     SSLv3,TLS握手,CERT(11):
     SSLv3,TLS握手,服务器密钥交换(12):
     SSLv3,TLS握手,服务器完成(14):
     SSLv3,TLS握手,客户端密钥交换(16):
     SSLv3,TLS更改密码,客户端问候(1):
     SSLv3,TLS握手,完成(20):
     SSLv3,TLS更改密码,客户端问候(1):
     SSLv3,TLS握手,完成(20):
     使用ECDHE-RSA-DES-CBC3-SHA进行SSL连接      服务器证书:
         主题:C = US; ST =未知; L =未知; O =组织; OU =未知; CN =本地主机
         开课日期:2015-09-04 15:23:06 GMT
         到期日:2016-09-03 15:23:06 GMT
         发行人:C = US; ST =未知; L =未知; O =组织; OU =未知; CN =本地主机
         SSL证书验证结果:自签名证书(18),无论如何都要继续      GET / MyApp / rest / endpoint HTTP / 1.1
     用户代理:curl / 7.35.0
     主持人:localhost:8443
     接受: /

     

HTTP / 1.1 200禁止
     连接:保持活力
     X-Powered-By:Undertow / 1
     服务器WildFly / 9未列入黑名单
     服务器:WildFly / 9
     内容类型:application / json
     内容长度:42
     日期:2015年9月4日星期五18:42:08 GMT

     

连接#1以托管localhost保持原样

答案 1 :(得分:12)

更新Wildfly 10

在Wildlfy 10中,保护管理界面更加容易。前两个步骤是相同的​​:

1)准备一把钥匙,例如使用keytool(或者你也可以使用openSSL)

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

2)在ManagementRealm中添加SSL。 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"/>
...

重要差异如下:

http-interface,而不是socket-binding,您只有socket

默认情况下,它可能会看起来像如下:

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

只需将端口更改为安全端口即可完成作业。

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