尝试使用HTTP访问Tomcat 6 HTTPS连接器时出现意外结果

Ola*_*laf 2 https tomcat tomcat6

我在本文后面配置了一个Tomcat实例:http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html.我注释掉了HTTP连接器,因为我希望我的演示应用程序只能通过HTTPS访问.我这样配置了HTTPS连接器:

   <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" keystorePass="nopass"
           keystoreFile="/home/someuser/.keystore" keyAlias="tomcat" />
Run Code Online (Sandbox Code Playgroud)

当我使用HTTPS点击我的演示应用程序的servlet的URL时,一切正常.

当我尝试使用HTTP URL命中它时,我预计它会返回403或类似的错误.相反,我下载了一些小的(11字节?)二进制文件,其名称与servlet的名称相匹配.

有没有人遇到类似的问题?你是怎么解决的?我应该检查什么以确保我做的一切正确?

编辑:我尝试使用curl而不是浏览器命中相同的连接器,并注意到它没有返回任何标题.哦,响应的大小是7个字节,而不是11个字节.

编辑2:这是我的演示应用程序的web.xml中与安全相关的部分:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Secure Servlet</web-resource-name>
        <url-pattern>/SecureServlet</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    <auth-constraint>
        <role-name>connect</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <description>The role required to connect to the application
    </description>
    <role-name>connect</role-name>
</security-role>

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>
Run Code Online (Sandbox Code Playgroud)

Jos*_*seK 8

我通过注释HTTP连接器server.xml强制应用程序在HTTPS上工作来测试这一点

https://开头本地主机:8443/testapp

按预期工作

HTTP://本地主机:8080/testapp

返回404

HTTP://本地主机:8443/testapp

注意,协议和端口错误 混合会 返回一小段垃圾,它在IE中呈现,在Firefox中呈现为二进制

这是7个字节

你是否可以重新检查你是否看到第三种情况不应该在自然情况下发生,但只有当有人摆弄URL时?

好的,我测试过使用CONFIDENTIAL但它仍然没有将8443上的http重定向到https.我猜这只是在用户在有效的8080端口上尝试过http时才会出现的情况.

使用Fiddler,我看到返回的标题不存在,垃圾响应.

HTTP/1.1 200这个错误的服务器没有返回标头

这似乎是标准行为,以这种方式访问​​应用程序的最终用户将按预期看到垃圾.

如果你真的需要,你可以尝试编写自己的自定义Tomcat Valve,它像Filter一样处理这种特殊情况并将用户重定向到SSL