我正在尝试在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代码来实现这一点:
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>发布于 2020-07-17 22:06:43
现在,我已经让reloadSslHostConfigs操作正常工作了。下面是:
必须启用
javax.management.InstanceNotFoundException: Catalina:type=ProtocolHandler at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)这段“groovy”代码似乎对我很有效:
@Grab(group='com.github.groovy-wslite', module='groovy-wslite', version='1.1.3')
import wslite.rest.*
import wslite.http.auth.*
RESTClient client = new RESTClient("https://localhost/manager")
client.httpClient.sslTrustAllCerts = true
client.authorization = new HTTPBasicAuthorization("username", "userpassword")
def path = "/jmxproxy/?invoke=Catalina:type=ProtocolHandler,port=443&op=reloadSslHostConfigs"
def response
response = client.get(path: path)
println response.text如果配置的证书文件仍然有效,则返回:
OK - Operation reloadSslHostConfigs without return value
但是,如果证书文件现在包含无效的证书,或者该文件不再存在,则会得到一个错误响应。我确信这可以在没有"wslite“库的情况下完成,或者转换为Java (因为groovy是一个非常好的Java包装器)。或者curl,甚至wget命令(尽管这些命令似乎为我返回了错误)。或者可以发出RESTful请求/响应的任何数量的其他事物。
管理器webapp响应localhost请求-因此调用此url而不使用localhost将响应403错误。https或http都可以用来发出这些管理器请求url,而不管调用的是什么动作。
如果您喜欢阅读大量的格式回复信息,那么可以使用:path = "/jmxproxy/?query=*:*"来调整上面的代码,响应将显示所有tomcats、各种bean以及它们的属性和值。
https://stackoverflow.com/questions/62665817
复制相似问题