【发布时间】:2020-06-30 20:39:31
【问题描述】:
我正在尝试自动更新 Tomcat 中的证书,需要重新加载 SSL 协议。 这个问题类似于我的要求 How do I force tomcat to reload trusted certificates? 和 Programmatically update certificates in tomcat 8 without server restart .本质上,我想发出 reloadSslHostConfigs jmx 命令。这可以通过
https://localhost/manager/jmxproxy?invoke=Catalina:type=ProtocolHandler,port=8443,address="127.0.0.1"&op=reloadSslHostConfigs
“manager”webapp 提供了一组方便的操作,我可以使用这些操作,并且将“ant”定义加载到 groovy 中,我可以很容易地重新加载 web。这是一个 groovy 的 sn-p 方法:
def ant = new AntBuilder()
ant.import (file:new File(catalina_home, "bin/catalina-tasks.xml"))
switch (action) {
case 'd':
ant.deploy (url:web_base, username:username, password:pass
, path:"/" + webs[0], update:"true", war:war_path )
break
case 's':
webs.each {webapp ->
ant.start (url:web_base, username:username, password:pass, path:"/" + webapp)
}
break
https://tomcat.apache.org/tomcat-9.0-doc/manager-howto.html 此处的文档还显示它支持 JXMquery/get/set - 但我不确定如何应用/使用它。我还看到了第二组 jmx 和定义,其中包括启动/停止/调用。我想我需要调用类型。但是是否或如何使用它来发出 reloadSsl 命令。我想我越来越近了:
ant.jmxManagerQuery (url:jmx_base, query:"Catalina:type=Environment,resourcetype=Global,name=*", username:username, password:pass)
目前返回
Trying to override old definition of datatype resources
[jmxManagerQuery] Query string is ?qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3D*
Error: : java.io.IOException: Server returned HTTP response code: 403 for URL: http://localhost:8080/manager/jmxproxy/?qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3D*
我还启用了远程 jmx,只是想看看这是否有效: https://groovy-lang.org/jmx.html#_monitoring_tomcat 实际上,按照这些说明,我可以使记录的示例正常工作 - 但我宁愿不启用直接 jmx,而是使用管理器应用程序。而且我也看不到这种形式的 jmx 访问将如何用于引发 ssl 重新加载。
我在这里看到了一个有用的例子:https://github.com/rmannibucau/letsencrypt-manager/blob/master/src/main/java/com/github/rmannibucau/letsencrypt/manager/LetsEncryptManager.java 这汇集了这个出色演示文稿中的大部分要求:http://tomcat.apache.org/presentations.html#latest-lets-encrypt
对于只想要一个简单的 bash 或 groovy 脚本来快速完成证书获取和重新加载而不重新启动 Tomcat 的不经常使用的开发人员来说,这一切都相当混乱。
PS。连接器配置如下所示:
<Connector SSLEnabled="true" maxThreads="150" port="443" protocol="org.apache.coyote.http11.Http11Nio2Protocol">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"></UpgradeProtocol>
<SSLHostConfig certificateVerification="false" ciphers="HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!kRSA" honorCipherOrder="true" protocols="TLSv1.1,TLSv1.2">
<Certificate certificateKeystoreFile="blaa" certificateKeystorePassword="blaa" certificateKeystoreType="JKS"></Certificate>
</SSLHostConfig>
</Connector>
【问题讨论】:
标签: tomcat groovy ssl-certificate jmx