文章目录
- 一、CSR证书基本概念
- 二、CSR证书和服务器证书区别
- 三、CSR证书解析源码
一、CSR证书基本概念
CSR(Certificate Signing Request)证书签名请求是一种包含公钥及其相关信息的文件,用于向证书颁发机构(CA)请求数字证书。以下是CSR的一些详细说明:
-
生成过程:
- 用户生成一个密钥对,包括一个私钥和一个相关的公钥。
- 使用生成的私钥创建 CSR 文件,其中包含有关请求者(用户)的信息,如组织名称、组织单位、国家、城市等。
- CSR 包含了公钥、相关的身份信息以及请求者对该信息的数字签名。
-
包含的信息:
- Subject (请求者信息): 包含组织名称、组织单位、国家、城市等信息,标识了证书请求者的身份。
- Public Key (公钥): CSR 中包含了请求者的公钥。这是由私钥生成的。
- Digital Signature (数字签名): 使用请求者的私钥对 CSR 的内容进行数字签名,以确保 CSR 的完整性和真实性。
-
用途:
- CSR 主要用于向证书颁发机构请求数字证书。
- 用户在生成 CSR 后,将其发送给 CA。CA 会验证 CSR 中的信息,并签发与该 CSR 相对应的数字证书。
-
生成 CSR 的工具:
- 使用 OpenSSL:通过 OpenSSL 命令行工具或 OpenSSL 库,可以生成 CSR。
openssl req -new -key private-key.pem -out csr.pem
- 使用 OpenSSL:通过 OpenSSL 命令行工具或 OpenSSL 库,可以生成 CSR。
-
CSR 文件格式:
- CSR 通常以 PEM(Privacy-Enhanced Mail)格式保存,该格式采用 Base64 编码,并用 “-----BEGIN CERTIFICATE REQUEST-----” 和 “-----END CERTIFICATE REQUEST-----” 标记。
-
注意事项:
- 在生成 CSR 时,用户需要谨慎保管私钥,因为私钥用于生成 CSR 的数字签名,同时也会用于后续对证书进行签名和验证。
二、CSR证书和服务器证书区别
CSR(Certificate Signing Request)证书和服务器证书是在数字证书颁发过程中涉及的两个不同的概念。
-
CSR(Certificate Signing Request)证书:
- 生成者:由证书请求者(通常是服务器管理员或网络管理员)生成。
- 内容:包含了请求者的公钥以及请求者的身份信息,如组织名称、组织单位、国家、城市等。
- 生成工具:通常使用 OpenSSL 等工具生成 CSR 文件。
- 用途:主要用于向证书颁发机构(CA)请求数字证书。
- 流程:请求者生成 CSR,将其发送给 CA,CA 验证 CSR 中的信息,如果验证通过,CA 将签发数字证书。
-
服务器证书:
- 生成者:由证书颁发机构(CA)生成,经过验证的 CSR 可以用于生成服务器证书。
- 内容:包含了服务器的公钥、服务器的身份信息,以及 CA 的签名。
- 生成工具:由 CA 使用 CSR 生成,通常使用 CA 的私钥进行签名。
- 用途:用于在网络通信中验证服务器的身份,建立安全的通信连接。
- 流程:CA 收到 CSR 后,验证 CSR 中的信息,并为 CSR 签发数字证书。数字证书中包含了 CSR 中的信息以及 CA 的签名。服务器在通信中提供该数字证书,客户端使用 CA 的公钥验证数字签名,从而信任服务器的身份。
总的来说,CSR 是由请求者生成的,用于请求数字证书;而服务器证书是由 CA 根据 CSR 生成的,用于在网络通信中验证服务器的身份。服务器证书包含了 CSR 中的信息,并经过 CA 的签名,从而增强了证书的可信度。
三、CSR证书解析源码
在下面的示例中,我将展示如何使用 OpenSSL 和 C++ 来解析 CSR(Certificate Signing Request)证书。这个示例假设你已经有一个包含 CSR 数据的文件,并使用 OpenSSL 的 API 来读取和解析它。
#include <iostream>
#include <fstream>
#include <openssl/pem.h>
#include <openssl/x509.h>void parseCSR(const std::string& csrFilePath) {// 读取 CSR 文件std::ifstream csrFile(csrFilePath);if (!csrFile.is_open()) {std::cerr << "Error: Unable to open CSR file." << std::endl;return;}// 读取 PEM 编码的 CSR 数据std::string csrData((std::istreambuf_iterator<char>(csrFile)),std::istreambuf_iterator<char>());csrFile.close();// 将 PEM 数据转换为 BIOBIO *bio = BIO_new_mem_buf(csrData.c_str(), -1);if (bio == nullptr) {std::cerr << "Error: Failed to create BIO." << std::endl;return;}// 读取 CSRX509_REQ *req = PEM_read_bio_X509_REQ(bio, nullptr, nullptr, nullptr);if (req == nullptr) {std::cerr << "Error: Failed to parse CSR." << std::endl;BIO_free(bio);return;}// 获取 CSR 中的主题信息X509_NAME *subject = X509_REQ_get_subject_name(req);if (subject == nullptr) {std::cerr << "Error: Failed to get subject name from CSR." << std::endl;X509_REQ_free(req);BIO_free(bio);return;}// 打印主题信息std::cout << "CSR Subject: " << X509_NAME_oneline(subject, nullptr, 0) << std::endl;// 释放资源X509_REQ_free(req);BIO_free(bio);
}int main() {// 请将下面的路径替换为你的 CSR 文件路径std::string csrFilePath = "/path/to/your/csrfile.csr";// 解析 CSRparseCSR(csrFilePath);return 0;
}
请注意,你需要将 "/path/to/your/csrfile.csr"
替换为实际的 CSR 文件路径。这个示例使用 OpenSSL 的 API 来读取和解析 PEM 编码的 CSR 数据,并输出主题信息。