计算机网络学习(2)

举报
幼儿园老大* 发表于 2024/09/19 11:22:24 2024/09/19
【摘要】 HTTPS 协议由于 HTTP 协议使用明文在互联网传送数据,易被不法分子监听和截获。我们又引入了 HTTPS 协议取而代之,默认端口 443。HTTPS 协议在应用层下方增加了 SSL 层,使用 TLS 协议来加密和解密数据包,这样在互联网上传送的数据将经过加密。加密方式建立连接后的数据交互采用对称加密:加密密钥和解密密钥相同。建立连接时协商密钥采用非对称加密:加密密钥和解密密钥不同,两个...

HTTPS 协议

由于 HTTP 协议使用明文在互联网传送数据,易被不法分子监听和截获。我们又引入了 HTTPS 协议取而代之,默认端口 443。

HTTPS 协议在应用层下方增加了 SSL 层,使用 TLS 协议来加密和解密数据包,这样在互联网上传送的数据将经过加密。

加密方式

  1. 建立连接后的数据交互采用对称加密:加密密钥和解密密钥相同。

  2. 建立连接时协商密钥采用非对称加密:加密密钥和解密密钥不同,两个密钥互相能解密对方的加密内容。

    服务器会公开一个非对称加密密钥(公钥),并保留一个非对称加密码密钥(私钥)。

证书认证

服务器公钥由数字认证机构 CA 统一认证。CA 会用自己的私钥加密服务器公钥和相应信息,生成数字证书。在客户端向 CA 查询时将证书发送给客户端核对。

CA 根证书(包含公钥)存储在用户的浏览器中,访问网址时会自动比对服务器公钥。

  1. 客户端向服务器发送信息:请求连接,说明自己支持的加密算法,并给出随机数 A。
  2. 服务器向客户端发送信息:同意连接请求,确认合适的加密算法,并给出数字证书和随机数 B。
  3. 客户端向 CA 核对数字证书,确认有效后得到服务器公钥。

建立连接

  1. 客户端向服务器发送公钥加密信息:给出随机数 C。
  2. 服务器通过私钥解密信息,对信息 Hash 得到数字签名;然后向客户端发送私钥加密信息:返回数字签名。
  3. 客户端通过公钥解密信息,核对数字签名,确认服务器收到随机数 C。

之后双方就可以按照约定的对称加密方法,使用三个随机数生成的密钥进行数据交互。


HTTP 通信

Java 程序执行 HTTP 通信的类定义在 java.net 包内,使用时需进行导入。

基本通信方式:创建连接对象 》设置连接参数和请求属性 》建立连接并发送请求 》读取响应内容 》关闭连接

创建连接对象

  • URL 类:标记定向资源所在位置,如果格式错误则抛出 IOException

  • URLConnection 类:读取和写入 URL 类定向的资源,在 HTTP 协议中常用 HttpURLConnection 子类。

URL myUrl = new URL("https://www.baidu.com");
HttpURLConnection myCon = (HttpURLConnection)myUrl.openConnetcion();Copy to clipboardErrorCopied

配置连接

设置请求参数

myCon.setRequestMethod("POST");         // 设置连接方法(默认使用GET)

myCon.setDoInput(true);                 // 允许进行字符流输入: myCon.getInputStream().read();
myCon.setDoOutput(true);                // 允许进行字符流输出: myCon.getOutputStream().write();

myCon.setRequestMethod(1000);           // 设置最长建立连接时间,若超时则抛出 SocketTimeoutException
myCon.setRequestMethod(1000);           // 设置最长数据读取时间,若超时则抛出 SocketTimeoutExceptionCopy to clipboardErrorCopied

设置请求属性


// 设置版本
myCon.setRequestProperty("version", "1.2.3");            
// 设置浏览器类型(常用于爬虫伪装)
myCon.setRequestProperty("user-agent", "Mozilla/5.0 (compatible;  Windows NT 5.1;SV1)");
// 设置发送文本类型
myCon.setRequestProperty("Content-Type", "application/json;charset=utf-8");Copy to clipboardErrorCopied

连接并发送请求

  • connect 方法:建立连接并发送请求.
  • getOutputStream 方法:关闭输出流时自动建立连接并发送输出流请求.

myCon.connect();

OutputStreamWriter out = new OutputStreamWriter(myCon.getOutputStream());
out.write(str);                  
out.close();Copy to clipboardErrorCopied

获取响应数据

获取响应头信息

myCon.getResponseCode();        // 获取响应码(200为连接成功,404为未找到)
myCon.getHeaderField();         // 获取响应头字段
Copy to clipboardErrorCopied

获取响应内容

  • getContent 方法:获取响应内容。
  • getInputStream 方法:输入流获取响应内容,响应表明发送了错误则抛出 IOException
myCon.getContent(); 

BufferedReader in = new BufferedReader(new InputStreamReader(myCon.getInputStream()));
while ((str = in.readLine()) != null) {
    System.out.println(str);
}
in.close();Copy to clipboardErrorCopied

关闭连接

myCon.disconnect();
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。