Payara 5.2020.7 SSL队列管理器连接配置问题求助
解决Payara 5中不覆盖全局SSL配置的队列管理器SSL连接问题
我明白你遇到的问题——直接替换JVM的javax.net.ssl.keyStore和trustStore参数会覆盖Payara默认的SSL配置,导致服务器本身的SSL功能出问题。下面给你几个可行的解决方案,不用动全局JVM参数就能搞定队列管理器的SSL连接:
方案1:将客户端证书导入Payara默认的信任库/密钥库
如果允许修改Payara默认的证书库,这是最简单的方法:
- 用
keytool命令把你的MQ-CLIENT-TEST.jks里的证书导入到Payara默认的cacerts.jks(信任库)和keystore.jks(密钥库)中:# 导入到信任库 keytool -importkeystore -srckeystore /opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks -destkeystore ${PAYARA_HOME}/glassfish/domains/domain1/config/cacerts.jks -srcstoretype JKS -deststoretype JKS # 导入到密钥库 keytool -importkeystore -srckeystore /opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks -destkeystore ${PAYARA_HOME}/glassfish/domains/domain1/config/keystore.jks -srcstoretype JKS -deststoretype JKS - 注意替换
${PAYARA_HOME}为你的Payara安装路径,输入默认库的密码(默认是changeit)。 - 重启Payara后,应用就能通过默认的SSL上下文访问队列管理器了。
方案2:在应用级别指定SSL上下文
如果不想修改服务器全局证书库,可以在应用代码或配置里单独指定队列连接的SSL参数:
代码方式(以Java EE/JMS为例)
在创建JMS连接工厂时,直接设置SSL相关属性:
// 创建连接工厂实例 MQConnectionFactory factory = new MQConnectionFactory(); // 设置队列管理器地址等基础参数 factory.setHostName("mq-host"); factory.setPort(1414); factory.setQueueManager("QMGR"); factory.setChannel("SSL.CHANNEL"); // 指定客户端的密钥库和信任库 factory.setStringProperty("javax.net.ssl.keyStore", "/opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks"); factory.setStringProperty("javax.net.ssl.keyStorePassword", "your-keystore-password"); factory.setStringProperty("javax.net.ssl.trustStore", "/opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks"); factory.setStringProperty("javax.net.ssl.trustStorePassword", "your-truststore-password"); // 后续创建连接...
部署描述符方式(web.xml或ejb-jar.xml)
如果使用容器管理的JMS资源,可以在glassfish-resources.xml里配置连接工厂时指定SSL属性:
<resources> <jms-connection-factory name="jms/MQConnectionFactory" res-type="com.ibm.mq.jms.MQConnectionFactory" res-auth="Container"> <property name="hostName" value="mq-host"/> <property name="port" value="1414"/> <property name="queueManager" value="QMGR"/> <property name="channel" value="SSL.CHANNEL"/> <property name="javax.net.ssl.keyStore" value="/opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks"/> <property name="javax.net.ssl.keyStorePassword" value="your-keystore-password"/> <property name="javax.net.ssl.trustStore" value="/opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks"/> <property name="javax.net.ssl.trustStorePassword" value="your-truststore-password"/> </jms-connection-factory> </resources>
然后把这个文件放在应用的WEB-INF或META-INF目录下,部署时Payara会自动创建对应的资源。
方案3:配置Payara自定义SSL上下文
这种方式更灵活,适合多个应用共享同一个客户端SSL配置的场景:
- 编辑Payara的
domain.xml(位于${PAYARA_HOME}/glassfish/domains/domain1/config/),在<ssl-service>节点下添加自定义的密钥库和信任库配置:
<ssl-service name="ssl-service"> <!-- 保留默认的ssl引擎配置 --> <ssl-engine name="ssl" ssl2-enabled="false" ssl3-enabled="false" tls-enabled="true" tls11-enabled="true" tls12-enabled="true" client-auth-enabled="false"> <certificate-store name="default-keystore" type="JKS" path="${com.sun.aas.instanceRoot}/config/keystore.jks" password="changeit"/> <trust-store name="default-truststore" type="JKS" path="${com.sun.aas.instanceRoot}/config/cacerts.jks" password="changeit"/> </ssl-engine> <!-- 添加自定义的MQ客户端SSL引擎 --> <ssl-engine name="mq-client-ssl" ssl2-enabled="false" ssl3-enabled="false" tls-enabled="true" tls11-enabled="true" tls12-enabled="true" client-auth-enabled="false"> <certificate-store name="mq-client-keystore" type="JKS" path="/opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks" password="your-keystore-password"/> <trust-store name="mq-client-truststore" type="JKS" path="/opt/oracle/config/app/ssl/MQ-CLIENT-TEST.jks" password="your-truststore-password"/> </ssl-engine> </ssl-service>
- 然后在JMS连接工厂配置中引用这个自定义SSL引擎:
<jms-connection-factory name="jms/MQConnectionFactory" res-type="com.ibm.mq.jms.MQConnectionFactory" res-auth="Container"> <!-- 其他基础参数 --> <property name="sslEngine" value="mq-client-ssl"/> </jms-connection-factory>
- 重启Payara服务器,应用就能使用这个自定义的SSL上下文连接队列管理器了。
内容的提问来源于stack exchange,提问作者m1dev
相关产品推荐
相关产品推荐

