i.BIO方式的SSL通道流程

前面已经讲解了BIO通道的整体流程,对于SSL的流程是插在通道中的,在BIO通道的初始化的时候,根据Connector配置的SSLEnabled属性进行SSL的逻辑。

主要集中的位置在JIOEndpoint的bind方法中:

这个特殊的ServerSocketFactory是SSLServerSocketFactory,我们看看其工厂创建之前做了什么内容,具体分解一下上述的这一行的代码:

左侧是Tomcat的类,Tomcat类中有两套SSL的实现,一套就是JSSEImplement,也就是基于JSSE的(另外一套是APR集成openssl的),因此这个默认就走的是JSSEImplementation,这个实例可以进行切换并设置到协议Handler中。

对于JSSEImplementation的实现,其主要是JSSESocketFactory,这个类的主要作用就是和JSSE框架进行集成,并将server.xml中的Connector的SSL相关配置,传递到JSSE的类中,最后实例化出SSLServerSocketFactory,返回给JIOEndpoint的bind方法。

主要初始化在init方法中,可以归纳为下面的几个步骤:

1.基于Connector配置的协议,实例化SSLContext

2.初始化Keystore和TrustStore


3.将Keystore作为参数传给KeyManagerFactory,并获得KeyManager

对于TrustStore,也是同样的方式传入进去,最后获得TrustManager


4.将KeyManager,TrustManager作为参数,调用SSLContext.init

5.配置Tomcat的SSLSessionContext

6.基于SSLContext获得SSLSeverSocketFactory

7.根据Connector配置的cipers,与SSLContext默认的cipers取交集

8.根据Connector配置的enableprotocol,与SSLContext默认的protocol取交集

这一步和上面的一步的思路是一样的,也是取二者支持的协议的一个交集:

对于第7,8两步中得出的取完交集的enabledProtocol和enabledCipersuits,需要在最后一步,生成SSLServerSocket的时候进行设置

9.最后进行checkconfig,基于前面的配置进行检验

需要注意的是,有几个属性需要在初始化SSLServerSocket的时候设置进去,可以看一下initserverSocket方法:

一共是4个属性,enabledProtocol和enabledCipersuits,还有客户端的双向认证clientAuth,和只有JDK8支持的ciper顺序.

到此为止,整个SSL通道BIO的部分实现基本逻辑就完了,后续就是基于SSLServerSocket进行编程了,JSSE已经将SSL整个握手协议各种过程都封装起来了,和ServerSocket的程序区别不是很大。

总结

BIO方式的SSL逻辑的实现,也就是如果产生SSLServerSocket的,在这个过程中一共分成9个步骤,每一个步骤都调用JSSE的接口,将Tomcat的配置作为参数传递进去,在生成SSLServerSocket后,后续的操作就是基于socket编程了,和BIO的普通socket没有任何的区别。

来自为知笔记(Wiz)

时间: 2024-10-29 09:26:53

i.BIO方式的SSL通道流程的相关文章

如何让你的传输更安全——NIO模式和BIO模式实现SSL协议通信

对于SSL/TLS协议,如果要每个开发者都自己去实现显然会带来不必要的麻烦,正是为了解决这个问题Java为广大开发者提供了Java安全套接字扩展--JSSE,它包含了实现Internet安全通信的一系列包的集合,是SSL和TLS的纯Java实现,同时它是一个开放的标准,每个公司都可以自己实现JSSE,通过它可以透明地提供数据加密.服务器认证.信息完整性等功能,就像使用普通的套接字一样使用安全套接字,大大减轻了开发者的负担,使开发者可以很轻松将SSL协议整合到程序中,并且JSSE能将安全隐患降到了

SSL握手流程

一.SSL是什么? 安全套接字(SSL)协议是Web浏览器和Web服务器之间安全交换信息的协议. SSL介于应用层和TCP层之间,应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头. History: 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布. 1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞. 1996年,SSL 3.0版问世,得到大规模

Nginx+Tomcat+SSL配置(包括https跳转及腾讯免费SSL申请流程)

网上有非常多的nginx+ssl相关配置的文档,但大都是很简单的写一下如何改配置文件,并没有完整的配置流程,我自己找了很久才找到免费的ssl证书,然后直到网站可以正常运行经过了很多测试,写这篇的目的也是为了帮助阅读者能少走些弯路,还有就是不得不提醒,免费证书只有一年的使用期,而且安全度肯定不如收费证书,这点上希望大家能有所权衡! 一.免费SSL证书申请 网址:https://console.qcloud.com/ssl/apply 1. 2. 3.在你申请的二级域名上添加CNAME记录,添加完成

Nginx负载均衡、 ssl工作流程、生产ssl密钥对、Nginx配置ssl

Nginx负载均衡 负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中编辑虚拟主机配置文件vim /usr/local/nginx/conf/vhost/ld.conf 在配置文件中添加如下内容 upstream qq_com { ip_hash; server 61.135.157.156:80; server 125.39.240.113:80; } server { listen 80; server_name www.qq.com; location / { proxy_pass

Exchange2016多租户方式单SSL证书登录(4)外部客户端登录

内部客户端登录正常后,我们来模拟公网环境的客户端使用outlook和owa的方式进行多租户的登录,模拟环境之前,再回顾下实验环境拓扑图 图中,右边环境内部的DMZ和AD环境已经配置完成,接下来主要配置外部的公网环境,路由器由一台2003的服务器做远程路由访问,添加一台2003的服务器做公网DNS解析,一台测试的公网客户端 2003路由服务器添加两块网卡,INT网卡属于内部网络,IP地址10.0.0.1,OUT网卡属于外部网络,IP地址192.168.0.1 配置远程并启用路由和远程访问 配置完成

SpringMVC 强大的注解方式,走一个流程,看看,这些注解用过么

实现方式一: Controller层: 1 import java.util.List; 2 import java.util.Map; 3 import java.util.NoSuchElementException; 4 import java.util.Optional; 5 6 import org.apache.commons.lang3.StringUtils; 7 import org.bson.types.ObjectId; 8 import org.slf4j.helpers

java发送email(含代理方式,ssl方式,传统方式)

package spring.vhostall.com; import java.security.Security; import java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.

宝塔面板配置阿里云SSL证书流程

阿里云SSL证书申请过程就不在这里说了 1 先下载阿里云成功申请的SSL证书 解压后 有3个文件 2  找到宝塔面板的 站点设置  找到SSL设置 3 找到其他证书 用文本打开.key文件  复制里面的内容到左侧 秘钥(key) 用文本打开_public.crt文件  复制里面的内容到右侧  证书(pem)格式 然后保存 4  保存成功后  点击一下 部署 5  操作完成 原文地址:https://www.cnblogs.com/baker95935/p/10729430.html

Exchange2016多租户方式单SSL证书登录(3)内部客户端登录测试效果

Windows7+outlook2010成功 windows10+outlook2016,登录失败 windows8+outlook2013 成功