实际开发过程中,服务器端是不需要多加代码处理的,因为ssl验证过程是由服务器(tomcat、nginx等)完成的。
这段代码也是参考了网上的:
新建一个web项目,项目结构和需要引入的jar如下:
web.xml配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <display-name>Secure Sockets Layer</display-name>
- <servlet>
- <servlet-name>SSLServlet</servlet-name>
- <servlet-class>com.sengle.cloud.servlet.SSLServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>SSLServlet</servlet-name>
- <url-pattern>/sslServlet</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <!-- SSL配置 -->
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>SSL</web-resource-name>
- <url-pattern>/*</url-pattern>
- </web-resource-collection>
- <user-data-constraint>
- <description>SSL required</description>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
- </security-constraint>
- </web-app>
服务器端,写了个servlet(注意配置到web.xml中),代码如下:
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.security.cert.X509Certificate;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class SSLServlet extends HttpServlet {
- private static final long serialVersionUID = 1601507150278487538L;
- private static final String ATTR_CER = "javax.servlet.request.X509Certificate";
- private static final String CONTENT_TYPE = "text/plain;charset=UTF-8";
- private static final String DEFAULT_ENCODING = "UTF-8";
- private static final String SCHEME_HTTPS = "https";
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType(CONTENT_TYPE);
- response.setCharacterEncoding(DEFAULT_ENCODING);
- PrintWriter out = response.getWriter();
- X509Certificate[] certs = (X509Certificate[]) request.getAttribute(ATTR_CER);
- if (certs != null) {
- int count = certs.length;
- out.println("共检测到[" + count + "]个客户端证书");
- for (int i = 0; i < count; i++) {
- out.println("客户端证书 [" + (++i) + "]: ");
- out.println("校验结果:" + verifyCertificate(certs[--i]));
- out.println("证书详细:\r" + certs[i].toString());
- }
- } else {
- if (SCHEME_HTTPS.equalsIgnoreCase(request.getScheme())) {
- out.println("这是一个HTTPS请求,但是没有可用的客户端证书");
- request.setAttribute("user", "username");
- out.println(request.getAttribute("user"));
- } else {
- out.println("这不是一个HTTPS请求,因此无法获得客户端证书列表 ");
- }
- }
- out.close();
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- /**
- * <p>
- * 校验证书是否过期
- * </p>
- *
- * @param certificate
- * @return
- */
- private boolean verifyCertificate(X509Certificate certificate) {
- boolean valid = true;
- try {
- certificate.checkValidity();
- } catch (Exception e) {
- e.printStackTrace();
- valid = false;
- }
- return valid;
- }
客户端代码:
- /**
- * Copyright (C) 2011-2014 sgcc Inc.
- * All right reserved.
- * modify info:
- */
- package com.sengle.cloud.client;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.security.KeyStore;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.conn.scheme.Scheme;
- import org.apache.http.conn.ssl.SSLSocketFactory;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.util.EntityUtils;
- public class HttpsClient {
- private static final String KEY_STORE_TYPE_TRUST = "jks"; //如果证书为bks格式,那么要改为bks,同时下面的KEY_STORE_TYPE_CLIENT也要改为bks
- // private static final String KEY_STORE_TYPE_CLIENT = "PKCS12"; //如果KEY_STORE_TYPE_TRUST为jks,则KEY_STORE_TYPE_CLIENT为PKCS12
- private static final String KEY_STORE_TYPE_CLIENT = "PKCS12"; //如果KEY_STORE_TYPE_TRUST为bks,则此处也应该为bks。
- private static final String SCHEME_HTTPS = "https";
- private static final int HTTPS_PORT = 8443; //此处为tomcat中的配置,默认为8443
- private static final String HTTPS_URL = "https://10.100.100.24:8443/SSL/sslServlet";
- private static final String basePath = "D:/SSL/";
- private static final String KEY_STORE_CLIENT_PATH = basePath + "/client-24.p12"; //如果为bks,那么此处应该为bks格式的证书
- private static final String KEY_STORE_TRUST_PATH = basePath + "/client-24.truststore"; //如果为bks,那么此处应该为bks格式的证书
- private static final String KEY_STORE_PASSWORD = "123456"; //密码
- private static final String KEY_STORE_TRUST_PASSWORD = "123456"; // 密码
- public static void main(String[] args) throws Exception {
- ssl();
- }
- private static void ssl() throws Exception {
- HttpClient httpClient = new DefaultHttpClient();
- try {
- KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE_CLIENT);
- KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_TRUST);
- InputStream ksIn = new FileInputStream(KEY_STORE_CLIENT_PATH);
- InputStream tsIn = new FileInputStream(new File(KEY_STORE_TRUST_PATH));
- try {
- keyStore.load(ksIn, KEY_STORE_PASSWORD.toCharArray());
- trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.toCharArray());
- } finally {
- try { ksIn.close(); } catch (Exception ignore) {}
- try { tsIn.close(); } catch (Exception ignore) {}
- }
- //双向验证加载keystore和truststore两个证书
- SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, KEY_STORE_PASSWORD, trustStore);
- /*
- * 单向验证,只加载truststore
- SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
- */
- Scheme sch = new Scheme(SCHEME_HTTPS, HTTPS_PORT, socketFactory);
- httpClient.getConnectionManager().getSchemeRegistry().register(sch);
- HttpGet httpget = new HttpGet(HTTPS_URL);
- System.out.println("executing request" + httpget.getRequestLine());
- HttpResponse response = httpClient.execute(httpget);
- HttpEntity entity = response.getEntity();
- System.out.println("----------------------------------------");
- System.out.println(response.getStatusLine());
- if (entity != null) {
- System.out.println("Response content length: " + entity.getContentLength());
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
- String text;
- while ((text = bufferedReader.readLine()) != null) {
- System.out.println(text);
- }
- bufferedReader.close();
- }
- EntityUtils.consume(entity);
- } finally {
- httpClient.getConnectionManager().shutdown();
- }
- }
- }
相关推荐
本教程将通过一个包含详细注释的代码示例,帮助你理解和应用SSL/TLS。 在SSL/TLS中,主要有两个角色:服务器端和客户端。服务器端通常是Web服务器,而客户端则是浏览器或其他应用程序。在建立连接时,这两个端点会...
通过对这些代码的分析和学习,可以更好地理解 Netty 中的 SSL/TLS 双向认证工作原理。 总结,Netty 提供了强大而灵活的工具来实现 SSL/TLS 安全通信,包括双向认证。通过正确配置 `SslContext`、处理通道处理器和...
标题中的"mina客户端简单代码示例"意味着我们将探讨如何使用Mina框架编写一个基础的客户端程序,该程序能够连接到服务器并发送数据。描述指出,运行这个客户端程序(minaTestClient)会展示一个窗口,用户可以通过...
本资源包含的是SSL高级编程的源代码,这对于理解SSL的工作原理、进行自定义实现或优化现有系统非常有价值。 首先,SSL主要由以下组件构成: 1. **握手协议**:建立安全连接的流程,包括客户端和服务器的身份验证、...
在您提供的"自己写的ssl测试代码"中,我们可以推测这是一个用于验证或调试SSL连接的程序。编写这样的代码可以帮助理解SSL的工作原理,检查SSL证书的有效性,以及确保服务器与客户端之间的通信符合安全标准。 SSL...
每个`server`块包括监听的端口(通常是443),`server_name`指定要匹配的域名,以及`ssl_certificate`和`ssl_certificate_key`分别指向SSL证书和私钥的路径。例如: ```nginx server { listen 443 ssl; server_...
苏州申龙电梯主板故障代码SSL-6000.pdf
"se程序" 文件可能包含了实现上述步骤的 Java 代码示例。通过读取这个程序,可以进一步了解 SSLSocket 联网编程的细节,包括如何创建 SSLContext、配置 KeyManager 和 TrustManager,以及如何使用 SSLSocketFactory ...
使用方法见:https://blog.csdn.net/upset_ming/article/details/89048916 1. 支持国密SSL单向认证和双向认证 2. 获取服务端的国密数字证书 3. 适用于Android 7.0(API 24)及以上
6. **SSLSocket的代码示例** ```java import javax.net.ssl.*; // 初始化SSLContext SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, null, null); // 获取SSLSocketFactory...
通过阅读OpenSSL的文档和示例代码,你可以深入理解这些高级特性并将其应用于你的项目中。 在提供的压缩包文件中,"C-S"可能是包含源代码的文件,你可以在解压后查看具体实现。这些代码将为你提供更直观的理解,帮助...
本压缩包文件包含了一个名为"ssl_test"的示例项目,用于帮助开发者理解和实践SSL的使用。 SSL协议主要分为两个部分:客户端和服务器端。客户端通常是指浏览器或其他发起连接的应用,而服务器端则是提供服务的应用,...
这个实例中的"test"文件可能是用来测试上述代码的。在实际应用中,你需要根据你的需求替换URL,并确保在生产环境中恢复SSL验证,以保证安全。 总结来说,HttpClient提供了一个强大而灵活的接口来处理HTTP请求,而...
以下是一段简单的SSLServer示例代码: ```java import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; public class SSLServer { public static void main(String[] args) throws...
2. **配置SSL/TLS上下文**:在Java代码中,我们需要创建`SSLContext`实例,加载服务器和客户端的证书。这通常包括设置信任管理器和密钥管理器。 3. **服务器端实现**:在`TeslaSSLServer`类中,你需要设置...
使用方法见:... 1. Android使用HTTPCLIENT访问国密SSL协议的HTTPS服务 2. 示例代码为单向认证,可支持双向认证 3. 获取服务端的国密数字证书 4. 适用于Android 7.0(API 24)及以上
以下是一个基本的配置示例: ```nginx server { listen 443 ssl; server_name yourdomain.com; # SSL证书路径 ssl_certificate /path/to/your/certificate.crt; # 私钥路径 ssl_certificate_key /path/to/...
以下是一个简单的示例代码: ```cpp #include #include <boost/asio/ssl.hpp> int main() { boost::asio::io_service io_service; boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv12_server); ...