`
hiphunter921
  • 浏览: 68529 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tomcat使用SSL,AJAX代理中加入的SSL

    博客分类:
  • Java
阅读更多

今天公司要求把Web版客户端全部加上https,这里记录一下实现过程:

 

1.添加KeyPair:

在命令行模式下切换到目录%TOMCAT_HOME%,使用jdk的keytool工具,

keytool -genkey -alias tomcat -keyalg RSA -keypass password -storepass password -keystore name.keystore -validity 3600

其中-validity 3600是过期时间,单位是天,默认是90天

 

2.将证书导入的JDK的证书信任库中:

keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass password
keytool -import -trustcacerts -alias tomcat -file server.cer -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass password

这里注意tomcat使用的是哪个jre

如果本来目录中的cacerts存在,会报个错,把原来的cacerts备份一下,换个名字就可以了

 

3.配置tomcat https端口:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
        maxThreads="150" scheme="https"
        secure="true" clientAuth="false" keystoreFile="d:\elitecrm.cer"
        keystorePass="letmein" sslProtocol="TLS" />

4.如果有需要,可以再配置压缩
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
        maxThreads="150" scheme="https"
        secure="true" clientAuth="false" keystoreFile="d:\elite.keystore"
        keystorePass="letmein" sslProtocol="TLS" compression="on"
        compressionMinSize="2048"
        noCompressionUserAgents="gozilla, traviata"
        compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>

compression设为on打开压缩
compressionMinSize为启用压缩的阀值,设置这个值要综合考虑压缩的代价和网络传输代价的平衡值。
noCompressionUserAgents设置对于何种类型的浏览器不启用压缩
compressableMimeType设置对于哪些数据类型启用压缩,对于我们的客户端,text/html和text/xml要启用。

 

这样就可以用https协议8443端口访问之前的url,但是如果要用java.net.URL类来访问https的内容,还需要修改部分代码:

下面是一个用java.net.URL类来做ajax跨域代理的工具类,其中使用了模拟的post请求,并且配置了HttpsCertificates

其中配置SSL的信任证书这块是网上找到的,具体的作用还不是完全明白,不过这样以前的应用就又能正常使用了。

 

package com.elite.servlet;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class CrossDomainProxyServlet extends HttpServlet{

	@Override
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		postService(request,response);
	}
	
	public void postService(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		String url = null; 
		PrintWriter out=response.getWriter();   
		   Map<String, String> req_map = new HashMap<String, String>();  
		   Enumeration<?> _enum = request.getParameterNames();  
		   while (_enum.hasMoreElements()) {  
		       String paramName = (String) _enum.nextElement();  
		       String paramValue = request.getParameter(paramName);  
		       req_map.put(paramName, paramValue);  
		   }  
		   if (!req_map.isEmpty()) {
		       url = req_map.remove("url");
		       System.out.println("url:"+url);
		   }
		   StringBuffer url_sbf = new StringBuffer();
		   String postData="";
		   if ((url != null) && (url.length() > 0)) { 
		       if (!req_map.isEmpty()) {  
		           for (Map.Entry<String, String> entry : req_map.entrySet()) {//generate parameters  
		               String _par_key = entry.getKey();  
		               String _par_value = entry.getValue();
		               System.out.println(_par_key+":"+_par_value);
		               _parvalue=URLEncoder.encode(_par_value,"utf-8");
		               if (_par_key != null && _par_key != "") {  
		                   if (url_sbf.indexOf("?") == -1)  
		                       url_sbf.append("?");  
		                   else  
		                       url_sbf.append("&");  
		                   url_sbf.append(_par_key).append("=").append(_par_value);  
		               }  
		           }
		           if(url_sbf.toString().startsWith("?"))
		        	   postData=url_sbf.substring(1);
		       }
		       
		       try {
		    	   trustAllHttpsCertificates();
				} catch (Exception e) {
					e.printStackTrace();
				}
	           HttpsURLConnection.setDefaultHostnameVerifier(hv);
	           
		       java.net.URL _url = new java.net.URL(url);  
		       HttpURLConnection  urlcon =(HttpURLConnection) _url.openConnection();  
		       urlcon.setRequestMethod("POST");
		       urlcon.setRequestProperty("Proxy-Connection", "Keep-Alive");
		       urlcon.setDoOutput(true);
		       OutputStream os = urlcon.getOutputStream();
		       DataOutputStream dos=new DataOutputStream(os);
		       dos.write(postData.getBytes());
		       dos.flush();
		       dos.close();
		       
		       java.io.InputStream is = urlcon.getInputStream();  
		       java.io.BufferedReader buffer = new java.io.BufferedReader(  
		               new java.io.InputStreamReader(is));  
		       StringBuffer bs = new StringBuffer();  
		       String lineStr = null;  
		       while ((lineStr = buffer.readLine()) != null) {  
		           //String stri = java.net.URLDecoder.decode(lineStr, "UTF-8");  
		           bs.append(lineStr).append("\n");  
		       }  
		       if (bs.toString().indexOf("<?xml version=") != -1) {//if XML file, for AJAX  
		           response.setContentType("text/xml; charset=UTF-8");  
		           response.setHeader("Cache-Control", "no-cache");  
		           out.println(bs.toString());  
		       } else  
		           out.println(bs.toString());  
		   }	
	}

    private static void trustAllHttpsCertificates() throws Exception {
        javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
        javax.net.ssl.TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        javax.net.ssl.SSLContext sc =  javax.net.ssl.SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    }
    public static class miTM implements javax.net.ssl.TrustManager,
	    javax.net.ssl.X509TrustManager {
		public java.security.cert.X509Certificate[] getAcceptedIssuers() {
		    return null;
		}
		public boolean isServerTrusted(
		        java.security.cert.X509Certificate[] certs) {
		    return true;
		}
		public boolean isClientTrusted(
		        java.security.cert.X509Certificate[] certs) {
		    return true;
		}
		public void checkServerTrusted(
		        java.security.cert.X509Certificate[] certs, String authType) throws
		        java.security.cert.CertificateException {
		    return;
		}
		public void checkClientTrusted(
		        java.security.cert.X509Certificate[] certs, String authType) throws
		        java.security.cert.CertificateException {
		    return;
		}
	}
}

 

 

分享到:
评论

相关推荐

    ActiveMQ 使用Ajax 收发消息实战

    标题中的"ActiveMQ 使用Ajax 收发消息实战"指出我们将探讨如何使用ActiveMQ消息中间件与Ajax技术结合,实现Web应用程序中的异步消息传递。ActiveMQ是Apache软件基金会的一个项目,提供了一个开源的消息代理,支持...

    Apache与Tomcat整合教程(服务器负载均衡)

    Mod_proxy提供了HTTP、HTTPS、AJAX等多种代理模式,并且支持AJP(Apache JServ Protocol)协议,直接与Tomcat进行通信。 **服务器负载均衡** 负载均衡是提高系统可用性和可扩展性的关键技术。在Apache与Tomcat整合...

    tomcat connectors

    在Tomcat服务器中,主要有两种连接器: Coyote(用于处理HTTP/1.1)和Apr(Apache Portable Runtime,适用于更高效地处理SSL和I/O操作)。它们负责在客户端浏览器和Tomcat之间建立网络连接,解析HTTP请求,并将请求...

    排班工具(纯前端实现,使用Tomcat,Nginx直接跑就行)

    【排班工具】是一款基于纯前端技术实现的应用,它的特点是无需复杂的后端支持,仅需通过Tomcat服务器和Nginx反向代理即可运行。这款工具专注于解决日常的排班管理问题,尤其适用于需要灵活调整工作时间表的组织或...

    Tomcat-7.0.42

    Apache Tomcat 7.0.42 是一个广泛使用的开源软件,它是一个符合Java Servlet和JavaServer Pages(JSP)规范的应用服务器,主要用于部署和运行Java Web应用程序。Tomcat是Apache软件基金会Jakarta项目的一部分,它以...

    tomcat7.0包

    5. **安全增强**:Tomcat 7.0加强了安全性,支持最新的SSL/TLS协议,可以设置更复杂的安全策略来保护Web应用程序。 6. **热部署**:开发者可以在不中断服务的情况下更新和部署Web应用程序,提高了开发效率。 7. **...

    apache-tomcat-7.0.27-windows-x64

    Apache Tomcat 7.0.27 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的容器。它遵循Apache Software Foundation的Apache 2.0许可证,为开发者提供了免费且灵活的Web应用程序部署平台。...

    用AJAX+J2EE实现一个网上会议室系统

    下面将详细介绍AJAX和J2EE在构建网上会议室系统中的应用。 **AJAX** 是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。在我们的网上会议室系统中,AJAX主要负责以下几个关键功能: 1. **实时通信**:...

    tomcat1111.rar

    3. **Tomcat 安全管理**:Tomcat 支持多种安全机制,包括SSL/TLS加密、用户认证、角色授权等。通过修改 `conf/server.xml` 中的相关元素可以实现这些功能。 4. **JavaScript 1K 挑战**:在有限的代码空间内编写程序...

    java+jsp+Tomcat网上书城

    在这个项目中,Tomcat作为服务器运行Java Web应用程序,接收客户端请求,调用后端Java代码处理业务逻辑,并将结果返回给客户端。 4. **在线购物功能**: 网上书城系统应该具备在线浏览图书、搜索书籍、添加到购物车...

    Tomcat配置方法

    在IT行业中,Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java EE的Web部分,包括Servlet和JSP规范。对于初学者来说,掌握Tomcat的配置方法是学习Java Web开发的基础。下面将详细介绍Tomcat的配置步骤以及...

    apache-tomcat-8.0.33-windows-x64.zip

    Apache Tomcat 8.0 是一个广泛使用的开源Java Servlet容器,尤其在开发和部署Web应用程序时。这个版本,8.0.33,是Tomcat 8的一个稳定更新,提供了对Java EE 7规范的支持。它由Apache软件基金会维护,是Java社区的...

    tomcat启动脚本

    而“工具”可能指的是使用某些辅助工具来管理和监控Tomcat的启动状态。 压缩包中的`test.vbs`和`t.vbs`文件可能是用于Windows系统的VBScript脚本,它们可能被用来自动化Tomcat的启动、停止或监控。VBScript可以调用...

    使用CAS整合CXF实现单点登录部署步骤

    4. **配置Tomcat**:将CAS服务器的war文件放入Tomcat的webapps目录下,并配置Tomcat的`server.xml`,设置SSL监听端口,导入CAS服务端证书。 5. **启动CAS服务器**:启动Tomcat,确认CAS服务器正常运行。 接下来,...

    Jetty中文手册

    如何开启或禁止Jetty中的SSL功能 如何在Jetty中安全存储密码 如何安全终止Jetty 如何配置Spnego Application Server Integrations(集成) Apache Geronimo JEE 配置Apache httpd和Jetty教程 配置Apache mod_proxy和...

    使用JSONP完成HTTP和HTTPS之间的跨域访问

    - 由于JSONP的本质是执行来自外部源的JavaScript代码,因此在生产环境中使用时应格外小心。 #### 结论 通过上述步骤,我们可以有效地解决HTTP与HTTPS之间的跨域问题。虽然JSONP是一种相对简单的方法,但在实际应用...

    Web程序设计25 Web程序设计25 Web程序设计25 Web程序设计25

    AJAX(异步JavaScript和XML)技术使得网页可以在不刷新整个页面的情况下更新部分内容,提高了用户体验。 Web应用程序通常基于客户端-服务器架构,其中服务器端负责处理业务逻辑和数据存储,而客户端则展示用户界面...

    Spring Security3技术手册

    - Spring Security支持在`spring-security.xml`配置文件中使用特定的命名空间简化配置过程。 - **示例代码**: 使用`&lt;http auto-config="true"&gt;`简化HTTP安全配置。 - **1.3 完善整个项目** - 包括设置依赖、创建...

    ActiveMQ应用与实例1

    ActiveMQ是Apache软件基金会开发的一款开源消息代理,它实现了Java消息服务(JMS)1.1和J2EE 1.4规范,为各种应用程序提供可靠的消息传递功能。ActiveMQ的特点在于其广泛的语言和协议支持,包括Java、C、C++、C#、...

    Linux+Java+JS Web开发快速入门.doc

    例如,通过Ajax实现页面异步更新,或者使用框架如jQuery、AngularJS、React等来简化前端开发。 为了进一步学习Web开发,你需要理解以下关键概念: - HTML(HyperText Markup Language):用于构建网页结构的基本...

Global site tag (gtag.js) - Google Analytics