{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/http-vs-https/",
  "atlas": "https://www.pystone.net/?node=http-vs-https#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/http-vs-https.md",
  "context": "https://www.pystone.net/notes/http-vs-https.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:http-vs-https",
  "slug": "http-vs-https",
  "title": "http与https",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "http与https HTTP（Hypertext Transfer Protocol，超文本传输协议）是用于在客户端（如浏览器）和服务器之间传输数据的应用层协议。它是万维网的基础，用于传输网页、图像、视频等资源。HTTP协议是无状态的，这意味着每个请求都是独立的，服务器不会自动记住之前的请求。",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "ed1a44912c85e01882aae9ccb11fc6cb8b2e854346cf2d692430bcc40288aa9a",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "http与https",
      "anchor": "http与https",
      "citation": "https://www.pystone.net/notes/http-vs-https/#http%E4%B8%8Ehttps"
    },
    {
      "depth": 2,
      "text": "HTTP的原理",
      "anchor": "http的原理",
      "citation": "https://www.pystone.net/notes/http-vs-https/#http%E7%9A%84%E5%8E%9F%E7%90%86"
    },
    {
      "depth": 2,
      "text": "HTTP的作用",
      "anchor": "http的作用",
      "citation": "https://www.pystone.net/notes/http-vs-https/#http%E7%9A%84%E4%BD%9C%E7%94%A8"
    },
    {
      "depth": 2,
      "text": "HTTP的用法",
      "anchor": "http的用法",
      "citation": "https://www.pystone.net/notes/http-vs-https/#http%E7%9A%84%E7%94%A8%E6%B3%95"
    },
    {
      "depth": 2,
      "text": "HTTPS",
      "anchor": "https",
      "citation": "https://www.pystone.net/notes/http-vs-https/#https"
    },
    {
      "depth": 2,
      "text": "HTTPS 的实现原理",
      "anchor": "https-的实现原理",
      "citation": "https://www.pystone.net/notes/http-vs-https/#https-%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86"
    },
    {
      "depth": 2,
      "text": "如何配置 HTTPS 证书",
      "anchor": "如何配置-https-证书",
      "citation": "https://www.pystone.net/notes/http-vs-https/#%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE-https-%E8%AF%81%E4%B9%A6"
    },
    {
      "depth": 2,
      "text": "客户端验证证书的方式",
      "anchor": "客户端验证证书的方式",
      "citation": "https://www.pystone.net/notes/http-vs-https/#%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%AA%8C%E8%AF%81%E8%AF%81%E4%B9%A6%E7%9A%84%E6%96%B9%E5%BC%8F"
    },
    {
      "depth": 3,
      "text": "1. 服务器发送证书",
      "anchor": "1-服务器发送证书",
      "citation": "https://www.pystone.net/notes/http-vs-https/#1-%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%91%E9%80%81%E8%AF%81%E4%B9%A6"
    },
    {
      "depth": 3,
      "text": "2. 验证证书链",
      "anchor": "2-验证证书链",
      "citation": "https://www.pystone.net/notes/http-vs-https/#2-%E9%AA%8C%E8%AF%81%E8%AF%81%E4%B9%A6%E9%93%BE"
    },
    {
      "depth": 3,
      "text": "3. 检查域名匹配",
      "anchor": "3-检查域名匹配",
      "citation": "https://www.pystone.net/notes/http-vs-https/#3-%E6%A3%80%E6%9F%A5%E5%9F%9F%E5%90%8D%E5%8C%B9%E9%85%8D"
    },
    {
      "depth": 3,
      "text": "4. 检查证书有效期",
      "anchor": "4-检查证书有效期",
      "citation": "https://www.pystone.net/notes/http-vs-https/#4-%E6%A3%80%E6%9F%A5%E8%AF%81%E4%B9%A6%E6%9C%89%E6%95%88%E6%9C%9F"
    },
    {
      "depth": 3,
      "text": "5. 检查证书吊销状态",
      "anchor": "5-检查证书吊销状态",
      "citation": "https://www.pystone.net/notes/http-vs-https/#5-%E6%A3%80%E6%9F%A5%E8%AF%81%E4%B9%A6%E5%90%8A%E9%94%80%E7%8A%B6%E6%80%81"
    },
    {
      "depth": 3,
      "text": "6. 信任根证书",
      "anchor": "6-信任根证书",
      "citation": "https://www.pystone.net/notes/http-vs-https/#6-%E4%BF%A1%E4%BB%BB%E6%A0%B9%E8%AF%81%E4%B9%A6"
    },
    {
      "depth": 3,
      "text": "7. 扩展和附加验证",
      "anchor": "7-扩展和附加验证",
      "citation": "https://www.pystone.net/notes/http-vs-https/#7-%E6%89%A9%E5%B1%95%E5%92%8C%E9%99%84%E5%8A%A0%E9%AA%8C%E8%AF%81"
    },
    {
      "depth": 3,
      "text": "8. 用户提示与警告",
      "anchor": "8-用户提示与警告",
      "citation": "https://www.pystone.net/notes/http-vs-https/#8-%E7%94%A8%E6%88%B7%E6%8F%90%E7%A4%BA%E4%B8%8E%E8%AD%A6%E5%91%8A"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:systems-and-network-security",
      "title": "系统基础与网络安全",
      "url": "https://www.pystone.net/notes/systems-and-network-security/",
      "atlas": "https://www.pystone.net/?node=systems-and-network-security#knowledge-atlas",
      "label": "系统基础与网络安全",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "网络工程中的“http与https”导航项",
      "citation": "https://www.pystone.net/notes/systems-and-network-security/#%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B"
    }
  ],
  "contentMarkdown": "# http与https\nHTTP（Hypertext Transfer Protocol，超文本传输协议）是用于在客户端（如浏览器）和服务器之间传输数据的应用层协议。它是万维网的基础，用于传输网页、图像、视频等资源。HTTP协议是无状态的，这意味着每个请求都是独立的，服务器不会自动记住之前的请求。\n\n## HTTP的原理\nHTTP协议基于请求-响应模式。它的工作原理如下：\n1. **客户端发起请求**：客户端（通常是浏览器）向服务器发送一个HTTP请求，请求的内容可能是网页、图片、文件等资源。请求分为几部分：\n\t- **请求行**：包括请求方法（如GET、POST）、请求的资源路径以及HTTP版本。\n    - **请求头**：包含客户端的配置信息和请求的元数据（如用户代理、接受的内容类型、认证信息等）。\n    - **请求体**：在POST请求中，通常包含要发送到服务器的数据，如表单数据。\n2. **服务器处理请求**：服务器接收到请求后，根据请求的内容执行相应的操作，比如读取文件、处理数据、查询数据库等。\n3. **服务器发送响应**：服务器处理完请求后，将结果封装在HTTP响应中发回客户端。响应分为几部分：\n\t- **状态行**：包含HTTP版本、状态码（如200 OK、404 Not Found）和状态描述。\n    - **响应头**：包含服务器信息、内容类型、缓存控制等。\n    - **响应体**：实际返回的内容，如HTML页面、图片、文件等。\n4. **客户端处理响应**：客户端收到响应后，根据响应头的信息和响应体的内容进行相应的处理，如渲染网页、下载文件等。\n\n## HTTP的作用\nHTTP协议的主要作用是为Web应用提供通信基础，它使得客户端和服务器能够通过标准化的方式交换信息。具体作用包括：\n\n- **资源访问**：允许客户端访问服务器上的各种资源，如网页、图片、视频等。\n- **通信控制**：通过HTTP头信息，控制缓存、认证、代理、内容协商等。\n- **状态管理**：虽然HTTP本身是无状态的，但可以通过Cookie等机制进行状态管理，实现会话跟踪、用户认证等功能。\n\n\n## HTTP的用法\n使用HTTP协议的基本步骤和方法如下：\n1. **使用浏览器**：用户通过输入URL（如https://www.example.com）来访问网页，浏览器会自动构建HTTP请求并发送给服务器。\n2. **使用命令行工具**：可以使用如`curl`、`wget`等命令行工具手动构建并发送HTTP请求。例如：\n\n```bash\ncurl -X GET https://www.example.com\n```\n\n## HTTPS\nHTTP（Hypertext Transfer Protocol）和 HTTPS（Hypertext Transfer Protocol Secure）都是用于在客户端（如浏览器）和服务器之间传输数据的协议。\nHTTPS  HTTP 的安全版本，使用了加密技术来保护数据的传输过程。\n\nHTTPS 在 HTTP 的基础上增加了 SSL/TLS（安全套接字层/传输层安全协议）加密。使用 HTTPS 传输的数据是加密的，即使被截获，攻击者也无法轻易解密和读取。HTTPS 还可以验证服务器的身份，确保客户端连接到的是真正的服务器，而不是伪装的恶意服务器。\n\nHTTPS需要数字证书（SSL 证书）来验证服务器的身份。这个证书由受信任的证书颁发机构（CA）签发。客户端（如浏览器）会验证服务器的证书，以确认连接的服务器是合法的。\n\n## HTTPS 的实现原理\n- **握手阶段**：\n    - **客户端请求**：客户端（如浏览器）向服务器发起连接请求，表明它希望使用 HTTPS 进行通信，并发送支持的加密算法列表。\n    - **服务器响应**：服务器选择一种加密算法，并将自己的数字证书发送给客户端。这个证书包含服务器的公钥和由证书颁发机构（CA）签名的服务器身份信息。\n    - **验证证书**：客户端使用内置的受信任的 CA 列表来验证服务器证书的合法性。如果证书可信，客户端生成一个随机的“会话密钥”（对称密钥），并使用服务器的公钥对该密钥进行加密，然后发送给服务器。\n    - **服务器解密**：服务器使用自己的私钥解密出客户端发送的“会话密钥”。从此，客户端和服务器使用这个对称密钥进行数据加密和解密。\n- **数据传输阶段**：\n    - 在握手阶段结束后，客户端和服务器使用协商好的对称密钥进行数据的加密传输。所有的数据都通过对称加密算法进行加密，以确保在传输过程中无法被窃听或篡改。\n- **会话结束**：\n    - 当会话结束时，客户端和服务器可以选择断开连接，并丢弃生成的对称密钥。下次通信需要重新进行握手和密钥协商。\n\n## 如何配置 HTTPS 证书\n\n**生成私钥和证书签名请求（CSR）**：\n- 在服务器上生成一个私钥，并基于该私钥生成一个 CSR 文件。CSR 文件包含服务器的基本信息，如域名、组织名称等。\n- 生成私钥和 CSR 的命令（以 OpenSSL 为例）：\n```bash\nopenssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr\n```\n\n**向 CA 申请证书**：\n- 将生成的 CSR 文件提交给证书颁发机构（CA）申请证书。CA 会验证你的身份，并生成一个签名的证书文件（通常是 `.crt` 或 `.pem` 文件）。\n\n**安装证书**：\n- 将 CA 签发的证书和私钥一起安装到服务器上，并配置服务器软件（如 Apache、Nginx）使用这些证书文件。例如，在 Nginx 中的配置：\n```nginx\nserver {\n    listen 443 ssl;\n    server_name yourdomain.com;\n\n    ssl_certificate /etc/ssl/certs/yourdomain.crt;\n    ssl_certificate_key /etc/ssl/private/yourdomain.key;\n\n    # 其他配置...\n}\n```\n\n**配置服务器**：\n- 根据需求，可以进一步配置 SSL/TLS 版本、加密算法、HTTP/2 支持等选项，以优化 HTTPS 性能和安全性。\n\n**测试和验证**：\n- 配置完成后，重启服务器并使用浏览器访问 HTTPS 站点，确保证书已正确安装并工作。同时可以使用工具（如 SSL Labs 的 SSL Test）来检测和优化 HTTPS 配置。\n\n## 客户端验证证书的方式\n大多数操作系统和运行环境已经自带了受信任的证书颁发机构（CA）的根证书库。客户端在进行 HTTPS 通信时，会自动使用这些系统预装的根证书来验证服务器的证书。\n\n### 1. **服务器发送证书**\n\n- 当客户端发起 HTTPS 请求时，服务器会发送其 SSL/TLS 证书。这份证书包含服务器的公钥、证书的颁发者（CA）、证书的有效期以及证书所适用的域名等信息。\n\n### 2. **验证证书链**\n\n- 服务器发送的证书通常是由一个中间 CA 证书签署的，而这个中间 CA 证书又是由一个根 CA 证书签署的。客户端会检查证书链，从服务器证书向上追溯，直到找到一个受信任的根证书。这个根证书必须在客户端的 CA 证书库中被信任。\n- 客户端依次验证链中的每一个证书，确保每个证书都是由上一级证书签署的，直到验证到受信任的根证书。如果链中任何一个证书不可信或无法验证，整个验证过程将失败。\n\n### 3. **检查域名匹配**\n\n- 客户端会检查服务器证书中的“通用名称”（Common Name, CN）或“主题备用名称”（Subject Alternative Name, SAN）是否与请求的域名匹配。这是为了防止中间人攻击。如果域名不匹配，客户端会认为证书无效。\n\n### 4. **检查证书有效期**\n\n- 客户端会检查证书的“有效期”字段，确保当前时间在证书的有效期内。如果证书已经过期或尚未生效，客户端将拒绝连接。\n\n### 5. **检查证书吊销状态**\n\n- 客户端可能会使用在线证书状态协议（OCSP）或证书吊销列表（CRL）检查证书是否已被吊销。如果证书在 CA 的吊销列表中，客户端将拒绝连接。\n- 一些现代浏览器和客户端支持 OCSP Stapling，服务器在 TLS 握手时直接提供OCSP响应，减少了客户端单独查询的开销。\n\n### 6. **信任根证书**\n\n- 最终的验证步骤是检查证书链的根证书是否在客户端的信任库中。根证书必须是预先被客户端信任的，否则证书链验证将失败，连接将被拒绝。\n\n### 7. **扩展和附加验证**\n\n- **证书透明度（Certificate Transparency, CT）**：一些客户端（如现代浏览器）还会检查服务器证书是否在公开的证书透明度日志中注册，以防止伪造证书。\n- **证书的扩展检查**：例如，Extended Validation (EV) 证书会显示额外的标识信息，如公司的名称。这种验证更严格，用户可以通过浏览器的地址栏看到更详细的信息，确保他们访问的是合法网站。\n\n### 8. **用户提示与警告**\n\n- 如果客户端发现证书不可信（如证书过期、域名不匹配、证书被吊销等），它通常会向用户发出警告，提示可能的安全风险，并阻止继续连接。\n"
}
