我是IT行业的新手。测试场景就像我需要测试我的应用程序的登录页面是否受SSL保护?
一般情况下,我们曾经访问某些网站,其中显示了SSL安全性的弹出窗口。所以我需要在我的应用程序中测试相同的场景。
我有一个小型网络应用程序,我有login.html
页面。基本上,我能够使用Maven启动我的Web应用程序,使用的服务器是Tomcat。我使用mvn tomcat7:run
启动的命令是http://localhost:8080/login.html
和使用http
的网址。它运作得很好。
但是我想将我的网址从https
更改为https://localhost:8080/login.html
,当我访问我的网址时,即<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Login App</h1>
<div id="emptyDiv"></div>
<div id="description"></div>
<!--container start-->
<div id="container">
<div id="container_body" style="background-color:#BBD700;float:center;">
<!--Form start-->
<div id="form_name">
<div class="firstnameorlastname">
<form >
<div id="errorBox"></div>
First Name : <input id="firstName" type="text" name="Name" value="" >
Last name : <input id="lastName" type="text" name="LastName" value="" >
</div>
<div id="email_form">
Email Id: <input style="position:right" type="text" name="Email" value="" >
</div>
<input id="sub_form" type="submit" value="Submit">
</form>
</div>
<!--form ends-->
</div>
</div>
<!--container ends-->
</body>
</html>
,那么它应该弹出SSL安全警报,我应该接受它。
如果我的问题仍然不明确,请随时发表评论。
在网上搜索后,我做了一些解决方法,但它没有成功。我尝试过:
<pre><code><!DOCTYPE web-app PUBLIC <span style="color: red;">"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</span> <span style="color: red;">"http://java.sun.com/dtd/web-app_2_3.dtd"</span>>
<web-app>
<!-- <security-constraint>
<web-resource-collection>
<web-resource-name>MyEducationApp</web-resource-name>
<url-pattern>/login.html</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Non-SecureResource</web-resource-name>
<url-pattern>/login.html</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint> -->
<display-name>Login WebApp</display-name>
</web-app>
</span></code></pre>
<!-- Maven Tomcat Plugin -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>https://localhost:8080/manager/text</url>
<server>localhost</server>
<path>/</path>
<username>admin</username>
<password>aRfalah</password>
</configuration>
<executions>
<execution>
<id>tomcat7-run</id>
<goals>
<goal>run-war-only</goal>
</goals>
<phase>pre-integration-test</phase>
<configuration>
<fork>true</fork>
</configuration>
</execution>
<execution>
<id>tomcat7-shutdown</id>
<goals>
<goal>shutdown</goal>
</goals>
<phase>post-integration-test</phase>
</execution>
</executions>
</plugin>
{{1}}
答案 0 :(得分:5)
您的网站的SSL / TLS加密在您的网络应用程序中无能为力。它是通过您的Web服务器配置完成的。
请参阅Apache Tomcat 7, SSL Configuration HOW-TO。
补充信息(从我对OQ的评论重复,因为评论不那么突出):
您无需从certification authorities(CA)之一购买证书即可获得证书。
- 免费提供2年免费扩展验证SSL证书 - 最多99个域
- 免费提供无限期2年组织验证SSL证书 - 多域名和通配符
- 免费提供无限期2年组织客户证书
https://
网站相关联。如果访问者在其浏览器中弹出的对话框中接受您的证书,则会将其存储在浏览器的证书存储区中,并且在达到证书的到期日期之前,该对话框不会再次出现。答案 1 :(得分:4)
这是你需要做的:
https://local_host:8443/login.html
(Tomcat的默认SSL端口)如果您希望仅通过SSL访问此页面,请查看Tim Funk的帖子并编辑应用程序的web.xml
。
答案 2 :(得分:3)
通常的做法是通过request.isSecure()检查请求是否通过https进入。如果没有,则将重定向发送到浏览器到相同的URL,但前缀为https协议。
这是一个用于执行此操作的示例servlet过滤器:
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SecurityFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse servletResponse = (HttpServletResponse) response;
if (!request.isSecure()) {
HttpServletRequest servletRequest = (HttpServletRequest) request;
String target = "https://" + request.getLocalName() + servletRequest.getRequestURI();
servletResponse.sendRedirect(target);
return;
}
// tell the browser to use only https for accessing this domain for the next 30 days
servletResponse.addHeader("Strict-Transport-Security", "max-age=" + (30 * 24 * 60 * 60));
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// not needed
}
@Override
public void destroy() {
// not needed
}
}
要全局启用过滤器,请将以下内容添加到web.xml:
<filter>
<filter-name>securityFilter</filter-name>
<filter-class>SecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第servletResponse.addHeader("Strict-Transport-Security", ...
行是可选的。如果您将其放入代码中,您的浏览器将永远不会尝试在接下来的30天内再次连接到http,但会使用https本身。如果您的浏览器支持HSTS standard RFC6797,则会发生这种情况。如果您的应用程序只能通过https访问,这是有道理的。但是,我认为只有使用标准的https端口443才能实现。参见下一步。
您当前的tomcat配置中存在一个小小的缺陷。无法在同一端口上运行http和https。您需要有两个单独的连接器,一个用于http,另一个用于https。
为了实现这一点,请添加到maven tomcat插件配置:
<!-- Maven Tomcat Plugin -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<httpsPort>8443</httpsPort>
. . .
您还需要在SecurityFilter代码中为重定向目标添加正确的协议(或使其成为参数):
String target = "https://" + request.getLocalName() + ":8443" + servletRequest.getRequestURI();
端口8080和8443仅用于实验性本地Web服务器,实际应用程序应位于端口80和443上。
就是这样。玩得开心,祝你好运!
答案 3 :(得分:2)
要求HTTPS并让您的servlet引擎自动重定向到https,您就可以使用transport-guarantee
所以你可能想要
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Context</web-resource-name>
<url-pattern>/login.html</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
以上内容只会将您的webapp的/login.html重定向到https。根据需要添加更多url-pattern。
更多细节: http://wiki.apache.org/tomcat/FAQ/Security#Q4和 http://marc.info/?l=tomcat-user&m=104951559722619&w=2
答案 4 :(得分:2)
从上面的原始问题:
使用开始的命令
mvn tomcat7:run
和URL使用http://localhost:8080/login.html
。它完美地运作。但是我要 将我的网址从http
更改为https
,当我访问我的网址时,即https://localhost:8080/login.html
您确定'http://localhost:8080'
和'https://localhost:8080'
吗?
这基本上意味着您从同一端口请求SSL和非SSL流量。通常,Tomcat从8080执行HTTP,从8443执行HTTPS。
此处的大多数答案都适合您,但首先请务必查看您是否在server.xml
中启用了SSL连接器。