Remote connection failed: javax.security.sasl.SaslException: Authentication failed: all available au

部署项目时遇到JBoss权限问题,通过调整standalone配置文件中的用户和角色设置解决了远程连接失败的问题。
部署运行你感兴趣的模型镜像

       今天新申请了阿里云的服务器,运营室给安装了jboss,高高兴兴部署项目的时候,发现报了如下问题。上网一搜说是没有可用权限的用户。我在用的时候新建了manage用户和application用户,(具体新建方法可参照前面)用来往jboss消息队列上发消息使用,结果到配置文件中看了一下,standalone/configuration文件夹下的application-user.properties和application-role.properties及mgmt-user.properties文件,3个文件里面没有新增用户和角色。但是在domain/configuration下对应的文件用户已添加成功,让人很诧异(可能是运营室把standalone文件夹重命名为server1导致的,这个后续再验证)。报错如下:

"config-based-naming-client-endpoint" read-1) JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed

14:23:43,753 ERROR [stderr] (Thread-81) javax.naming.NamingException: Failed to create remoting connection [Root exception is java.lang.RuntimeException: javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed]
14:23:43,754 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.ClientUtil.namingException(ClientUtil.java:36)
14:23:43,755 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.InitialContextFactory.getInitialContext(InitialContextFactory.java:121)
14:23:43,755 ERROR [stderr] (Thread-81) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
14:23:43,756 ERROR [stderr] (Thread-81) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
14:23:43,756 ERROR [stderr] (Thread-81) at javax.naming.InitialContext.init(InitialContext.java:223)
14:23:43,756 ERROR [stderr] (Thread-81) at javax.naming.InitialContext.<init>(InitialContext.java:197)
14:23:43,766 ERROR [stderr] (Thread-81) Caused by: java.lang.RuntimeException: javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed
14:23:43,769 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.protocol.IoFutureHelper.get(IoFutureHelper.java:87)
14:23:43,769 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.NamingStoreCache.getRemoteNamingStore(NamingStoreCache.java:56)
14:23:43,770 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.InitialContextFactory.getOrCreateCachedNamingStore(InitialContextFactory.java:166)
14:23:43,770 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.InitialContextFactory.getOrCreateNamingStore(InitialContextFactory.java:139)
14:23:43,771 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.InitialContextFactory.getInitialContext(InitialContextFactory.java:104)
14:23:43,771 ERROR [org.jboss.remoting.remote.connection] (Remoting "config-based-naming-client-endpoint" read-1) JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed
14:23:43,771 ERROR [stderr] (Thread-81) ... 8 more
14:23:43,775 ERROR [stderr] (Thread-81) Caused by: javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed
14:23:43,776 ERROR [stderr] (Thread-81) at org.jboss.remoting3.remote.ClientConnectionOpenListener$Capabilities.handleEvent(ClientConnectionOpenListener.java:365)
14:23:43,776 ERROR [stderr] (Thread-81) at org.jboss.remoting3.remote.ClientConnectionOpenListener$Capabilities.handleEvent(ClientConnectionOpenListener.java:214)
14:23:43,777 ERROR [stderr] (Thread-81) at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:72)
14:23:43,777 ERROR [stderr] (Thread-81) at org.xnio.channels.TranslatingSuspendableChannel.handleReadable(TranslatingSuspendableChannel.java:189)
14:23:43,778 ERROR [stderr] (Thread-81) at org.xnio.channels.TranslatingSuspendableChannel$1.handleEvent(TranslatingSuspendableChannel.java:103)
14:23:43,778 ERROR [stderr] (Thread-81) at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:72)
14:23:43,778 ERROR [stderr] (Thread-81) at org.xnio.nio.NioHandle.run(NioHandle.java:90)
14:23:43,779 ERROR [stderr] (Thread-81) at org.xnio.nio.WorkerThread.run(WorkerThread.java:184)
14:23:43,779 ERROR [stderr] (Thread-81) at ...asynchronous invocation...(Unknown Source)
14:23:43,779 ERROR [stderr] (Thread-81) at org.jboss.remoting3.EndpointImpl.doConnect(EndpointImpl.java:270)
14:23:43,780 ERROR [stderr] (Thread-81) at org.jboss.remoting3.EndpointImpl.doConnect(EndpointImpl.java:251)
14:23:43,780 ERROR [stderr] (Thread-81) at org.jboss.remoting3.EndpointImpl.connect(EndpointImpl.java:349)
14:23:43,780 ERROR [stderr] (Thread-81) at org.jboss.remoting3.EndpointImpl.connect(EndpointImpl.java:333)
14:23:43,781 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.EndpointCache$EndpointWrapper.connect(EndpointCache.java:105)
14:23:43,781 ERROR [stderr] (Thread-81) at org.jboss.naming.remote.client.NamingStoreCache.getRemoteNamingStore(NamingStoreCache.java:55)

14:23:43,782 ERROR [stderr] (Thread-81) ... 11 more



解决办法是,将domain中对应文件里的加密信息复制到standalone的配置文件(只复制新增内容),重启服务即可解决。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

### Spring框架中邮件发送时因TLS握手失败和证书验证问题的解决方案 在Spring框架中,当使用JavaMailSender接口发送邮件时,如果目标SMTP服务器使用了HTTPS或TLS协议,可能会出现`javax.net.ssl.SSLHandshakeException: PKIX path building failed`错误。该错误表明JVM无法验证目标服务器的SSL/TLS证书路径[^1]。 #### 1. 问题原因分析 此问题的核心是JVM的安全策略要求所有SSL/TLS连接必须使用受信任的证书。如果目标SMTP服务器的证书未被JVM的信任库(truststore)识别,则会抛出`PKIX path building failed`异常。具体表现为以下几种情况: - SMTP服务器使用自签名证书。 - SMTP服务器的证书链不完整。 - JVM的信任库中缺少根证书或中间证书[^2]。 #### 2. 解决方案 以下是几种常见的解决方法: #### 方法一:将目标SMTP服务器的证书导入JVM信任库 通过以下步骤可以将目标SMTP服务器的证书添加到JVM的信任库中: 1. 使用`InstallCert.java`工具生成目标SMTP服务器的证书文件。执行命令如下: ```bash java InstallCert smtp.example.com ``` 运行后,工具会提示是否接受证书。输入“y”并保存生成的`jssecacerts`文件[^4]。 2. 将生成的`jssecacerts`文件复制到JDK的`lib/security`目录下,并替换默认的`cacerts`文件。或者通过系统属性指定新的信任库路径: ```properties -Djavax.net.ssl.trustStore=/path/to/jssecacerts -Djavax.net.ssl.trustStorePassword=changeit ``` 3. 配置Spring Mail的`JavaMailSenderImpl`以启用TLS连接: ```java @Bean public JavaMailSender getJavaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.example.com"); mailSender.setPort(587); mailSender.setUsername("your-email@example.com"); mailSender.setPassword("your-password"); Properties props = mailSender.getJavaMailProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.ssl.trust", "smtp.example.com"); // 可选配置 return mailSender; } ``` #### 方法二:忽略证书验证(仅用于测试环境) 在开发或测试环境中,可以通过禁用证书验证来快速解决问题。但这种方法**不推荐用于生产环境**,因为它会使连接变得不安全。代码示例如下: ```java static { try { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {} public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {} } }; SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HostnameVerifier allHostsValid = (hostname, session) -> true; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); } catch (Exception e) { e.printStackTrace(); } } ``` 上述代码通过自定义`TrustManager`类跳过了证书验证过程[^3]。 #### 方法三:手动配置证书信任 如果不想修改全局的信任库,也可以通过程序动态加载证书。例如: ```java KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream fis = new FileInputStream("path/to/certificate.cer"); keyStore.load(fis, null); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), null); MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustStore(keyStore); ``` 然后在`JavaMailSenderImpl`中设置`mail.smtp.ssl.socketFactory`属性为上述`MailSSLSocketFactory`实例。 #### 3. 注意事项 - **生产环境安全性**:在生产环境中,建议始终使用受信任的证书,而不是忽略证书验证。 - **证书更新**:如果目标SMTP服务器的证书发生变更,需要重新导入新证书。 - **JDK版本差异**:不同版本的JDK可能具有不同的默认信任库内容,确保使用最新的JDK版本[^4]。 ```java props.put("mail.smtp.ssl.trust", "smtp.example.com"); ``` 上述配置允许JVM信任特定的SMTP服务器,而无需导入其证书。 ### 示例代码 以下是一个完整的Spring Boot邮件发送配置示例: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mail.javamail.JavaMailSenderImpl; import java.util.Properties; @Configuration public class MailConfig { @Bean public JavaMailSender getJavaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.example.com"); mailSender.setPort(587); mailSender.setUsername("your-email@example.com"); mailSender.setPassword("your-password"); Properties props = mailSender.getJavaMailProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.ssl.trust", "smtp.example.com"); return mailSender; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值