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

SSL通关之代码示例(四)

 
阅读更多

实际开发过程中,服务器端是不需要多加代码处理的,因为ssl验证过程是由服务器(tomcat、nginx等)完成的。

这段代码也是参考了网上的:

新建一个web项目,项目结构和需要引入的jar如下:

 

web.xml配置:

 

[html] view plaincopy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">  
  3.   <display-name>Secure Sockets Layer</display-name>  
  4.   <servlet>  
  5.     <servlet-name>SSLServlet</servlet-name>  
  6.     <servlet-class>com.sengle.cloud.servlet.SSLServlet</servlet-class>  
  7.   </servlet>  
  8.   <servlet-mapping>  
  9.     <servlet-name>SSLServlet</servlet-name>  
  10.     <url-pattern>/sslServlet</url-pattern>  
  11.   </servlet-mapping>  
  12.   <welcome-file-list>  
  13.     <welcome-file>index.jsp</welcome-file>  
  14.   </welcome-file-list>  
  15.     
  16.   <!-- SSL配置 -->  
  17.   <security-constraint>  
  18.     <web-resource-collection>  
  19.       <web-resource-name>SSL</web-resource-name>  
  20.       <url-pattern>/*</url-pattern>  
  21.     </web-resource-collection>  
  22.     <user-data-constraint>  
  23.       <description>SSL required</description>  
  24.       <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
  25.     </user-data-constraint>  
  26.   </security-constraint>  
  27. </web-app>  

 

 

服务器端,写了个servlet(注意配置到web.xml中),代码如下:

 

[java] view plaincopy
 
  1. import java.io.IOException;  
  2. import java.io.PrintWriter;  
  3. import java.security.cert.X509Certificate;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class SSLServlet extends HttpServlet {  
  11.   
  12.     private static final long serialVersionUID = 1601507150278487538L;  
  13.     private static final String ATTR_CER = "javax.servlet.request.X509Certificate";  
  14.     private static final String CONTENT_TYPE = "text/plain;charset=UTF-8";  
  15.     private static final String DEFAULT_ENCODING = "UTF-8";  
  16.     private static final String SCHEME_HTTPS = "https";  
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         response.setContentType(CONTENT_TYPE);  
  21.         response.setCharacterEncoding(DEFAULT_ENCODING);  
  22.         PrintWriter out = response.getWriter();  
  23.         X509Certificate[] certs = (X509Certificate[]) request.getAttribute(ATTR_CER);  
  24.         if (certs != null) {  
  25.             int count = certs.length;  
  26.             out.println("共检测到[" + count + "]个客户端证书");  
  27.             for (int i = 0; i < count; i++) {  
  28.                 out.println("客户端证书 [" + (++i) + "]: ");  
  29.                 out.println("校验结果:" + verifyCertificate(certs[--i]));  
  30.                 out.println("证书详细:\r" + certs[i].toString());  
  31.             }  
  32.         } else {  
  33.             if (SCHEME_HTTPS.equalsIgnoreCase(request.getScheme())) {  
  34.                 out.println("这是一个HTTPS请求,但是没有可用的客户端证书");  
  35.                 request.setAttribute("user""username");  
  36.                 out.println(request.getAttribute("user"));  
  37.             } else {  
  38.                 out.println("这不是一个HTTPS请求,因此无法获得客户端证书列表 ");  
  39.                   
  40.             }  
  41.         }  
  42.         out.close();  
  43.     }  
  44.   
  45.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  46.             throws ServletException, IOException {  
  47.         doGet(request, response);  
  48.     }  
  49.       
  50.     /** 
  51.      * <p> 
  52.      * 校验证书是否过期 
  53.      * </p> 
  54.      *  
  55.      * @param certificate 
  56.      * @return 
  57.      */  
  58.     private boolean verifyCertificate(X509Certificate certificate) {  
  59.         boolean valid = true;  
  60.         try {  
  61.             certificate.checkValidity();  
  62.         } catch (Exception e) {  
  63.             e.printStackTrace();  
  64.             valid = false;  
  65.         }  
  66.         return valid;  
  67.     }  

 

 

客户端代码:

 

[java] view plaincopy
 
  1. /** 
  2.  * Copyright (C) 2011-2014 sgcc Inc.  
  3.  * All right reserved.  
  4.  * modify info: 
  5.  */  
  6. package com.sengle.cloud.client;  
  7.   
  8. import java.io.BufferedReader;  
  9. import java.io.File;  
  10. import java.io.FileInputStream;  
  11. import java.io.InputStream;  
  12. import java.io.InputStreamReader;  
  13. import java.security.KeyStore;  
  14.   
  15. import org.apache.http.HttpEntity;  
  16. import org.apache.http.HttpResponse;  
  17. import org.apache.http.client.HttpClient;  
  18. import org.apache.http.client.methods.HttpGet;  
  19. import org.apache.http.conn.scheme.Scheme;  
  20. import org.apache.http.conn.ssl.SSLSocketFactory;  
  21. import org.apache.http.impl.client.DefaultHttpClient;  
  22. import org.apache.http.util.EntityUtils;  
  23.   
  24.   
  25. public class HttpsClient {  
  26.     private static final String KEY_STORE_TYPE_TRUST = "jks"//如果证书为bks格式,那么要改为bks,同时下面的KEY_STORE_TYPE_CLIENT也要改为bks  
  27. //    private static final String KEY_STORE_TYPE_CLIENT = "PKCS12"; //如果KEY_STORE_TYPE_TRUST为jks,则KEY_STORE_TYPE_CLIENT为PKCS12  
  28.     private static final String KEY_STORE_TYPE_CLIENT = "PKCS12"//如果KEY_STORE_TYPE_TRUST为bks,则此处也应该为bks。  
  29.     private static final String SCHEME_HTTPS = "https";  
  30.     private static final int HTTPS_PORT = 8443//此处为tomcat中的配置,默认为8443  
  31.     private static final String HTTPS_URL = "https://10.100.100.24:8443/SSL/sslServlet";  
  32.       
  33.     private static final String basePath = "D:/SSL/";  
  34.     private static final String KEY_STORE_CLIENT_PATH = basePath + "/client-24.p12"//如果为bks,那么此处应该为bks格式的证书  
  35.     private static final String KEY_STORE_TRUST_PATH = basePath + "/client-24.truststore"//如果为bks,那么此处应该为bks格式的证书  
  36.     private static final String KEY_STORE_PASSWORD = "123456"//密码  
  37.     private static final String KEY_STORE_TRUST_PASSWORD = "123456";  // 密码  
  38.   
  39.     public static void main(String[] args) throws Exception {  
  40.         ssl();  
  41.     }  
  42.       
  43.     private static void ssl() throws Exception {  
  44.         HttpClient httpClient = new DefaultHttpClient();  
  45.         try {  
  46.             KeyStore keyStore  = KeyStore.getInstance(KEY_STORE_TYPE_CLIENT);  
  47.             KeyStore trustStore  = KeyStore.getInstance(KEY_STORE_TYPE_TRUST);  
  48.             InputStream ksIn = new FileInputStream(KEY_STORE_CLIENT_PATH);  
  49.             InputStream tsIn = new FileInputStream(new File(KEY_STORE_TRUST_PATH));  
  50.             try {  
  51.                 keyStore.load(ksIn, KEY_STORE_PASSWORD.toCharArray());  
  52.                 trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.toCharArray());  
  53.             } finally {  
  54.                 try { ksIn.close(); } catch (Exception ignore) {}  
  55.                 try { tsIn.close(); } catch (Exception ignore) {}  
  56.             }  
  57.             //双向验证加载keystore和truststore两个证书  
  58.             SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, KEY_STORE_PASSWORD, trustStore);  
  59.            
  60.             /* 
  61.              * 单向验证,只加载truststore 
  62.             SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore); 
  63.             */  
  64.               
  65.             Scheme sch = new Scheme(SCHEME_HTTPS, HTTPS_PORT, socketFactory);  
  66.             httpClient.getConnectionManager().getSchemeRegistry().register(sch);  
  67.             HttpGet httpget = new HttpGet(HTTPS_URL);  
  68.             System.out.println("executing request" + httpget.getRequestLine());  
  69.             HttpResponse response = httpClient.execute(httpget);  
  70.             HttpEntity entity = response.getEntity();  
  71.             System.out.println("----------------------------------------");  
  72.             System.out.println(response.getStatusLine());  
  73.             if (entity != null) {  
  74.                 System.out.println("Response content length: " + entity.getContentLength());  
  75.                 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));  
  76.                 String text;  
  77.                 while ((text = bufferedReader.readLine()) != null) {  
  78.                     System.out.println(text);  
  79.                 }  
  80.                 bufferedReader.close();  
  81.             }  
  82.             EntityUtils.consume(entity);  
  83.         } finally {  
  84.             httpClient.getConnectionManager().shutdown();  
  85.         }  
  86.     }  
  87. }  
分享到:
评论
2 楼 thinkerAndThinker 2015-10-14  
publicclass CustomerHttpClient {
    private static final String CHARSET = HTTP.UTF_8;
    privatestatic HttpClient customerHttpClient;

    private CustomerHttpClient() {
    }

    public static synchronized HttpClient getHttpClient() {
        if (null== customerHttpClient) {
            HttpParams params =new BasicHttpParams();
            // 设置一些基本参数
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params,
                    CHARSET);
            HttpProtocolParams.setUseExpectContinue(params, true);
            HttpProtocolParams
                    .setUserAgent(
                            params,
                            "Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
                                    +"AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
            // 超时设置
/* 从连接池中取连接的超时时间 */
            ConnManagerParams.setTimeout(params, 1000);
            /* 连接超时 */
            HttpConnectionParams.setConnectionTimeout(params, 2000);
            /* 请求超时 */
            HttpConnectionParams.setSoTimeout(params, 4000);
           
            // 设置我们的HttpClient支持HTTP和HTTPS两种模式
            SchemeRegistry schReg =new SchemeRegistry();
            schReg.register(new Scheme("http", PlainSocketFactory
                    .getSocketFactory(), 80));
            schReg.register(new Scheme("https", SSLSocketFactory
                    .getSocketFactory(), 443));

            // 使用线程安全的连接管理来创建HttpClient
            ClientConnectionManager conMgr =new ThreadSafeClientConnManager(
                    params, schReg);
            customerHttpClient =new DefaultHttpClient(conMgr, params);
        }
        return customerHttpClient;
    }
}

不好意思,刚看到,用这个类;
可参考地址:http://www.cnblogs.com/codingmyworld/archive/2011/08/17/2141706.html
1 楼 huliang216 2015-05-26  
我想获取单例的HttpClient该怎么写?
我再代码里面加if==null判断,但是在用的时候第二次发请求就报错  Caused by: java.lang.IllegalStateException: Connection already open

我再执行交易之后调用:open.httpClient.getConnectionManager().shutdown();第二次执行交易也是报错 Connection pool shut down.
要怎么怎么处理获取单例?

相关推荐

    ssl经典范例,代码都有详细注释

    本教程将通过一个包含详细注释的代码示例,帮助你理解和应用SSL/TLS。 在SSL/TLS中,主要有两个角色:服务器端和客户端。服务器端通常是Web服务器,而客户端则是浏览器或其他应用程序。在建立连接时,这两个端点会...

    netty实现SSL/TSL双向加密认证示例

    通过对这些代码的分析和学习,可以更好地理解 Netty 中的 SSL/TLS 双向认证工作原理。 总结,Netty 提供了强大而灵活的工具来实现 SSL/TLS 安全通信,包括双向认证。通过正确配置 `SslContext`、处理通道处理器和...

    mina客户端简单代码示例

    标题中的"mina客户端简单代码示例"意味着我们将探讨如何使用Mina框架编写一个基础的客户端程序,该程序能够连接到服务器并发送数据。描述指出,运行这个客户端程序(minaTestClient)会展示一个窗口,用户可以通过...

    SSL高级编程程序源代码

    本资源包含的是SSL高级编程的源代码,这对于理解SSL的工作原理、进行自定义实现或优化现有系统非常有价值。 首先,SSL主要由以下组件构成: 1. **握手协议**:建立安全连接的流程,包括客户端和服务器的身份验证、...

    自己写的ssl测试代码

    在您提供的"自己写的ssl测试代码"中,我们可以推测这是一个用于验证或调试SSL连接的程序。编写这样的代码可以帮助理解SSL的工作原理,检查SSL证书的有效性,以及确保服务器与客户端之间的通信符合安全标准。 SSL...

    Nginx单IP地址配置多个SSL证书的方法示例

    每个`server`块包括监听的端口(通常是443),`server_name`指定要匹配的域名,以及`ssl_certificate`和`ssl_certificate_key`分别指向SSL证书和私钥的路径。例如: ```nginx server { listen 443 ssl; server_...

    苏州申龙电梯主板故障代码SSL-6000.pdf

    苏州申龙电梯主板故障代码SSL-6000.pdf

    j2se中ssl联网编程代码

    "se程序" 文件可能包含了实现上述步骤的 Java 代码示例。通过读取这个程序,可以进一步了解 SSLSocket 联网编程的细节,包括如何创建 SSLContext、配置 KeyManager 和 TrustManager,以及如何使用 SSLSocketFactory ...

    Android调用大宝CA国密SSL密码套件(0.99版本)访问国密SSL安全服务的示例代码

    使用方法见:https://blog.csdn.net/upset_ming/article/details/89048916 1. 支持国密SSL单向认证和双向认证 2. 获取服务端的国密数字证书 3. 适用于Android 7.0(API 24)及以上

    Java中SSLSocket应用教程和代码

    6. **SSLSocket的代码示例** ```java import javax.net.ssl.*; // 初始化SSLContext SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, null, null); // 获取SSLSocketFactory...

    linux下用C写的基于SSL 的TCP例子代码!

    通过阅读OpenSSL的文档和示例代码,你可以深入理解这些高级特性并将其应用于你的项目中。 在提供的压缩包文件中,"C-S"可能是包含源代码的文件,你可以在解压后查看具体实现。这些代码将为你提供更直观的理解,帮助...

    ssl客户端和服务端代码vc6

    本压缩包文件包含了一个名为"ssl_test"的示例项目,用于帮助开发者理解和实践SSL的使用。 SSL协议主要分为两个部分:客户端和服务器端。客户端通常是指浏览器或其他发起连接的应用,而服务器端则是提供服务的应用,...

    httpClient实例httpClient调用 http/https实例 忽略SSL验证

    这个实例中的"test"文件可能是用来测试上述代码的。在实际应用中,你需要根据你的需求替换URL,并确保在生产环境中恢复SSL验证,以保证安全。 总结来说,HttpClient提供了一个强大而灵活的接口来处理HTTP请求,而...

    SSL server client JAVA实现代码

    以下是一段简单的SSLServer示例代码: ```java import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; public class SSLServer { public static void main(String[] args) throws...

    JAVA实现的SSL/TLS双向认证源代码

    2. **配置SSL/TLS上下文**:在Java代码中,我们需要创建`SSLContext`实例,加载服务器和客户端的证书。这通常包括设置信任管理器和密钥管理器。 3. **服务器端实现**:在`TeslaSSLServer`类中,你需要设置...

    Android调用大宝CA国密SSL密码套件(0.99版本)访问HTTPS(国密SSL安全通道)的示例代码

    使用方法见:... 1. Android使用HTTPCLIENT访问国密SSL协议的HTTPS服务 2. 示例代码为单向认证,可支持双向认证 3. 获取服务端的国密数字证书 4. 适用于Android 7.0(API 24)及以上

    nginx 配置ssl 示例

    以下是一个基本的配置示例: ```nginx server { listen 443 ssl; server_name yourdomain.com; # SSL证书路径 ssl_certificate /path/to/your/certificate.crt; # 私钥路径 ssl_certificate_key /path/to/...

    boost.asio.ssl示例的证书

    以下是一个简单的示例代码: ```cpp #include #include &lt;boost/asio/ssl.hpp&gt; int main() { boost::asio::io_service io_service; boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv12_server); ...

Global site tag (gtag.js) - Google Analytics