前面已经讲解了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没有任何的区别。

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

  1. k.NIO方式SSL通道流程

    在看完NIO和SSLEngine集成的例子后,我们了解到并没有提供一个SSLServerSocketChannel,在SelectionKey事件发生后,通过SSLEngine的wrap和unwrap ...

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

    对于SSL/TLS协议,如果要每个开发者都自己去实现显然会带来不必要的麻烦,正是为了解决这个问题Java为广大开发者提供了Java安全套接字扩展--JSSE,它包含了实现Internet安全通信的一系 ...

  3. nginx配置ssl证书流程及常见问题

    背景:         项目开发中用到了微信小程序,但是服务器配置URL必须是HTTPS,所以需要通过配置nginx的SSL模块来支持HTTPS访问,也就是说,要做一个网站域名为 dmsdbj.com ...

  4. SSL握手流程

    一.SSL是什么? 安全套接字(SSL)协议是Web浏览器和Web服务器之间安全交换信息的协议. SSL介于应用层和TCP层之间,应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层 ...

  5. MySQL复制表的方式以及原理和流程

    复制表的俩种方式: 第一.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 或者 create table 新表 like 旧表 第二.复制表结 ...

  6. 【转载】python中利用smtplib发送邮件的3中方式 普通/ssl/tls

    #!/usr/bin/python # coding:utf- import smtplib from email.MIMEText import MIMEText from email.Utils ...

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

    阿里云SSL证书申请过程就不在这里说了 1 先下载阿里云成功申请的SSL证书 解压后 有3个文件 2  找到宝塔面板的 站点设置  找到SSL设置 3 找到其他证书 用文本打开.key文件  复制里面 ...

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

    package spring.vhostall.com; import java.security.Security; import java.util.Date; import java.util. ...

  9. C# https证书通信Post/Get(解决做ssl通道时遇到“请求被中止: 未能创建 SSL/TLS 安全通道”问题)

    public static string HttpPost(string url, string param = null) { HttpWebRequest request; //如果是发送HTTP ...

随机推荐

  1. LeetCode Count of Range Sum

    原题链接在这里:https://leetcode.com/problems/count-of-range-sum/ 题目: Given an integer array nums, return th ...

  2. nginx执行文件替换掉之后重启提示permission denied

    重启的时候显示 -bash: /usr/local/nginx/sbin/nginx: Permission denied 进入nginx执行文件的目录:

  3. LUA 函数式编程demo

    什么是函数式编程 http://www.zhihu.com/topic/19585411/hot 函数式编程的本质函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指 ...

  4. 一款bootstrap树形js

    http://www.htmleaf.com/Demo/201502141380.html

  5. 20145320 《Java程序设计》第10周学习总结

    20145320 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 按照计算机网络的定义 ...

  6. 注解的基本盘点 -- 《Java编程思想》

    注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在之后的某一个时刻非常方便地使用这些数据. ---<Java编程思想> 其实注解可以理解为一个工具类,只要使用了这个工 ...

  7. 【Selenium】3.介绍Selenium IDE

    本文供学习交流之用,没有商业用途,没有盈利. 完全是我自己为督促自己学习而翻译的.翻译的不好,见谅.来源于:http://www.guru99.com/introduction-selenuim-id ...

  8. c语言的学习秘籍

    c语言其实是一环套一环胡的,最开始的是变量,然后是数组,接着是结构体,接着是链表.(其他的是c语言的语法,那东西大多了就会了.) 学习时可以从程序在电脑里的内存看起,先了解变量,将多个变量连起来就是数 ...

  9. 商人过河问题(DFS)

    问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人.在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过 ...

  10. 【实践】jquery实现滑动动画及轮播

    在做这个之前我已经模仿了一遍大神的轮播动画做了一次其切换模式就是一张图片隐藏另一张图片显示过渡效果是渐入(fadein),但是目前的动画切换大多数都是用图片的左右切换动作的于是在网上看了一些关于这类型 ...