0%

Idea报错:限制口令文件读取访问权限

问题背景

此先说明,我的操作系统环境是deepin-15.10.2。Tomcat版本是9.0.13
某天将JetBrains-Idea从182更新到191后(是了一百年没更新了),正常启动tomcat跑程序时候,突然刷的一下报错

错误: 必须限制口令文件读取访问权限: …/.IntelliJIdea/system/tomcat/Test/jmxremote.password

(心急的旁友直接看下边方案吧,不着急可以看看我的解决过程噢..)

解决方案

在TomcatHome/bin/catalina.sh文件中添加以下参数,位置大概在原文注释以后,所有代码以前

JAVA_OPTS=”$JAVA_OPTS -Dcom.ibm.team.jfs.app.oauth.OAuthHelper.disableSecureCookies=true”
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false”
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false”

填坑过程

(开始讲故事…)
一开始我是一脸懵逼啊,从来没见过这样的问题,遂Google。原来是因为 jmxremote.password 文件中存储了明文密码,所以此文件必须只能由所有者读取,否则程序将关闭并报错
虽然不知道细节但是既然如此chmod走一波…并未生效??重复几次,仍如此。
在linux中摸爬滚打多(== 2)年的我预感到了,这大概又是一个大坑。果不其然,Google得知, linux无法修改其他磁盘分区的文件,chmod只能在linux分区下生效,否则权限改不了,因为FAT或NTFS文件系统中根本没有linux中的这些文件权限的概念出处在此
但是搜索原来问题给出的解决方法都是修改文件权限,Windows下直接修改或者linux下chmod操作,并不能为我所用。于是灰溜溜的滚回去用182版本。
三个月后也就是今天,刚重装了Deepin又解决了一堆坑的我决定(顺便)直面这个问题。这次我决定从两个版本为什么会不一样看起。对比了下前面目录下各个工程的文件,发现只有新版本的文件下会有jmxremote.password和jmxremote.access。这其实是tomcat使用JMX安全连接所需的安全认证证书密码。JMX使用SSL认证启动后,即可以使用https访问tomcat服务器了。配置方法

自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建的MBean)注册到它里面,然后暴露给JMX client管理。简单来说就是每个Java程序都可以通过JMX来被JMX client管理,而且这一切都是自动发生的。而VisualVm就是一个JMX Client。
VisualVm能够自动发现本机的Java进程,如果要监控远程主机上的Java进程则需要显式地配置JMX连接。

附: JMX监听Java程序/tomcat配置JMX连接的配置方法

我认为,也就是说程序默认开启安全性设置,所以需要用到证书和密码,那如果我不需要安全连接,是不是可以关闭安全性设置,能像以前一样不需要证书密码,那么密码文件的权限也就无所意义了呢。
那么问题来了,如何关闭安全连接呢。我猜测大概是修改Java的运行时参数。问题又来了,直接在Idea中添加运行时参数吗?感觉有点蠢。。
我又想起tomcat启动时一般是调用的启动文件启动,也许就是在那里新增了对安全性设置的修改。
打开TomcatHome/bin/,找到startup.sh(startup.bat是Windows用的启动文件,其实Windows下是执行bin/tomcat.exe,直接读取的注册表的值),打开一看好像比较简单,没有类似运行时参数的配置格式。后来发现tomcat启动时主要调用的文件是Catalina.sh文件,是它了。(一开始是听到直接在cetenv.sh文件上添加参数,没有该文件的自己新建即可,新建完运行发现自动读取该文件了,但是参数都是not found不知道怎么回事..)
又翻了好久关于在启动文件中添加参数的格式,因为源文件中都是以脚本语言的形式添加的。

细化问题后,终于找到了解决方案。
不使用安全认证在Tomcat上激活JMX
禁用安全证书设置

于是添加以下参数到catalina.sh中,位置大概在原文注释以后,代码开始的地方吧(我觉得大概是无所谓的)..

JAVA_OPTS=”$JAVA_OPTS -Dcom.ibm.team.jfs.app.oauth.OAuthHelper.disableSecureCookies=true”
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false” // 关闭身份验证
JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false” // 关闭ssl连接

加完运行,居然成功了

开始叭叭

感动之余,发现即使不修改catalina.sh,在182版本中这些参数也会在运行日志中打印出来,说明182中这是默认的设置,但是191中就炸了。
因此我猜测,大概是191新版本中将安全连接设为了必须。但询问发现周围小伙伴都没有见过相关的问题(有我也不用困扰这么久了),但也许是因为他们使用的Windows所以密码文件的读取权限没有问题所以没有发现这个更新呢?
算了,至少问题总算解决(至少目前看来是这样的),写了三个月的后端,我都差点忘了自己其实是个android程序员了。。(虽说程序员不该界定自己的技术栈吧,,)

注:

由于该问题研究过程中,关联到太多的细节和底层问题,所以文中有些部分是自己结合技术文章的见解,有可能不是正解(这些部分我都有写明)而且最后方案不一定是准确解决了症结,但它确确实实解决了我的问题来的。写这篇文章的目的主要为了记录这次填坑之旅所遇到及了解到的知识,因此有其他意见希望向我提出交流。

博客的留言功能还没有折腾,欢迎发我[邮箱 xiaohuangren028@gmail.com]啊。


关于修改密码文件的权限,后来我又找到这篇博客,其中提到权限修改失败还有可能是因为方式错误。

在配置JMX远程访问的时候,设置jmxremote.password文件权限,修改该文件时添加写权限,chmod +w jmxremote.password ,放开角色信息那俩行的注释,保存,再使用chmod 0400 jmxremote.password
这样就是它正确的权限设置
jmxremote.password 在jdk/jre/lib/management/下,jmxremote.password.template复制,去掉.template后缀

如果不是因为挂载原因无法修改权限的,可以尝试以上方法。


完结 撒花 ฅ>ω<*ฅ