【问题标题】:Reload Tomcat SSL protocol using groovy, ant and jmx使用 groovy、ant 和 jmx 重新加载 Tomcat SSL 协议
【发布时间】: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


    【解决方案1】:

    我现在可以运行 reloadSslHostConfigs 操作。最低点是:

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

    这个“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 请求 - 因此在没有 localhost 的情况下调用此 url 将响应 403 错误。 无论调用的操作如何,https 或 http 都可用于发出这些管理器请求 url。

    如果你喜欢阅读很多的简介,那么上面的代码可以调整为: path = "/jmxproxy/?query=*:*" 并且响应显示所有 tomcat 的各种 bean 及其属性和值。

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 2018-07-25
      • 2018-06-21
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      相关资源
      最近更新 更多