---
title: "http与https"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/http-vs-https/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/01-系统基础与网络安全/网络工程/http与https.md"
content_hash: ed1a44912c85e01882aae9ccb11fc6cb8b2e854346cf2d692430bcc40288aa9a
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# http与https
HTTP（Hypertext Transfer Protocol，超文本传输协议）是用于在客户端（如浏览器）和服务器之间传输数据的应用层协议。它是万维网的基础，用于传输网页、图像、视频等资源。HTTP协议是无状态的，这意味着每个请求都是独立的，服务器不会自动记住之前的请求。

## HTTP的原理
HTTP协议基于请求-响应模式。它的工作原理如下：
1. **客户端发起请求**：客户端（通常是浏览器）向服务器发送一个HTTP请求，请求的内容可能是网页、图片、文件等资源。请求分为几部分：
	- **请求行**：包括请求方法（如GET、POST）、请求的资源路径以及HTTP版本。
    - **请求头**：包含客户端的配置信息和请求的元数据（如用户代理、接受的内容类型、认证信息等）。
    - **请求体**：在POST请求中，通常包含要发送到服务器的数据，如表单数据。
2. **服务器处理请求**：服务器接收到请求后，根据请求的内容执行相应的操作，比如读取文件、处理数据、查询数据库等。
3. **服务器发送响应**：服务器处理完请求后，将结果封装在HTTP响应中发回客户端。响应分为几部分：
	- **状态行**：包含HTTP版本、状态码（如200 OK、404 Not Found）和状态描述。
    - **响应头**：包含服务器信息、内容类型、缓存控制等。
    - **响应体**：实际返回的内容，如HTML页面、图片、文件等。
4. **客户端处理响应**：客户端收到响应后，根据响应头的信息和响应体的内容进行相应的处理，如渲染网页、下载文件等。

## HTTP的作用
HTTP协议的主要作用是为Web应用提供通信基础，它使得客户端和服务器能够通过标准化的方式交换信息。具体作用包括：

- **资源访问**：允许客户端访问服务器上的各种资源，如网页、图片、视频等。
- **通信控制**：通过HTTP头信息，控制缓存、认证、代理、内容协商等。
- **状态管理**：虽然HTTP本身是无状态的，但可以通过Cookie等机制进行状态管理，实现会话跟踪、用户认证等功能。


## HTTP的用法
使用HTTP协议的基本步骤和方法如下：
1. **使用浏览器**：用户通过输入URL（如https://www.example.com）来访问网页，浏览器会自动构建HTTP请求并发送给服务器。
2. **使用命令行工具**：可以使用如`curl`、`wget`等命令行工具手动构建并发送HTTP请求。例如：

```bash
curl -X GET https://www.example.com
```

## HTTPS
HTTP（Hypertext Transfer Protocol）和 HTTPS（Hypertext Transfer Protocol Secure）都是用于在客户端（如浏览器）和服务器之间传输数据的协议。
HTTPS  HTTP 的安全版本，使用了加密技术来保护数据的传输过程。

HTTPS 在 HTTP 的基础上增加了 SSL/TLS（安全套接字层/传输层安全协议）加密。使用 HTTPS 传输的数据是加密的，即使被截获，攻击者也无法轻易解密和读取。HTTPS 还可以验证服务器的身份，确保客户端连接到的是真正的服务器，而不是伪装的恶意服务器。

HTTPS需要数字证书（SSL 证书）来验证服务器的身份。这个证书由受信任的证书颁发机构（CA）签发。客户端（如浏览器）会验证服务器的证书，以确认连接的服务器是合法的。

## HTTPS 的实现原理
- **握手阶段**：
    - **客户端请求**：客户端（如浏览器）向服务器发起连接请求，表明它希望使用 HTTPS 进行通信，并发送支持的加密算法列表。
    - **服务器响应**：服务器选择一种加密算法，并将自己的数字证书发送给客户端。这个证书包含服务器的公钥和由证书颁发机构（CA）签名的服务器身份信息。
    - **验证证书**：客户端使用内置的受信任的 CA 列表来验证服务器证书的合法性。如果证书可信，客户端生成一个随机的“会话密钥”（对称密钥），并使用服务器的公钥对该密钥进行加密，然后发送给服务器。
    - **服务器解密**：服务器使用自己的私钥解密出客户端发送的“会话密钥”。从此，客户端和服务器使用这个对称密钥进行数据加密和解密。
- **数据传输阶段**：
    - 在握手阶段结束后，客户端和服务器使用协商好的对称密钥进行数据的加密传输。所有的数据都通过对称加密算法进行加密，以确保在传输过程中无法被窃听或篡改。
- **会话结束**：
    - 当会话结束时，客户端和服务器可以选择断开连接，并丢弃生成的对称密钥。下次通信需要重新进行握手和密钥协商。

## 如何配置 HTTPS 证书

**生成私钥和证书签名请求（CSR）**：
- 在服务器上生成一个私钥，并基于该私钥生成一个 CSR 文件。CSR 文件包含服务器的基本信息，如域名、组织名称等。
- 生成私钥和 CSR 的命令（以 OpenSSL 为例）：
```bash
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
```

**向 CA 申请证书**：
- 将生成的 CSR 文件提交给证书颁发机构（CA）申请证书。CA 会验证你的身份，并生成一个签名的证书文件（通常是 `.crt` 或 `.pem` 文件）。

**安装证书**：
- 将 CA 签发的证书和私钥一起安装到服务器上，并配置服务器软件（如 Apache、Nginx）使用这些证书文件。例如，在 Nginx 中的配置：
```nginx
server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/ssl/certs/yourdomain.crt;
    ssl_certificate_key /etc/ssl/private/yourdomain.key;

    # 其他配置...
}
```

**配置服务器**：
- 根据需求，可以进一步配置 SSL/TLS 版本、加密算法、HTTP/2 支持等选项，以优化 HTTPS 性能和安全性。

**测试和验证**：
- 配置完成后，重启服务器并使用浏览器访问 HTTPS 站点，确保证书已正确安装并工作。同时可以使用工具（如 SSL Labs 的 SSL Test）来检测和优化 HTTPS 配置。

## 客户端验证证书的方式
大多数操作系统和运行环境已经自带了受信任的证书颁发机构（CA）的根证书库。客户端在进行 HTTPS 通信时，会自动使用这些系统预装的根证书来验证服务器的证书。

### 1. **服务器发送证书**

- 当客户端发起 HTTPS 请求时，服务器会发送其 SSL/TLS 证书。这份证书包含服务器的公钥、证书的颁发者（CA）、证书的有效期以及证书所适用的域名等信息。

### 2. **验证证书链**

- 服务器发送的证书通常是由一个中间 CA 证书签署的，而这个中间 CA 证书又是由一个根 CA 证书签署的。客户端会检查证书链，从服务器证书向上追溯，直到找到一个受信任的根证书。这个根证书必须在客户端的 CA 证书库中被信任。
- 客户端依次验证链中的每一个证书，确保每个证书都是由上一级证书签署的，直到验证到受信任的根证书。如果链中任何一个证书不可信或无法验证，整个验证过程将失败。

### 3. **检查域名匹配**

- 客户端会检查服务器证书中的“通用名称”（Common Name, CN）或“主题备用名称”（Subject Alternative Name, SAN）是否与请求的域名匹配。这是为了防止中间人攻击。如果域名不匹配，客户端会认为证书无效。

### 4. **检查证书有效期**

- 客户端会检查证书的“有效期”字段，确保当前时间在证书的有效期内。如果证书已经过期或尚未生效，客户端将拒绝连接。

### 5. **检查证书吊销状态**

- 客户端可能会使用在线证书状态协议（OCSP）或证书吊销列表（CRL）检查证书是否已被吊销。如果证书在 CA 的吊销列表中，客户端将拒绝连接。
- 一些现代浏览器和客户端支持 OCSP Stapling，服务器在 TLS 握手时直接提供OCSP响应，减少了客户端单独查询的开销。

### 6. **信任根证书**

- 最终的验证步骤是检查证书链的根证书是否在客户端的信任库中。根证书必须是预先被客户端信任的，否则证书链验证将失败，连接将被拒绝。

### 7. **扩展和附加验证**

- **证书透明度（Certificate Transparency, CT）**：一些客户端（如现代浏览器）还会检查服务器证书是否在公开的证书透明度日志中注册，以防止伪造证书。
- **证书的扩展检查**：例如，Extended Validation (EV) 证书会显示额外的标识信息，如公司的名称。这种验证更严格，用户可以通过浏览器的地址栏看到更详细的信息，确保他们访问的是合法网站。

### 8. **用户提示与警告**

- 如果客户端发现证书不可信（如证书过期、域名不匹配、证书被吊销等），它通常会向用户发出警告，提示可能的安全风险，并阻止继续连接。
