【问题标题】:Tomcat 8 Manager war deploy upload fails over SSLTomcat 8 Manager 战争部署上传失败通过 SSL
【发布时间】:2016-11-10 07:41:19
【问题描述】:

这是一个奇怪的问题 - 我四处寻找线索,但没有找到任何线索。在 Solaris 上运行 Tomcat 8 / Java 8。为 SSL 配置的 NIO 连接器。一切似乎都运行良好,但现在通过管理器部署战争文件在 Firefox 和 Chrome 上失败。在旧的仿真节点中使用 IE 11 似乎仍然可以工作。不同的浏览器给出不同的抱怨: FF - 安全连接失败,Chrome - 无法访问此站点。 其他一切似乎都正常 - 您可以登录管理器,SSL 连接看起来配置正确,您可以浏览到各种管理器页面,但文件上传部署失败。我检查了管理器日志,该请求的错误似乎与 bufferCrypt 和 NativeGCMCipher 有关。 (见下面的堆栈跟踪) 我试过了: -更新到最新的 JDK (u92) - Oracle 报告了 NativeGCMCipher 中的缓冲区大小确定问题,该问题已修复 -尝试在连接器中设置更大的缓冲区,即socket.rxBufSize、socket.txBufSize和socketBuffer - 尝试切换到 BIO 连接器(认为这在另一台服务器上解决了这个问题) 但没有任何运气。

如果有人有任何建议,将不胜感激。我们可以使用 IE 进行上传或简单的复制部署,但我担心当我们在这些服务器上分配 25 个应用程序时,这个更大问题的迹象可能会困扰我们。

这是来自管理器日志的堆栈跟踪:

07-Jul-2016 13:44:12.597 INFO [http-nio-8086-exec-19] org.apache.catalina.core.ApplicationContext.log HTMLManager: list: Listing contexts for virtual host 'localhost'
07-Jul-2016 13:44:50.623 SEVERE [http-nio-8086-exec-19] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [HTMLManager] in context with path [/manager] threw exception
 java.security.ProviderException: Could not determine buffer size
    at javax.crypto.CipherSpi.bufferCrypt(CipherSpi.java:843)
    at javax.crypto.CipherSpi.engineDoFinal(CipherSpi.java:730)
    at javax.crypto.Cipher.doFinal(Cipher.java:2460)
    at sun.security.ssl.CipherBox.decrypt(CipherBox.java:535)
    at sun.security.ssl.EngineInputRecord.decrypt(EngineInputRecord.java:200)
    at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:974)
    at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
    at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
    at org.apache.tomcat.util.net.SecureNioChannel.read(SecureNioChannel.java:455)
    at org.apache.tomcat.util.net.NioBlockingSelector.read(NioBlockingSelector.java:173)
    at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:251)
    at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:232)
    at org.apache.coyote.http11.InternalNioInputBuffer.fill(InternalNioInputBuffer.java:133)
    at org.apache.coyote.http11.InternalNioInputBuffer$SocketInputBuffer.doRead(InternalNioInputBuffer.java:177)
    at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:110)
    at org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:416)
    at org.apache.coyote.Request.doRead(Request.java:469)
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:338)
    at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:395)
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:363)
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:190)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:132)
    at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:946)
    at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:850)
    at java.io.InputStream.read(InputStream.java:101)
    at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98)
    at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68)
    at org.apache.tomcat.util.http.fileupload.MultipartStream.readBodyData(MultipartStream.java:539)
    at org.apache.tomcat.util.http.fileupload.MultipartStream.discardBodyData(MultipartStream.java:563)
    at org.apache.tomcat.util.http.fileupload.MultipartStream.skipPreamble(MultipartStream.java:580)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:874)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:854)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256)
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280)
    at org.apache.catalina.connector.Request.parseParts(Request.java:2730)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:3064)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1093)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:380)
    at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:185)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:194)
    at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:318)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:676)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.crypto.ShortBufferException: Output buffer must be (at least) 12272 bytes long
    at com.oracle.security.ucrypto.NativeGCMCipher.engineUpdate(NativeGCMCipher.java:266)
    at javax.crypto.CipherSpi.bufferCrypt(CipherSpi.java:828)
    ... 67 more

【问题讨论】:

    标签: java tomcat ssl encryption deployment


    【解决方案1】:

    您帖子的最后几行是指套接字输出缓冲区。

    tomcat configuration page 读取

    socketBuffer 要提供的缓冲区的大小(以字节为单位) 套接字输出缓冲。 -1 可以指定禁用使用 缓冲。默认情况下,将使用 9000 字节的缓冲区。

    所以我想第一步是在 server.xml 中找到您的 ssl 连接器并添加 socketBuffer="12272" 或更大的值。

    这在ibm's tomcat tuning page调优tomcat下也有提到。

    【讨论】:

    • 我试过这个,即socketBuffer="12272",但上传部署仍然失败。我再次尝试确定并发现了更多的怪异之处。当我尝试使用 Firefox 上传部署时,我没有收到缓冲区错误,但是当我使用 Chrome 尝试时,我确实在管理器日志中收到了缓冲区错误。
    • 进一步谈到与浏览器相关的问题,但至于为什么我很难过。我倾向于认为缓冲区错误是一个误导性的或者可能不相关的错误,但我没有其他事情要做。我以为我可以回退到 BIO 连接器,但它表现出同样的问题。我猜这与 SSL 设置有关。我们使用的是内部颁发的证书,但我们的组织
    • 和 sslProtocol="TLS"
    • 我还在看,不过想问一下,你试过比“12272”更大的值吗?
    • 第一次尝试 socket.txBufSize="64000" 基于另一个帖子
    【解决方案2】:

    我的系统也有同样的问题。经过一天的搜索,我发现 oracle ucrypto JCE provider 似乎有罪。 所以我打开了文件 jdk1.8.0_121/jre/lib/security/java.security 并注释掉该行

    #security.provider.1=com.oracle.security.ucrypto.UcryptoProvider ${java.home}/lib/security/ucrypto-solaris.cfg
    

    重启后,我的系统运行良好。

    【讨论】:

    • 感谢您的提示!我会调查的。您认为禁用此提供程序有不利之处吗?它会退回到一些默认的 ucrypto 提供商吗?
    • 另一条信息。我曾与我的开发人员进行了双重回复,他们前一段时间部署更频繁,他们说他们不再遇到这个问题。一些人今天再次证实了这一点。 (我们没有改变任何东西!)这让我认为问题与浏览器有关,并且在此过程中某处的浏览器更新为我们解决了问题。
    • 当禁用 ucrypto 时,jdk 将使用 SUN 作为 JCE 提供者。 Oracle 文档指出 ucrypto 在 solaris 中比默认的 java JCE 提供程序 (SUN) 工作得更好。但在我的情况下,ucrypto 似乎有问题。
    猜你喜欢
    • 2018-06-28
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2015-04-02
    • 2023-03-21
    相关资源
    最近更新 更多