tomcat+eclipse+servlet在chrome上实现 https 双向认证简单记录

1.安装tomcat。

参考链接:
TomCat 9.0服务器下载、安装与配置
https://www.jianshu.com/p/c5c2aaa574f8

首先打开官网。
http://tomcat.apache.org/
随便找一个版本,点击Download。

image.png

然后点击下载所需版本。我这里是64位电脑。所以按照core下的64-bit windows zip文件。


image.png

将apache-tomcat-9.0.19-windows-x64.zip文件解压到D:\TomCat中。
如图所示。


image.png

然后 配置tomcat系统环境变量(注意这里的前提是JDK已经配置好)。

变量名:CATALINA_HOME
变量值:D:\TomCat(TomCat的根目录)

配置好后可以进行TomCat的启动与关闭操作。
需操作startup.bat和shutdown.bat进行启动与关闭。这两个文件在tomcat的bin目录下。

image.png
双击startup.bat,启动服务器。(不要点击右上角的关闭,否则意味着关闭TomCat服务器)。

出现server startup表示成功启动。


image.png
关闭TomCat服务器可以直接点击右上角的关闭,但不推荐这么做。推荐的做法是双击shutdown.bat。

保持tomcat开启的同时,打开浏览器,在地址栏输入 http://localhost:8080/ 回车,就出现了tomcat自带界面。到这里tomcat基本配置就完成了,接下来需要安装eclipse了。

image.png
image.png

2.安装eclipse。

参考链接:
Web开发环境搭建 Eclipse-Java EE 篇
https://www.cnblogs.com/yangyxd/articles/5615965.html

基本上我完全是参考这个的。

3.部署servlet到tomcat。

参考链接:
Servlets - File Uploading
https://www.tutorialspoint.com/servlets/servlets-file-uploading.htm

JSP - 文件上传
https://wiki.jikexueyuan.com/project/jsp/file-uploading.html

在Tomcat中手动部署servlet
https://blog.csdn.net/abvedu/article/details/54670249

由于我是想要通过servlet去实现了一个上传文件的功能,因此在安装好eclipse并设置好Build Path后,还需要下载fileupload所需jar包。

http://commons.apache.org/fileupload/
下载commons-fileupload.x.x.jar

http://commons.apache.org/proper/commons-io/
下载 commons-io-x.x.jar
image.png
image.png

下载zip格式的文件。


image.png
image.png
image.png

解压 ,找到commons-io-2.6.jar 和commons-fileupload-1.4.jar这两个jar包,放到本机tomcat目录中的lib文件下。


image.png

image.png
image.png

在 Eclipse 中,点击菜单栏 Window->Preferences , 点击 Java ->Build Path -> User Libraries ,点击Add External JARs,将commons-io-2.6.jar 和commons-fileupload-1.4.jar选中然后添加进去,点击应用。

image.png

新建一个Dynamic Web Project并成功运行一个hello world工程后,现在来新建一个servlet文件。


image.png
image.png

点击finish。

image.png


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
      private boolean isMultipart;
       private String filePath;
       private int maxFileSize = 50 * 1024;
       private int maxMemSize = 4 * 1024;
       private File file ;

       public void init( ){
          // Get the file location where it would be stored.
          filePath = "d:/";//getServletContext().getInitParameter("file-upload"); 
       }
       
       public void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, java.io.IOException {
       
          // Check that we have a file upload request
          isMultipart = ServletFileUpload.isMultipartContent(request);
          response.setContentType("text/html");
          java.io.PrintWriter out = response.getWriter( );
       
          if( !isMultipart ) {
             out.println("<html>");
             out.println("<head>");
             out.println("<title>Servlet upload</title>");  
             out.println("</head>");
             out.println("<body>");
             out.println("<p>No file uploaded</p>"); 
             out.println("</body>");
             out.println("</html>");
             return;
          }
      
          DiskFileItemFactory factory = new DiskFileItemFactory();
       
          // maximum size that will be stored in memory
          factory.setSizeThreshold(maxMemSize);
       
          // Location to save data that is larger than maxMemSize.
          factory.setRepository(new File("c:\\temp"));

          // Create a new file upload handler
          ServletFileUpload upload = new ServletFileUpload(factory);
       
          // maximum file size to be uploaded.
          upload.setSizeMax( maxFileSize );

          try { 
             // Parse the request to get file items.
             List fileItems = upload.parseRequest(request);
        
             // Process the uploaded file items
             Iterator i = fileItems.iterator();

             out.println("<html>");
             out.println("<head>");
             out.println("<title>Servlet upload</title>");  
             out.println("</head>");
             out.println("<body>");
       
             while ( i.hasNext () ) {
                FileItem fi = (FileItem)i.next();
                if ( !fi.isFormField () ) {
                   // Get the uploaded file parameters
                   String fieldName = fi.getFieldName();
                   String fileName = fi.getName();
                   String contentType = fi.getContentType();
                   boolean isInMemory = fi.isInMemory();
                   long sizeInBytes = fi.getSize();
                
                   // Write the file
                   if( fileName.lastIndexOf("\\") >= 0 ) {
                      file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ;
                   } else {
                      file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
                   }
                   fi.write( file ) ;
                   out.println("Uploaded Filename: " + fileName + "<br>");
                }
             }
             out.println("</body>");
             out.println("</html>");
             } catch(Exception ex) {
                System.out.println(ex);
             }
          }
          
          public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, java.io.IOException {
            response.getWriter().append("Served at: ").append(request.getContextPath());

          }
       }

编译一下,保证代码没有错误能正常运行。我这里是把文件直接上传到电脑的D盘。
注意,这里编译需要选中java文件,然后run on server。


image.png
image.png

打开tomcat下的webapps文件,新建一个文件夹。upload,然后再在upload中新建一个WEB-INF文件夹。


image.png
image.png

打开eclipse的工程文件目录,把编译的classes文件夹copy至WEB-INF文件夹中。

image.png
image.png

现在还需要配置index.html和web.xml这两个文件。
在WEB-INF文件夹下新建web.xml。

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5"> 
    <servlet>
        <servlet-name>UploadServlet</servlet-name>
        <servlet-class>UploadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UploadServlet</servlet-name>
        <url-pattern>/UploadServlet</url-pattern>
    </servlet-mapping>
    
</web-app>
image.png

在upload目录下新建index.html文件。

image.png
<?xml version="1.0" encoding="ISO-8859-1"?>
<html>
   <head>
      <title>File Uploading Form</title>
   </head>
   
   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      <form action = "/upload/UploadServlet" method = "post" enctype = "multipart/form-data">
         <input type = "file" name = "file" size = "50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
   </body>
</html>

4.生成证书。

参考链接:
Tomcat服务器配置https双向认证(使用keytool生成证书)
http://www.hangge.com/blog/cache/detail_992.html

这里需要为chrome浏览器和tomcat生成一些证书,生成完证书后,需要配置到chrome中。
要想实现https双向认证,chrome需要p12和cer格式的证书,tomcat需要keystore格式的证书。
总共需要生成这3种格式的证书,并且需要使客户端和服务器双方相互信任。

进入
由于忘记java路径,进入cmd后输入以下命令查看。

java -verbose

进入路径,这里有生成证书所需的keytool。

image.png
image.png

4.1 为Tomcat生成keystore 格式证书

keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500

输入命令后,密钥库口令设置成 123456,由于我只是本机测试用,所以其他的名字与姓氏等随便写,<tomcat>的秘钥口令直接按回车设置成与密钥库口令一致。


4.2 生成chrome所需p12格式的证书。

首先,为chrome生成p12格式客户端证书。

keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\mykey.p12

密码123456,其他我都填的aa。


image.png

4.3 将客户端证书导入服务器证书,让服务器信任客户端证书。
由于p12不能导入keystore,但是cer可用导入keystore,因此将客户端的p12证书转.cer,然后导入keystore。

keytool -export -alias mykey -keystore D:\mykey.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\mykey.cer
//将cer导入keystore
keytool -import -v -file D:\mykey.cer -keystore D:\tomcat.keystore
image.png

4.4 将服务器证书导入客户端证书,让客户端信任服务器。

keytool -keystore D:\tomcat.keystore -export -alias tomcat -file D:\tomcat.cer
image.png

这个tomcat.cer证书是要给chrome用的。

到这里我们一共生成了4个证书,tomcat.cer和mykey.p12是给chrome用的,tomcat.keystore是给tomcat用的,mykey.cer这里用不上。


image.png
image.png

4.5 先使用tomcat.cer和mykey.p12对chrome进行配置。
配置p12。
双击mykey.p12。


image.png
image.png

输入密码123456


image.png
image.png

点击完成。

image.png
image.png

配置cer。
打开chrome中的设置。


image.png

打开高级。


image.png

点击管理证书。
image.png

选择受信任的根证书颁发机构,点击导入。


image.png

选中需要导入的tomcat.cer文件。


image.png

点击下一步。


image.png

点击完成。



点击是。

显示导入成功。


image.png

在受信任的根证书颁发机构这一栏目下可以看到导入的证书aa。


image.png
image.png

到这里chrome端配置就完成了,下面需要对tomcat进行配置。

5.配置tomcat,开启https。

参考链接:
把Tomcat的http改为https的步骤、方法
https://blog.csdn.net/baidu_35975930/article/details/70739226

修改TomCat\conf目录下server.xml文件。
搜索8443找到下面这项:


image.png

在这个Connector后面添加如下代码。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="true"  sslProtocol="TLS" 
                keystoreFile="D:\tomcat.keystore" keystorePass="123456"
                truststoreFile="D:\tomcat.keystore" truststorePass="123456"
               />   
image.png

修改TomCat\conf目录下的web.xml文件。
在web-app中添加如下代码。

<security-constraint>    
        <web-resource-collection >    
            <web-resource-name>SSL</web-resource-name>    
            <url-pattern>/*</url-pattern>    
        </web-resource-collection>    
        <user-data-constraint>    
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>    
        </user-data-constraint>    
</security-constraint> 
image.png

注意: 配置好后我遇到了证书失效,需要重新导入,并且有其他不能访问的问题,需要重启tomcat。因此配置完还是需要先重启一下。有可能是因为我eclipse没有关闭导致的,应该把eclipse关了,从startup.bat去开启tomcat。

在配置好后就可以访问https的链接了。我这里的链接是

https://localhost:8443/upload/index.html

虽然仍然有不安全的图标。


image.png

随便选择一个英文命名的txt文件上传,注意选小一点的文件。


image.png
image.png

上传成功后,D盘目录下就有了这个文件了。


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Linux习惯问题: 在vim编辑时,按了ctrl + s后,再按ctrl + q就可以继续执行了。ctrl + ...
    光着脚的鞋阅读 4,561评论 0 16
  • 转自陈明乾的博客,可能有一定更新。 转原文声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ...
    LUNJINGJIE阅读 4,017评论 1 33
  • Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己...
    xmwyong阅读 10,180评论 0 12
  • 1、JavaWeb概念Java web,是用java技术来解决相关web互联网领域的技术的总称。web包括:web...
    寒剑飘零阅读 2,605评论 0 12
  • 又是平淡的一天过去了,这几天生活过得太平平无奇,我都不知道写啥了,这两天写的还是那种想象中的森林世界。 平淡有好也...
    三金二木夕阅读 1,177评论 0 2