在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服务端连接及安装数字证书
在这个场景中,我们要探讨如何利用openssl和curl库来获取HTTPS服务端证书,这有助于我们验证服务器的身份和建立安全连接。 首先,openssl是一个强大的安全套接字层密码库,包含了各种主要的密码算法、常用的密钥和...
在 SSL 握手协议中,客户端和服务器之间进行了多次交互,以确保身份认证和加密通信的安全性。 SSL 握手协议的主要过程包括: 1. 客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的...
在VC6,即Microsoft Visual C++ 6.0环境下,我们可以利用SSL库来编写客户端和服务端的应用程序,以实现安全的数据传输。本压缩包文件包含了一个名为"ssl_test"的示例项目,用于帮助开发者理解和实践SSL的使用。 SSL...
本教程将深入探讨如何使用开源工具OpenSSL来实现SSL握手调试,以及制作数字证书和进行加解密操作。 首先,OpenSSL是一个强大的安全套接层/传输层安全(TLS/SSL)库,包含了各种主要的密码算法、常用的密钥和证书封装...
服务端需要能够处理SSL握手过程,包括交换证书、协商加密套件和验证客户端的身份。 2. **SSL客户端实现**:客户端代码则负责发起SSL连接请求。它也需要初始化SSL上下文,但通常不需要提供证书。客户端会连接到...
SSL证书在线生成系统源码实现了从申请到管理SSL证书的全程自动化,简化了用户操作,增强了网络安全。通过对接SSL证书API,系统能够快速响应并处理证书请求,确保网站的数据传输安全,为用户提供高效便捷的SSL服务。...
- 在编程中,需要捕获可能的SSLException和其他相关异常,例如证书不受信任、证书过期等,并给出适当的错误提示。 通过上述步骤,我们可以实现Java客户端和服务器之间的SSL双向认证。在实际应用中,这可以确保数据...
SSL握手过程实例分析 SSL(Secure Sockets Layer)是一种...SSL握手过程是SSL协议中最重要的一部分,通过对SSL握手过程的深入分析,我们可以更好地理解SSL协议的工作机理,并且可以更好地应用SSL协议在实际项目中。
- 自签发证书:使用`openssl x509`命令,使用之前生成的私钥对证书请求进行签名,生成自签名的SSL证书。 - 安装证书:将生成的证书安装到本地的信任存储或服务器上。 4. 测试环境的应用: 在本地开发和测试环境...
在SSL双向认证握手过程中,客户端首先向服务器发送一个ClientHello消息,该消息包含以下信息: * 客户端支持的SSL协议版本号(ProtocolVersion) * 客户端生成的随机数(Random) * 客户端支持的加密算法套件...
在IT行业中,Boost库是一个广泛使用的C++库,它提供了许多功能强大的工具,包括...在实际项目中,根据需求可能还需要实现更复杂的逻辑,比如多线程处理、负载均衡、会话管理等,但基础的SSL服务端设置就是以上所述。
* 如果服务端证书可信,客户端使用服务端证书里的公钥加密密钥交换信息,并发送给服务端 * 服务端使用私钥解密密钥交换信息,并计算交换后的密钥 * 双方使用对称加密算法加密正式的数据 四、非对称加密算法RSA * ...
系统会将自身的证书和私钥存储在密钥仓库中,在进行SSL握手之前,将这些信息放入SSL_CTX变量中。握手完成后,系统从`SSLSession`中获取服务器的证书,并使用可信密钥仓库来验证该证书的可信性。此外,还需要确保将...
SSL握手协议是安全套接字层(Secure Sockets Layer)的核心组成部分,用于在客户端和服务器之间建立安全的通信通道。其主要目标是确保双方的身份认证、协商加密算法以及交换会话密钥。SSL握手协议包括多种不同的握手...
在本文中,我们将深入探讨如何使用Visual C++(VC)进行SSL通信,主要基于OpenSSL库来实现Socket服务器和...这个过程涉及了SSL的握手协议、证书管理和Socket编程,对于理解和实现安全的网络应用具有重要的实践价值。
4. 执行SSL握手过程,验证服务器的证书。 5. 安全地读写数据。 在提供的文件中,"sslserver"可能是一个实现了SSL服务器的示例代码,"securesocketclient"可能是SSL客户端的代码。"sslcert"文件可能包含了服务器的...
在SSL通信中,客户端(通常是浏览器)与服务器之间会进行一系列握手过程。首先,服务器会向客户端发送其SSL证书,证书中包含了服务器的公开密钥。这个公开密钥用于客户端对敏感信息的加密,只有服务器拥有相应的私钥...
SSL证书生成软件、包括转换证书格式
在Android中,SSL证书验证主要涉及到以下几个方面: 1. **默认的信任管理器**:Android系统内置了一个TrustManager,用于处理默认的证书信任链。大多数情况下,这个默认的信任管理器可以处理大多数受信任的CA签发的...