Tomcat容器管理安全的几种验证方式

Easter79
• 阅读 507

当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,它们是:

  • BASIC(基本验证):通过HTTP验证,需要提供base64编码文本的用户口令
  • DIGEST(摘要验证):通过HTTP验证,需要提供摘要编码字符串的用户口令
  • FORM(表单验证):在网页的表单上要求提供密码
  • CLIENT-CERT(客户端证书验证):以客户端证书来确认用户的身份

基本验证

当web.xml文件中的auth-method元素设置为BASIC时,表明应用使用的是基本验证,每次浏览器请求受保护的Web应用资源时,Tomcat都会使用HTTP基本验证向浏览器索取用户名和密码(以页面弹窗的方式)。使用这种验证方法,所有的密码都会以base64编码的文本在网络上传输。

先看下项目结构(我用Maven管理的依赖):

Tomcat容器管理安全的几种验证方式

其中,protect/protect.jsp是被保护的,需要授权访问。

说明:本文提到的tomcat-users.xml,server.xml等文件,如果是在Eclipse中启动tomcat,则这些文件在Eclipse中的Servers工程下对应的tomcat下,如图:

Tomcat容器管理安全的几种验证方式

本文提到的web.xml是指项目自己的web.xml,而非Servers项目下Tomcat中的web.xml

web.xml

<security-constraint>
    <web-resource-collection>
        <http-method>GET</http-method>
        <web-resource-name>tomcat protect page</web-resource-name>
        <!-- /protect目录下的所有资源是受保护的 -->
        <url-pattern>/protect/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <!-- 这里的member要与tomcat-user.xml中配置的role一致 -->
        <role-name>member</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <!-- 验证方式,可选的值为: "BASIC", "DIGEST", "FORM", "CLIENT-CERT" -->
    <auth-method>BASIC</auth-method>
    <!-- 使用的Realm名字,注意这里不能有空格 -->
    <realm-name>MyConstraints</realm-name>
</login-config>

tomcat-user.xml(注意如果是在Eclipse中启动tomcat,这个tomcat-user.xml在Eclipse中的Servers工程下)

<role rolename="member"/>
<!-- member角色下有一个叫alvis的用户,密码为pwd -->
<user username="alvis" password="pwd" roles="member"/>

重启tomcat后,访问protect目录下的资源,情况是这样的:

Tomcat容器管理安全的几种验证方式

输入账户alvis,密码pwd后,访问成功(当然,非protect目录下的资源是可以直接访问的):

Tomcat容器管理安全的几种验证方式

摘要验证

当web.xml文件中的auth-method元素设置为DIGEST时,表明应用使用的是摘要验证。还是上面的例子,看配置:

web.xml和基本验证一样,只是auth-method修改为DIGEST,此处不赘述。

server.xml中的UserDatabaseRealm(如果tomcat使用的是其他Realm,也一样的)里增加digest属性:

Tomcat容器管理安全的几种验证方式

接下来,要生成tomcat可识别的MD5密码。方式有两种,正如官网描述:

To calculate the digested value of a cleartext password, two convenience techniques are supported:

  • If you are writing an application that needs to calculate digested passwords dynamically, call the static Digest()method of the org.apache.catalina.realm.RealmBase class, passing the cleartext password and the digest algorithm name as arguments. This method will return the digested password.

  • If you want to execute a command line utility to calculate the digested password, simply execute

    CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} {cleartext-password}
    

    and the digested version of this cleartext password will be returned to standard output.

方式一:用代码来生成:

import org.apache.catalina.realm.RealmBase;

public class T {
    public static void main(String[] args) {
        //参数1:要加密的字符串;参数2:加密算法;参数3:字符串的编码
        String base = RealmBase.Digest("alvis:MyConstraints:pwd", "MD5", null);
        System.out.println(base);
    }
}

由于RealmBase类在catalina.jar包中,如果项目中没有这个类,可在项目上右键-->Java Build Path--> Libraries-->Add Library-->选择Server Runtime-->选择Apache Tomcat V8.0(其实7.0也行),如图:

Tomcat容器管理安全的几种验证方式

方式二:用脚本来生成:

在tomcat/bin目录下有个digest.sh(Linux系统)或digest.bat(Windows系统)脚本,运行这个脚本,传入摘要算法和参数即可,这里我在Windows系统上运行,如图:

Tomcat容器管理安全的几种验证方式

这里的-a指定摘要算法为MD5,要**特别注意这里的参数是:{用户名}:{Realm名}:{密码明文}**。用户名就是tomcat-users.xml中配置的名字(这里为alvis),Realm名是在web.xml中配置的(这里为MyConstraints),密码明文即该用户用于登录的密码(我这里设为pwd)。

只有这样的参数加密后的密码,在tomcat-users.xml中配置才有效,否则是登录不了的。由于我是参考_《Tomcat权威指南(第二版)》_的步骤做的,之前试了很久都不知道为什么登录不了,结果在官网找到答案,是这么描述的:

If using digested passwords with DIGEST authentication, the cleartext used to generate the digest is different and the digest must use the MD5 algorithm. In the examples above {cleartext-password} must be replaced with {username}:{realm}:{cleartext-password}. For example, in a development environment this might take the form testUser:Authentication required:testPassword. The value for {realm} is taken from the <realm-name> element of the web application's <login-config>. If not specified in web.xml, the default value of Authentication required is used.

大意是说,如果使用DIGEST方式验证,用于生成摘要的明文必须被替换为这种格式。实践出真知,所以还是不能完全看书啊,动手实践才是实在的。

然后就是在tomcat-users.xml中配置生成的密码(通过下方的截图,可以比较password跟上方digest.bat脚本生成的密码是否一致):

Tomcat容器管理安全的几种验证方式

之后重启tomcat,效果自然是跟使用基本验证的效果一样了。

表单验证

当web.xml文件中的auth-method元素设置为FORM时,表明应用使用的是表单验证。当用户请求Web应用程序受保护的资源时,表单验证会跳转至配置的登录页面。当登录失败时,还需要一个验证失败的页面,还是上面的例子,看配置:

web.xml

<security-constraint>
    <web-resource-collection>
        <http-method>GET</http-method>
        <web-resource-name>tomcat member part</web-resource-name>
        <url-pattern>/protect/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>member</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>MyConstraints</realm-name>
    <form-login-config>
        <form-login-page>/form/login.html</form-login-page>
        <form-error-page>/form/error.html</form-error-page>
    </form-login-config>
</login-config>

这里的form/login.html是用于登录的页面,而form/error.html则是验证失败后跳转到的页面(这两个页面在上方的工程结构图中已经有了)。

login.html

<html>
    <body>
    <h2>Login Page.</h2>
    
    <form method="post" action="j_security_check" name="loginForm">
        <input type="text" name="j_username" /><br>
        <input type="password" name="j_password" /><br>
        <input type="submit" value="Login" />
    </form>
    
    </body>
</html>

注意:这里form的action="j_security_check",账号的name="j_username"和密码的name="j_password"都是不可变的,否则配置的验证规则不起作用。

server.xml中,要去掉Realm中添加的“digest=MD5”这个属性:

Tomcat容器管理安全的几种验证方式

tomcat-users.xml中使用明文保存密码:

Tomcat容器管理安全的几种验证方式

效果(仅在访问protect目录下的资源时才出现Login Page):

Tomcat容器管理安全的几种验证方式

输入错误的账号和密码,跳转至form/error.html页面:

Tomcat容器管理安全的几种验证方式

输入正确的账号和密码,跳转至受保护的页面:

Tomcat容器管理安全的几种验证方式

客户端证书验证

待续

Demo下载:

链接: http://pan.baidu.com/s/1gfnqVdT 密码: pubw

参考页面:

https://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
SSO单点登录学习总结(1)——单点登录(SSO)原理解析
SSO的概念:单点登录SSO(SingleSignOn)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。SSO的用途:目前的企业应用环境中,往往有很多的应用系统,
Stella981 Stella981
3年前
Keycloak 基本功能
Keycloak是一个致力于解决应用和服务身份验证与访问管理的开源工具。可以通过简单的配置达到保护应用和服务的目的。用户管理你的应用不需要开发登录模块,验证用户和保存用户。Keycloak开发了用户管理,登录,注册,密码策略,安全问题,二步验证,密码重置等功能。登录,注册界面所需字段都是可配置,可自定义的。用户角色,权限管理功能,用户组功能。用户
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Stella981 Stella981
3年前
Spring Boot 与 Kotlin 验证web表单信息
在做web开发的时候,我们需要验证表单,确认用户提交的信息是安全的,比如用户名不能超过多少位,密码不能少于多少位等等。那么如何在SpringBoot与Kotlin中验证表单信息?在springmvc工程中,需要检查表单信息,表单信息验证主要通过注解的形式。表单验证下面我们在之前《SpringBoot与kotlin使用
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
2.权限管理准备工作:你应该知道的ASP.NET网站最基本的安全措施!
一.ASP.NET与 IIS一起使用的身份验证方法来验证用户凭据(如用户名和密码):1.Windows:基本、摘要式或集成Windows身份验证(NTLM或Kerberos)。2.Forms身份验证,您可以通过该身份验证在您的应用程序中创建登录页并管理身份验证。3.客户证书身份验证二.ASP.NET网站最基本的安全措施:
宙哈哈 宙哈哈
1年前
文字验证码:简单有效的账号安全守卫!
前言文字验证码不仅是一种简单易懂的验证方式,同时也是保护您的账号安全的重要工具。通过输入正确的文字组合,您可以有效地确认自己的身份,确保只有真正的用户才能访问您的账号。HTML代码htmlkg.captcha(//绑定元素,验证框显示区域bind:"cap
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k