计算机网络学习(2)
【摘要】 HTTPS 协议由于 HTTP 协议使用明文在互联网传送数据,易被不法分子监听和截获。我们又引入了 HTTPS 协议取而代之,默认端口 443。HTTPS 协议在应用层下方增加了 SSL 层,使用 TLS 协议来加密和解密数据包,这样在互联网上传送的数据将经过加密。加密方式建立连接后的数据交互采用对称加密:加密密钥和解密密钥相同。建立连接时协商密钥采用非对称加密:加密密钥和解密密钥不同,两个...
HTTPS 协议
由于 HTTP 协议使用明文在互联网传送数据,易被不法分子监听和截获。我们又引入了 HTTPS 协议取而代之,默认端口 443。
HTTPS 协议在应用层下方增加了 SSL 层,使用 TLS 协议来加密和解密数据包,这样在互联网上传送的数据将经过加密。
加密方式
-
建立连接后的数据交互采用对称加密:加密密钥和解密密钥相同。
-
建立连接时协商密钥采用非对称加密:加密密钥和解密密钥不同,两个密钥互相能解密对方的加密内容。
服务器会公开一个非对称加密密钥(公钥),并保留一个非对称加密码密钥(私钥)。
证书认证
服务器公钥由数字认证机构 CA 统一认证。CA 会用自己的私钥加密服务器公钥和相应信息,生成数字证书。在客户端向 CA 查询时将证书发送给客户端核对。
CA 根证书(包含公钥)存储在用户的浏览器中,访问网址时会自动比对服务器公钥。
- 客户端向服务器发送信息:请求连接,说明自己支持的加密算法,并给出随机数 A。
- 服务器向客户端发送信息:同意连接请求,确认合适的加密算法,并给出数字证书和随机数 B。
- 客户端向 CA 核对数字证书,确认有效后得到服务器公钥。
建立连接
- 客户端向服务器发送公钥加密信息:给出随机数 C。
- 服务器通过私钥解密信息,对信息 Hash 得到数字签名;然后向客户端发送私钥加密信息:返回数字签名。
- 客户端通过公钥解密信息,核对数字签名,确认服务器收到随机数 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)