我想将请求从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>
答案 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)不能。
安全管理员控制台
我找到了这些说明,但效果很好。
第一步是创建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>