我按照这篇文章配置了一个 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" />
当我使用 HTTPS 访问我的演示应用程序的 servlet 的 URL 时,一切正常。
当我尝试使用 HTTP URL 访问它时,我预计它会返回 403 或类似的错误。相反,我下载了一些小的(11 字节?)二进制文件,其名称与 servlet 的名称匹配。
有没有人遇到过类似的问题?你是怎么解决的?我应该检查什么以确保我做的一切都是正确的?
编辑: 我尝试使用 curl 而不是浏览器访问相同的连接器,并注意到它没有返回任何 header 。哦,响应的大小是 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>
最佳答案
我通过在 server.xml
中注释掉 HTTP 连接器来测试这一点,强制应用程序在 HTTPS 上运行
按预期工作
返回 404
注意不正确 协议(protocol)的混合 和端口 返回一个小的垃圾流,它在 IE 中呈现,在 Firefox 中以二进制形式呈现
这是7个字节
您能否重新检查您是否看到了第三种情况,这种情况在自然情况下不应该发生,但只有在有人修改 URL 时才会发生?
好的,我使用 CONFIDENTIAL
进行了测试,但它仍然没有将 8443 上的 http 重定向到 https。我猜只有当用户在有效的 8080 端口上尝试 http 时才会出现这种情况。
使用 Fiddler,我看到返回的 header 不存在并且响应是垃圾。
HTTP/1.1 200 This buggy server did not return headers
这似乎是标准行为,以这种方式访问应用程序的最终用户会看到预期的垃圾。
如果你真的需要,你could try writing你自己的custom Tomcat Valve它就像一个过滤器来处理这种特殊情况并将用户重定向到 SSL
关于tomcat - 尝试使用 HTTP 访问 Tomcat 6 HTTPS 连接器时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164944/