phi*_*hil 21 https http helper wildfly
我想将请求从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>
Run Code Online (Sandbox Code Playgroud)
Bro*_*oks 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`
Run Code Online (Sandbox Code Playgroud)
注意:,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>
Run Code Online (Sandbox Code Playgroud)
注意:此部分中对默认文件的唯一更改应该是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中引用它).由于我将keystore放在ApplicationRealm中,因此我们需要引用它.
另外,为了澄清,您需要将其置于下行子系统中.这是我在http-listener标签下面插入的内容:
<https-listener name="httpsServer" socket-binding="https" security-realm="ApplicationRealm"/>
Run Code Online (Sandbox Code Playgroud)
下面是底部子系统的全部内容.
<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>
Run Code Online (Sandbox Code Playgroud)
而且,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>
Run Code Online (Sandbox Code Playgroud)
注意:你会注意到在HTTPS监听器中我们引用了name ="httpsServer"(这个值'httpServer'是任意的,可以设置为你想要的任何东西),socket-binding ="https"(这个值'https'必须匹配套接字绑定组中列出的https套接字)和security-realm ="ApplicationRealm"(此值'ApplicationRealm'必须是您安装密钥库的安全领域).
使用此配置,您会发现端口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
Run Code Online (Sandbox Code Playgroud)
注意:请记住,当您要求提供名字/姓氏时,应使用您的服务器名称.
接下来,在standalone-XXX.xml中配置ManagementRealm以包含密钥库.在下面的server-identity标签中添加:
<server-identities>
<ssl>
<keystore path="server.keystore" relative-to="jboss.server.config.dir" keystore-password="mypassword" alias="serverkey" key-password="mypassword"/>
</ssl>
</server-identities>
Run Code Online (Sandbox Code Playgroud)
以下是完整的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>
Run Code Online (Sandbox Code Playgroud)
接下来,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>
Run Code Online (Sandbox Code Playgroud)
注意:请参阅接口如何引用ManagementRealm安全领域.我只是通过引用ApplicationRealm来尝试它,而没有创建一个单独的密钥库,它仍然以某种方式工作.最好的做法是不要将这些代码重用于这两个目的.
注意:以下是管理界面中引用的management-https套接字定义.
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
Run Code Online (Sandbox Code Playgroud)
注意:对于任何套接字定义,您可以(如果需要)更改端口号.
将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>
Run Code Online (Sandbox Code Playgroud)
注意:您需要将应用程序的名称放在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
Run Code Online (Sandbox Code Playgroud)
您将看到类似于以下内容的输出,证明重定向正在起作用:
在DNS缓存中找不到主机名
尝试127.0.0.1 ...
连接到localhost(127.0.0.1)端口8080(#0)
GET/MyApp/rest/endpoint HTTP/1.1
User-Agent:curl/7.35.0
主机:localhost :8080
接受:/HTTP/1.1 302找到
连接:keep-alive
X-Powered-By:Undertow/1
服务器WildFly/9未列入黑名单
服务器:WildFly/9
位置:https:// localhost:8443/MyApp/rest/endpoint
Content-Length: 0日期
:星期五,04九月2015 18:42:08 GMT连接#0以托管localhost保持原样
向此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握手,客户端问候(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 = localhost
开始日期:2015-09-04 15:23:06 GMT
到期日期:2016-09-03 15:23:06 GMT
发行人:C = US; ST =未知; L =未知; O =组织; OU =未知; CN = localhost
SSL证书验证结果:自签名证书(18),仍然继续.
GET/MyApp/rest/endpoint HTTP/1.1
User-Agent: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连接#1到主机localhost保持不变
Tom*_*omS 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
Run Code Online (Sandbox Code Playgroud)
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"/>
...
Run Code Online (Sandbox Code Playgroud)
重要的差异如下:
在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>
Run Code Online (Sandbox Code Playgroud)
只需将端口更改为安全端口即可完成作业.
<http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
<socket interface="management" secure-port="${jboss.management.http.port:9990}"/>
</http-interface>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35772 次 |
| 最近记录: |