当前位置: 首页 > 知识库问答 >
问题:

JBoss EAP 7.2 通过 SSL 保护 JMS

巩镜
2023-03-14

我已经通过创建一个安全领域在JBoss EAP 7.2上启用了SSL

<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
    <server name="default">
        <journal pool-files="10"/>
        <security-setting name="#">
            <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
        </security-setting>
        <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
        <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
        <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
            <param name="batch-delay" value="50"/>
        </http-connector>
        <http-connector name="https-connector" socket-binding="https" endpoint="https-acceptor"/>
        <http-connector name="https-connector-throughput" socket-binding="https" endpoint="https-acceptor-throughput">
            <param name="batch-delay" value="50"/>
        </http-connector>
        <in-vm-connector name="in-vm" server-id="0">
            <param name="buffer-pooling" value="false"/>
        </in-vm-connector>
        <http-acceptor name="http-acceptor" http-listener="default"/>
        <http-acceptor name="http-acceptor-throughput" http-listener="default">
            <param name="batch-delay" value="50"/>
            <param name="direct-deliver" value="false"/>
        </http-acceptor>
        <http-acceptor name="https-acceptor" http-listener="https"/>
        <http-acceptor name="https-acceptor-throughput" http-listener="https">
            <param name="batch-delay" value="50"/>
            <param name="direct-deliver" value="false"/>
        </http-acceptor>
        <in-vm-acceptor name="in-vm" server-id="0">
            <param name="buffer-pooling" value="false"/>
        </in-vm-acceptor>
        <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
        <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
        <jms-queue name="testQueue" entries="java:jboss/exported/wmasTestQueue java:/jms/queue/wmasTestQueue" durable="true"/>
        <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
        <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
        <connection-factory name="RemoteConnectionFactoryHttps" entries="java:jboss/exported/jms/RemoteConnectionFactoryHTTPS" connectors="https-connector"/>
        <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
    </server>
</subsystem>

我已经更新了远程子系统,使用默认的connector-ref作为https

<subsystem xmlns="urn:jboss:domain:remoting:4.0">
    <http-connector name="http-remoting-connector" connector-ref="https" security-realm="ApplicationRealm"/>
</subsystem>

当我试图从一个独立的Java类访问< code > http-remoting://127 . 0 . 0 . 1:8443 时,我在获取连接工厂时得到以下错误

WFNAM00018: Failed to connect to remote host [Root exception is java.io.IOException: Invalid response]
    at org.wildfly.naming.client.remote.RemoteNamingProvider.getPeerIdentityForNaming(RemoteNamingProvider.java:110)
    at org.wildfly.naming.client.remote.RemoteNamingProvider.getPeerIdentityForNaming(RemoteNamingProvider.java:53)
    at org.wildfly.naming.client.NamingProvider.getPeerIdentityForNamingUsingRetry(NamingProvider.java:105)
    at org.wildfly.naming.client.remote.RemoteNamingProvider.getPeerIdentityForNamingUsingRetry(RemoteNamingProvider.java:91)
    at org.wildfly.naming.client.remote.RemoteContext.lambda$lookupNative$0(RemoteContext.java:189)
    at org.wildfly.naming.client.NamingProvider.performExceptionAction(NamingProvider.java:222)
    at org.wildfly.naming.client.remote.RemoteContext.performWithRetry(RemoteContext.java:100)
    at org.wildfly.naming.client.remote.RemoteContext.lookupNative(RemoteContext.java:188)
    at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:74)
    at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:60)
    at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:144)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at com.cibc.jboss.queue.PostMessage.main(PostMessage.java:43)
Caused by: java.io.IOException: Invalid response

请帮助解决。我是否缺少任何配置。

共有1个答案

孟宏才
2023-03-14

在EAP 7.2上保护JMS的最佳方式是使用Elytron。使用交互模式保护Elytron服务器。这将为您设置密钥库

您的独立服务器将如下所示;

-<tls>
-<key-stores>
-<key-store name="key-store-8ce838a4-6109-46e4-b243-a71489bb842f">
<credential-reference clear-text="password"/>
<implementation type="JKS"/>
<file relative-to="jboss.server.config.dir" path="jks-source.jks" required="false"/>
</key-store>
</key-stores>
-<key-managers>
-<key-manager name="key-manager-8ce838a4-6109-46e4-b243-a71489bb842f" key-store="key-store-8ce838a4-6109-46e4-b243-a71489bb842f">
<credential-reference clear-text="password"/>
</key-manager>
</key-managers>
-<server-ssl-contexts>
<server-ssl-context name="ssl-context-8ce838a4-6109-46e4-b243-a71489bb842f" key-manager="key-manager-8ce838a4-6109-46e4-b243-a71489bb842f" use-cipher-suites-order="false" authentication-optional="false" need-client-auth="false" want-client-auth="false" protocols="TLSv1.2" cipher-suite-filter="DEFAULT"/>
</server-ssl-contexts>
</tls>

在 activemq 子系统中的 httpconnector 上启用 ssl

-<http-connector name="http-connector2" socket-binding="https" endpoint="http-acceptor2">

<param name="ssl-enabled" value="true"/>

</http-connector>

如果客户机有自己的信任者,请确保将服务器的公用证书添加到其信任库中。为了测试上述内容,我们可以使用独立的 JMS 客户端将请求发布到 https-remoting://localhost:8443。从服务器添加自签名证书以包含在JDK的信任库(cacerts)中是一个坏主意 - 但这是在Jboss EAP上测试安全JMS的快速选择。

public class PostMessage {

    // Set up all the default values
    private static final String DEFAULT_MESSAGE = "Hello, World! successfull";
    private static final String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
    private static final String DEFAULT_DESTINATION = "TestQueue";
    private static final String DEFAULT_MESSAGE_COUNT = "1";
    private static final String DEFAULT_USERNAME = "jmsuser";
    private static final String DEFAULT_PASSWORD = "jmsuser123";
    private static final String INITIAL_CONTEXT_FACTORY = "org.wildfly.naming.client.WildFlyInitialContextFactory";
    private static final String PROVIDER_URL = "https-remoting://127.0.0.1:8443";


    public static void main(String[] args) throws JMSException {

        Context namingContext = null;

       // System.setProperty("javax.net.debug","all");

        try {
             String userName = System.getProperty("username", DEFAULT_USERNAME);
             String password = System.getProperty("password", DEFAULT_PASSWORD);

            // Set up the namingContext for the JNDI lookup
            final Properties env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
            env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, PROVIDER_URL));
            namingContext = new InitialContext(env);

            // Perform the JNDI lookups
            String connectionFactoryString = System.getProperty("connection.factory", DEFAULT_CONNECTION_FACTORY);
            ConnectionFactory connectionFactory = (ConnectionFactory) namingContext.lookup(connectionFactoryString);
            System.out.println("Able to look up connection factory with the naming context "  );
            Queue destination = (Queue) namingContext.lookup(DEFAULT_DESTINATION);
            System.out.println("Able to look up Queue with the naming context" );
                JMSContext jmsContext = connectionFactory.createContext(DEFAULT_USERNAME, DEFAULT_PASSWORD);
            jmsContext.createProducer().send(destination, DEFAULT_MESSAGE);
            System.out.println("><><><><><><>< MESSAGE POSTED <><><><><><><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" );

        } catch (NamingException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (namingContext != null) {
                try {
                    namingContext.close();
                } catch (NamingException e) {
                }
            }
        }
    }
}
 类似资料:
  • 我已经用Nginx配置了一个web服务器。现在,我有一个MariaDB的实例,它以PhpMyAdmin作为管理gui运行。这一切都在起作用。从去年开始,我还在学习Nginx和所有与web服务器相关的东西。 我确实让我运行的每个应用程序都受到SSL证书的保护,每次访问应用程序所在的url时,通过https连接PHPMyAdmin也是如此。 我认为仍有可能进行改进,但这是我的问题:正如我所说,PhpM

  • 我是一名Linux用户,很不高兴发现vhx等网站上的HDCP保护。电视阻止我在完全合法的上下文中查看内容,因为所有Linux浏览器都缺乏HDCP支持。由于HDCP在几年前被“破坏”,就主密钥泄漏而言,任何设备理论上都可以针对HDCP检查进行授权。 假设,是什么阻止某人编写浏览器扩展或创建自定义firefox构建以这种方式覆盖DRM API? 为什么没有这样的项目,仅仅是缺乏兴趣,还是有一个难以逾越

  • 请记住,这与保护单个工作表的密码不同,在单个工作表中,用户仍然能够打开文件并查看数据,但具有只读访问权限。 我在SXSSFWorkbook文档中没有找到任何东西:https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html 看起来XSSFWorkbook有一个名为setWorkbookPassword

  • 问题内容: 我尝试运行此命令,但它给了我这个错误。 我试图将“ extension = php_openssl.dll”添加到“ php.ini”,但仍然出现此错误 问题答案: 我也发生了同样的错误。我通过关闭Composer的TLS修复了该问题, 虽然不安全, 但是我承担了 开发机器 上的风险。 尝试这个: 并重新运行您的Composer。它对我有用! 但这是不安全的, 不建议您在Server上

  • 我一直在寻找一个工作表保护问题的解决方案,我有一个工作表,其中包括从顶部的一些字段将数据写入下面的工作表的自动脚本。我希望用户能够在顶部的字段中提供数据,然后运行脚本添加下面的数据。如果启用了保护,则用于添加数据的脚本对工作表的所有者来说可以正常工作,但对于任何具有编辑权限的用户来说都无法正常工作,因为脚本无法清除将数据写入工作表底部的保护。 https://developers.googlebl

  • 我有一个非常简单的Spring Boot应用程序,其资源位于和。 下面是我的文件。 下面是我的文件。 下面是我的文件。 这是我的政策。 这里是资源。 这是许可书。 PEP负责执行来自Keycloak服务器的访问决策,这些决策是通过评估与受保护资源相关联的策略来做出的。它在应用程序中充当筛选器或拦截器,以便根据这些决定授予的权限检查对受保护资源的特定请求是否可以实现。 这听起来和我想做的一模一样。不