Wildfly 9 http 转 https
Posted
技术标签:
【中文标题】Wildfly 9 http 转 https【英文标题】:Wildfly 9 http to https 【发布时间】:2015-11-07 14:22:16 【问题描述】:我想将请求从 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>
【问题讨论】:
如果我在下面的回答回答了您的问题(尽管不及时),如果您选择正确或让我知道您可能还需要什么,将会很有帮助。 嗨@***s:我有在wildfly 8.2.1 上运行的网络应用程序。我正在使用另一个 Wildfly 8.2.1,我在其中部署了所有 EJB。我正在尝试使用安全连接将 web wildfly 连接到 ejb wildfly。我按照以下说明和 jboss 文档修改了 ejb wildfly。我想知道我需要在 web wildfly 中修改什么,以便它接收 https 侦听器而不是 http 侦听器。 老实说,我无法告诉你该怎么做。我认为只需将 web wildfly 指向 https 而不是 http 就足够了。 【参考方案1】:首先,我是基于 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
正确回答的真正重要的问题是要求 你的名字和姓氏。在那里,你需要把主机名 应用程序服务器(例如本地主机)。 在文件夹 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),但这是为了以后。
我建议把keystore信息放在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-identities 标记。除非您有其他理由修改它,否则应单独保留身份验证标签)。
注意:、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 中,因此我们需要这样引用它。
此外,为了澄清,您需要将其放在 undertow 子系统中。这是我在 http-listener 标签下方插入的内容:
<https-listener name="httpsServer" socket-binding="https" security-realm="ApplicationRealm"/>
下面是 undertow 子系统的完整主体。
<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="httpsServer"(此值 'httpServer' 是任意的,可以设置为任意值),socket-binding=" https"(此值 'https' 必须与套接字绑定组中列出的 https 套接字匹配)和 security-realm="ApplicationRealm"(此值 'ApplicationRealm' 必须是您安装密钥库的任何安全领域)。
使用此配置,您应该会发现端口 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 来尝试它,而没有创建单独的密钥库,它仍然以某种方式工作。最好不要为这两个目的重复使用该代码。
注意:下面是管理接口中引用的管理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 实际上是相同的。
安装该代码后,您就完成了。继续通过端口 8443 使用 https 进行测试,然后通过端口 8080 使用 http。您会注意到,当您使用 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 主机:本地主机: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
到主机 localhost 的连接 #0 保持不变 向此 URL 发出另一个请求:'https://localhost:8443/MyApp/rest/endpoint' 找到主机 localhost 的捆绑包:0x8d68f0 在 DNS 缓存中找不到主机名 正在尝试 127.0.0.1... 连接到 localhost (127.0.0.1) 端口 8443 (#1) 成功设置证书验证位置: CAfile:无 CApath:/etc/ssl/certs SSLv3、TLS 握手、客户端问候(一): SSLv3、TLS 握手、服务器问候(二): SSLv3、TLS 握手、CERT (11): SSLv3、TLS 握手、服务器密钥交换(12): SSLv3、TLS 握手、服务器完成 (14): SSLv3、TLS 握手、客户端密钥交换(16): SSLv3、TLS 更改密码、客户端问候(一): SSLv3,TLS 握手,完成 (20): SSLv3、TLS 更改密码、客户端问候(一): SSLv3,TLS 握手,完成 (20): 使用 ECDHE-RSA-DES-CBC3-SHA 的 SSL 连接 服务器证书: 主题:C=US; ST=未知; L=未知; O=组织; OU=未知; CN=本地主机 开始日期:格林威治标准时间 2015-09-04 15:23:06 到期日期:格林威治标准时间 2016 年 9 月 3 日 15:23:06 发行人:C=US; ST=未知; L=未知; O=组织; OU=未知; CN=本地主机 SSL 证书验证结果:自签名证书 (18),仍然继续。 GET /MyApp/rest/endpoint HTTP/1.1 用户代理:curl/7.35.0 主机:本地主机:8443 接受:/
HTTP/1.1 200 禁止 连接:保持活动 X-Powered-By:Undertow/1 服务器 WildFly/9 未列入黑名单 服务器:WildFly/9 内容类型:application/json 内容长度:42 日期:格林威治标准时间 2015 年 9 月 4 日星期五 18:42:08
与主机 localhost 的连接 #1 保持不变
【讨论】:
有没有办法让它成为 301 重定向而不是 302? 据我所知,抱歉。 我发布了我的问题here,以防有人感兴趣。 @***s 我已经明确地遵循了这些方向,但我仍然遇到错误。我得到的响应是端口 8443 上的一系列网络控制字符......你能告诉我我可能还缺少什么吗? 你能说得更具体点吗?【参考方案2】: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) 将 SSL 添加到 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"/>
...
重要的区别如下:
在http-interface
中,您只有socket
,而不是socket-binding
。
默认情况下,它可能看起来像像下面这样:
<http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
<socket interface="management" port="$jboss.management.http.port:9990"/>
</http-interface>
只需将 port 更改为 secure-port 即可完成。
<http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
<socket interface="management" secure-port="$jboss.management.http.port:9990"/>
</http-interface>
【讨论】:
警告:此解决方案不再适用于 Wildfly 10:原因:javax.xml.stream.XMLStreamException: ParseError at [row,col]:[80,13] 消息:WFLYCTL0371:元素'不再支持 urn:jboss:domain:4.2socket',请改用 'socket-binding' 对 Wildfly 10 使用<socket-binding http="management-http" https="management-https"/>
以上是关于Wildfly 9 http 转 https的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Linux 机器上的 Wildfly 8.2.1 中编辑 http 连接