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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

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