首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用groovy、ant和jmx重新加载Tomcat SSL协议

使用groovy、ant和jmx重新加载Tomcat SSL协议
EN

Stack Overflow用户
提问于 2020-07-01 04:39:31
回答 1查看 217关注 0票数 0

我正在尝试在Tomcat中自动更新证书,需要重新加载SSL协议。这个问题类似于我对How do I force tomcat to reload trusted certificates?Programmatically update certificates in tomcat 8 without server restart的要求。实际上,我想发出reloadSslHostConfigs jmx命令。这可以通过以下方式实现

代码语言:javascript
复制
    https://localhost/manager/jmxproxy?invoke=Catalina:type=ProtocolHandler,port=8443,address="127.0.0.1"&op=reloadSslHostConfigs

"manager“webapp提供了一组我可以使用的方便的操作,通过将"ant”定义加载到groovy中,我可以很容易地重新加载web。下面是一段groovy代码来实现这一点:

代码语言:javascript
复制
      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命令呢?我想我越来越接近了:

代码语言:javascript
复制
ant.jmxManagerQuery (url:jmx_base, query:"Catalina:type=Environment,resourcetype=Global,name=*", username:username, password:pass)

当前返回

代码语言:javascript
复制
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。连接器配置如下所示:

代码语言:javascript
复制
    <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>
EN

Stack Overflow用户

发布于 2020-07-17 22:06:43

现在,我已经让reloadSslHostConfigs操作正常工作了。下面是:

必须启用

  1. tomcat的经理web应用程序,并在conf/tomcat-users.xml中分配一个具有manager-jmx‘角色’的用户登录名。(或者您可以通过启动参数启用远程JMX,以支持远程控制重新加载)。
  2. 重新加载不会重新读取server.xml配置。它只从磁盘重新读取证书文件。因此,在调用reloadSsl之前,必须使用刷新的证书更新此文件(或多个文件)。
  3. 'bean name‘在不同的环境中可能略有不同。您可以使用管理器的jmx查询或Get url(或等效的JMX调用)来定位应该应用ssl证书操作的正确bean名称。如果bean名称不完整或不正确,您将得到类似Tomcat Tomcat的ssl端口由于错误的证书文件而未启动之类的错误信息,然后需要更正此错误,然后重新启动javax.management.InstanceNotFoundException: Catalina:type=ProtocolHandler at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)
  4. If (或一组更复杂的jmx调用)。您不能只是更正证书文件,然后执行此ssl重新加载操作。

这段“groovy”代码似乎对我很有效:

代码语言:javascript
复制
    @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以及它们的属性和值。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62665817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档