首先,我将此基于 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
您要做的第一件事是按照文档中的概述创建密钥库。
https://docs.jboss.org/author/display/WFLY9/Admin+Guide#AdminGuide-EnableSSL 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`
NOTE:、MY_ALIAS、MY_KEYSTORE_FILENAME 和 MY_PASSWORD 是任意的,您可以根据需要设置它们。
下一步是修改独立-XXX.xml文件位于同一 {jboss.home}/standalone/configuration 目录中。我正在使用独立完整.xml文件,但我相信这也适用于其他人。
我上面链接到的文档中的下一步告诉我们将 SSL 密钥库引用放入 ManagementRealm 中。这可能会导致很多混乱。出于此响应的目的,我尝试让 WildFly 通过端口 8443 启用 SSL 以访问我的应用程序。虽然我还为管理控制台启用了 SSL(通过端口 9993),但这是稍后的事。
我建议将密钥库信息放在应用领域如下:
<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:,本节中默认文件的唯一更改应该是 server-identities 标记。除非您有其他原因需要修改身份验证标签,否则应保留该身份验证标签)。
NOTE:、MY_KEYSTORE_FILENAME、MY_ALIAS 和 MY_PASSWORD 必须与您在创建密钥时提供的值匹配。
现在,文档变得有点棘手。您现在需要向下滚动一点才能执行下一步,但不幸的是它没有告诉您这样做。现在您已在 Wildfly 中安装了密钥库并在相应的安全领域中进行了配置,您需要安装 HTTPS 侦听器并将其链接到密钥库。
https://docs.jboss.org/author/display/WFLY9/Admin+Guide#AdminGuide-HTTPSlistener 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 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:,你会注意到在 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/secure-access-to-jboss-wildfly-management-console 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
NOTE:请记住,当要求输入名字/姓氏时,应使用您的服务器名称。
接下来,在standalone-XXX.xml 中配置 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>
下面是完整的 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 文件的部分使用 HTTP 套接字绑定,我们希望将其绑定到 HTTPS 套接字(具体来说,管理 https 套接字)。
<management-interfaces>
<http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
<socket-binding https="management-https"/>
</http-interface>
</management-interfaces>
NOTE:查看接口如何引用 ManagementRealm 安全领域。我通过引用 ApplicationRealm 进行了尝试,没有创建单独的密钥库,并且它仍然以某种方式工作。最佳实践可能是不要为这两个目的重复使用该代码。
NOTE:下面是管理接口中引用的管理 https 套接字定义。
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
NOTE:对于任何套接字定义,您可以(如果需要)更改端口号。
将 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>
NOTE:您需要将应用程序的名称放在 WEB_APPLICATION_NAME 处。我无法确定在所有情况下都会发生什么,但对我来说,如果部署的 war 文件是 MyApp.war,那么我将 MyApp 放在那里。
您可以使用 CONFIDENTIAL、INTEGRAL 或 NONE 作为传输保证。请注意以下网址:https://docs.oracle.com/cd/E19798-01/821-1841/bncbk/index.html 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...
连接到本地主机 (127.0.0.1) 端口 8080 (#0)
获取/MyApp/rest/端点 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 https://localhost:8443/MyApp/rest/endpoint
内容长度:0
日期:2015 年 9 月 4 日星期五 18:42:08 GMT
与主机 localhost 的连接 #0 保持不变
向此 URL 发出另一个请求:'https://localhost:8443/MyApp/rest/endpoint https://localhost:8443/MyApp/rest/endpoint'
找到主机本地主机的捆绑包:0x8d68f0
在 DNS 缓存中未找到主机名
正在尝试 127.0.0.1...
连接到本地主机 (127.0.0.1) 端口 8443 (#1)
成功设置证书验证位置:
CA文件:无
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),无论如何都要继续。
获取/MyApp/rest/端点 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 GMT
与主机 localhost 的连接 #1 保持不变