`
lippeng
  • 浏览: 454844 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在SSL握手之前,拿到服务端的证书

    博客分类:
  • Life
阅读更多

在SSL握手时,客户端需要知道服务端的证书,如果证书必须先存在客户端的KeyStore中,那挺麻烦的!

 

在SSL握手过程中,服务端的确会把证书发给客户端,客户端肯定能拿到!

开始一直想着,一次握手,即拿到证书,又用这个证书来握手,建立连接,后来发现几乎不可行!

 

决定第一次握手时,先把证书拿到,再进行第二次SSL正式握手!用WireShark来看,Chrome访问HTTPS的站点也是这样做的!

 

不废话,直接上可用的代码:

 

import org.apache.http.conn.ssl.SSLContexts;

import javax.net.ssl.*;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * God Bless You!
 * Author: Li Pengpeng
 * Date: 2014-11-05
 */
public class CertUtil {
    /**
     * 目的是加载 HTTPS服务器提供的证书(含公钥)
     * @param keyStore keyStore
     * @param host host
     * @param port port
     * @throws Exception
     */
    public static void checkTrustKey(KeyStore keyStore, String host, int port) throws Exception {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(keyStore);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);

        SSLContext context = SSLContexts.custom().useTLS().loadTrustMaterial(keyStore).build();
        context.init(null, new TrustManager[]{tm}, null);

        SSLSocketFactory factory = context.getSocketFactory();
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            socket.startHandshake();
            socket.close();
            // handshake success, need not set Cert
        } catch (SSLException e) {
            X509Certificate[] chain = tm.chain;
            if (chain == null || chain.length == 0) {
                throw e;
            }

            // handshake fail, set Cert
            for (X509Certificate cert : chain) {
                keyStore.setCertificateEntry(host + "_" + cert.getSerialNumber(), cert);
            }
        }
    }

    private static class SavingTrustManager implements X509TrustManager {
        private final X509TrustManager tm;
        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            throw new UnsupportedOperationException();
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}

 

分享到:
评论

相关推荐

    C# SSL服务端连接及安装数字证书

    C# SSL服务端连接及安装数字证书

    利用openssl和curl库获取https服务端证书

    在这个场景中,我们要探讨如何利用openssl和curl库来获取HTTPS服务端证书,这有助于我们验证服务器的身份和建立安全连接。 首先,openssl是一个强大的安全套接字层密码库,包含了各种主要的密码算法、常用的密钥和...

    ssl握手协议

    在 SSL 握手协议中,客户端和服务器之间进行了多次交互,以确保身份认证和加密通信的安全性。 SSL 握手协议的主要过程包括: 1. 客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的...

    ssl客户端和服务端代码vc6

    在VC6,即Microsoft Visual C++ 6.0环境下,我们可以利用SSL库来编写客户端和服务端的应用程序,以实现安全的数据传输。本压缩包文件包含了一个名为"ssl_test"的示例项目,用于帮助开发者理解和实践SSL的使用。 SSL...

    openssl实现ssl握手调试工具

    本教程将深入探讨如何使用开源工具OpenSSL来实现SSL握手调试,以及制作数字证书和进行加解密操作。 首先,OpenSSL是一个强大的安全套接层/传输层安全(TLS/SSL)库,包含了各种主要的密码算法、常用的密钥和证书封装...

    c-examples.tar.gz_c ssl_ssl_服务端

    服务端需要能够处理SSL握手过程,包括交换证书、协商加密套件和验证客户端的身份。 2. **SSL客户端实现**:客户端代码则负责发起SSL连接请求。它也需要初始化SSL上下文,但通常不需要提供证书。客户端会连接到...

    SSL证书在线生成系统源码

    SSL证书在线生成系统源码实现了从申请到管理SSL证书的全程自动化,简化了用户操作,增强了网络安全。通过对接SSL证书API,系统能够快速响应并处理证书请求,确保网站的数据传输安全,为用户提供高效便捷的SSL服务。...

    客户端与服务器SSL双向认证(客户端:java-服务端:java)

    - 在编程中,需要捕获可能的SSLException和其他相关异常,例如证书不受信任、证书过期等,并给出适当的错误提示。 通过上述步骤,我们可以实现Java客户端和服务器之间的SSL双向认证。在实际应用中,这可以确保数据...

    SSL握手过程实例分析

    SSL握手过程实例分析 SSL(Secure Sockets Layer)是一种...SSL握手过程是SSL协议中最重要的一部分,通过对SSL握手过程的深入分析,我们可以更好地理解SSL协议的工作机理,并且可以更好地应用SSL协议在实际项目中。

    本地ssl证书生成工具

    - 自签发证书:使用`openssl x509`命令,使用之前生成的私钥对证书请求进行签名,生成自签名的SSL证书。 - 安装证书:将生成的证书安装到本地的信任存储或服务器上。 4. 测试环境的应用: 在本地开发和测试环境...

    SSL双向认证握手过程 非常详细

    在SSL双向认证握手过程中,客户端首先向服务器发送一个ClientHello消息,该消息包含以下信息: * 客户端支持的SSL协议版本号(ProtocolVersion) * 客户端生成的随机数(Random) * 客户端支持的加密算法套件...

    boost下ssl的使用服务端

    在IT行业中,Boost库是一个广泛使用的C++库,它提供了许多功能强大的工具,包括...在实际项目中,根据需求可能还需要实现更复杂的逻辑,比如多线程处理、负载均衡、会话管理等,但基础的SSL服务端设置就是以上所述。

    SSL证书原理及格式1.21

    * 如果服务端证书可信,客户端使用服务端证书里的公钥加密密钥交换信息,并发送给服务端 * 服务端使用私钥解密密钥交换信息,并计算交换后的密钥 * 双方使用对称加密算法加密正式的数据 四、非对称加密算法RSA * ...

    Android SSL证书验证原理

    系统会将自身的证书和私钥存储在密钥仓库中,在进行SSL握手之前,将这些信息放入SSL_CTX变量中。握手完成后,系统从`SSLSession`中获取服务器的证书,并使用可信密钥仓库来验证该证书的可信性。此外,还需要确保将...

    SSL握手协议的研究

    SSL握手协议是安全套接字层(Secure Sockets Layer)的核心组成部分,用于在客户端和服务器之间建立安全的通信通道。其主要目标是确保双方的身份认证、协商加密算法以及交换会话密钥。SSL握手协议包括多种不同的握手...

    VC工程,ssl通讯socket,服务端和客户端,简单易懂。

    在本文中,我们将深入探讨如何使用Visual C++(VC)进行SSL通信,主要基于OpenSSL库来实现Socket服务器和...这个过程涉及了SSL的握手协议、证书管理和Socket编程,对于理解和实现安全的网络应用具有重要的实践价值。

    Qt实现的SSL通信客户端和服务器

    4. 执行SSL握手过程,验证服务器的证书。 5. 安全地读写数据。 在提供的文件中,"sslserver"可能是一个实现了SSL服务器的示例代码,"securesocketclient"可能是SSL客户端的代码。"sslcert"文件可能包含了服务器的...

    ssl.rar_SSL 证书_ssl_ssl证书_证书生成

    在SSL通信中,客户端(通常是浏览器)与服务器之间会进行一系列握手过程。首先,服务器会向客户端发送其SSL证书,证书中包含了服务器的公开密钥。这个公开密钥用于客户端对敏感信息的加密,只有服务器拥有相应的私钥...

    SSL证书生成软件、包括转换证书格式

    SSL证书生成软件、包括转换证书格式

    android ssl证书验证

    在Android中,SSL证书验证主要涉及到以下几个方面: 1. **默认的信任管理器**:Android系统内置了一个TrustManager,用于处理默认的证书信任链。大多数情况下,这个默认的信任管理器可以处理大多数受信任的CA签发的...

Global site tag (gtag.js) - Google Analytics