CSR,全称Certificate Signing Request(证书签发请求),是一种包含了公钥和与主题(通常是实体的信息,如个人或组织)相关的其他信息的数据结构。CSR通常用于向证书颁发机构(Certificate Authority,CA)申请数字证书。下面是CSR的详细介绍:

CSR 的结构

一个典型的CSR包含以下关键信息:

  1. 主题信息(Subject):这部分信息包括了证书的使用者(通常是个人或实体)的详细信息。主题信息可以包括以下字段:

    • Common Name (CN):通常是个体的名称或主机名。
    • Organization (O):个体所属的组织。
    • Organizational Unit (OU):组织内的部门或单位。
    • Locality (L):个体所在地的城市或地理位置。
    • State (ST):个体所在地的州或省份。
    • Country (C):个体所在地的国家代码。
  2. 公钥(Public Key):CSR包含了与证书请求者相关的公钥。这个公钥用于加密和数字签名。

  3. 扩展信息:除了主题信息和公钥,CSR还可以包含各种扩展信息,以指定证书的用途、有效期、密钥用途等。常见的扩展包括密钥用途扩展(Key Usage)、扩展密钥用途(Extended Key Usage)、基本约束(Basic Constraints)等。

  4. 签名算法:CSR也包含用于签署CSR的签名算法(通常是RSA或ECDSA)。

CSR 的生成

生成CSR通常包括以下步骤:

  1. 生成密钥对:首先,生成一个密钥对,其中包括公钥和私钥。通常使用RSA或ECDSA算法生成密钥。
  2. 创建主题信息:确定要包含在CSR中的主题信息。这些信息将在颁发证书时显示在证书上。
  3. 创建 CSR:使用上述的主题信息和生成的公钥创建CSR。CSR是一个包含上述信息的数据结构,可以在编程中生成,也可以使用CSR生成工具。
  4. 签署 CSR:通常,CSR需要使用私钥进行签名,以确保CSR的完整性。签名的结果包括CSR的签名部分。

提交 CSR

一旦CSR生成完成,它通常会被提交给证书颁发机构(CA)来获取数字证书。CA将对CSR进行验证,并根据验证结果签发相应的数字证书。验证通常涉及对主题信息的验证,确保申请者的身份合法性。

CSR 的应用

CSR通常用于以下场景:

  • HTTPS 证书申请:网站管理员通常会生成CSR并将其提交给CA,以获取HTTPS证书,以便在安全的HTTPS连接中使用。
  • 代码签名:开发者可以生成CSR,用于获取代码签名证书,以确保其代码在分发和执行时的完整性和真实性。
  • 身份验证:CSR也可用于生成客户端证书,用于SSL/TLS客户端身份验证,例如在虚拟专用网络(VPN)或企业网络中。

CSR是建立公共密钥基础设施(PKI)中的信任和安全通信的关键组成部分。通过创建并提交CSR,申请者可以获得数字证书,从而实现安全通信和身份验证。

示例代码

在Go中生成证书签发请求(Certificate Signing Request,CSR)以及通过CSR生成证书通常需要使用Go语言的crypto/x509crypto/x509/pkix包,以及私钥和公钥管理的包,比如crypto/rsa。以下是一个简单的示例,演示如何生成CSR并通过CSR生成自签名证书。

生成CSR:

首先,我们将生成CSR(Certificate Signing Request)。CSR包含了公钥、主题信息以及其他证书请求的相关信息。以下是一个示例代码:

package main

import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"crypto/x509/pkix"
"encoding/pem"
"fmt"
"os"
"time"
) func generateCSR() ([]byte, *rsa.PrivateKey, error) {
privKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return nil, nil, err
} subject := pkix.Name{
CommonName: "example.com",
Organization: []string{"My Organization"},
OrganizationalUnit: []string{"IT"},
Locality: []string{"City"},
Province: []string{"State"},
Country: []string{"US"},
} template := x509.CertificateRequest{
Subject: subject,
SignatureAlgorithm: x509.SHA256WithRSA,
} csrDER, err := x509.CreateCertificateRequest(rand.Reader, &template, privKey)
if err != nil {
return nil, nil, err
} csrPEM := pem.EncodeToMemory(&pem.Block{
Type: "CERTIFICATE REQUEST",
Bytes: csrDER,
}) return csrPEM, privKey, nil
} func main() {
csrPEM, privKey, err := generateCSR()
if err != nil {
fmt.Println("Error generating CSR:", err)
return
} csrFile, err := os.Create("example.csr")
if err != nil {
fmt.Println("Error creating CSR file:", err)
return
}
defer csrFile.Close()
csrFile.Write(csrPEM) // Optionally, you can save the private key
keyFile, err := os.Create("private.key")
if err != nil {
fmt.Println("Error creating private key file:", err)
return
}
defer keyFile.Close()
keyPEM := pem.EncodeToMemory(&pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(privKey),
})
keyFile.Write(keyPEM) fmt.Println("CSR and private key generated successfully.")
}

上述代码生成了一个自签名证书请求(CSR),其中包括了公钥、主题信息和签名算法等。私钥也被生成并保存到文件中。

生成自签名证书:

生成自签名证书的过程需要使用之前生成的CSR和私钥。以下是一个示例代码:

package main

import (
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
"os"
"time"
) func generateCertificate(csrFile, keyFile string) error {
// Read CSR
csrPEM, err := ioutil.ReadFile(csrFile)
if err != nil {
return err
} block, _ := pem.Decode(csrPEM)
if block == nil {
return fmt.Errorf("failed to parse PEM block containing the CSR")
} csr, err := x509.ParseCertificateRequest(block.Bytes)
if err != nil {
return err
} // Read private key
keyPEM, err := ioutil.ReadFile(keyFile)
if err != nil {
return err
} block, _ = pem.Decode(keyPEM)
if block == nil {
return fmt.Errorf("failed to parse PEM block containing the private key")
} key, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return err
} // Create a self-signed certificate
template := x509.Certificate{
SerialNumber: big.NewInt(1),
Subject: csr.Subject,
NotBefore: time.Now(),
NotAfter: time.Now().AddDate(1, 0, 0),
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
} derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &key.PublicKey, key)
if err != nil {
return err
} // Save the self-signed certificate to a file
certFile, err := os.Create("selfsigned.crt")
if err != nil {
return err
}
defer certFile.Close()
certPEM := pem.EncodeToMemory(&pem.Block{
Type: "CERTIFICATE",
Bytes: derBytes,
})
certFile.Write(certPEM) return nil
} func main() {
err := generateCertificate("example.csr", "private.key")
if err != nil {
fmt.Println("Error generating certificate:", err)
return
} fmt.Println("Self-signed certificate generated successfully.")
}

上述代码读取之前生成的CSR和私钥,然后使用这些信息创建了一个自签名证书。证书的有效期、密钥用途等信息可以根据需要进行调整。最后,它将生成的自签名证书保存到文件中。


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意


生成CSR和自签名证书的更多相关文章

  1. 自签名证书和私有CA签名的证书的区别 创建自签名证书 创建私有CA 证书类型 证书扩展名【转】

    自签名的证书无法被吊销,CA签名的证书可以被吊销 能不能吊销证书的区别在于,如果你的私钥被黑客获取,如果证书不能被吊销,则黑客可以伪装成你与用户进行通信   如果你的规划需要创建多个证书,那么使用私有 ...

  2. openssl实现自签名证书

    前言 证书的作用 加密通信数据,验证对象身份,保证数据完整性 什么是自签名证书 公认的证书往往都需要收费,如果客户端与服务端都是由我们自己来操控,那便可以使用自签名证书(说白了就是只是自己认可的证书) ...

  3. 自签名证书说明——自签名证书的Issuer和Subject是一样的。不安全的原因是:没有得到专业SSL证书颁发的机构的技术支持?比如使用不安全的1024位非对称密钥对,有效期设置很长等

    一般的数字证书产品的主题通常含有如下字段:公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,一般为网站域名:而对于代码签名证书则为申请单位名称:而对于客户端证书则为证书申请者 ...

  4. Nginx 配置 HTTPS自签名证书

    工具: OpenSSL ssl的开源实现,几乎实现了市面上所有的加密 libcrypto: 通用加密库, 任何软件要实现加密功能 链接调用这个库 libssl: TLS/SSL 加密库 openssl ...

  5. openssl生成自签名证书

    1.生成x509格式的CA自签名证书 openssl req -new -x509 -keyout ca.key -out ca.crt 2.生成服务端的私钥(key文件)及申请证书文件csr文件 o ...

  6. Linux下生成openssl自签名证书

    校验证书是否被 CA 证书签名,正确的情况: $ openssl verify -CAfile /etc/kubernetes/cert/ca.pem /etc/kubernetes/cert/kub ...

  7. 生成自签名证书-开启https

    1.生成CA证书 # 生成 CA 私钥 openssl genrsa -out ca.key 2048 # X.509 Certificate Signing Request (CSR) Manage ...

  8. linux下使用openssl生成 csr crt CA证书

    证书文件生成:一.服务器端1.生成服务器端    私钥(key文件);openssl genrsa -des3 -out server.key 1024运行时会提示输入密码,此密码用于加密key文件( ...

  9. cmd命令生成android签名证书

    cmd命令生成android签名证书,有空在写一篇eclipse导出带签名的apk,这里面包括生成新的签名.现在还是讲讲在cmd怎么操作生成签名证书. 1.dos下进入JDK的bin目录 运行如下命令 ...

  10. windows下使用makecert命令生成自签名证书

    1.makecert命令路径 C:\Program Files (x86)\Windows Kits\8.1\bin\x64 2.生成一个自签名证书 makecert -r -pe -n " ...

随机推荐

  1. JAVA获取字符串内的括号对;获取括号对的内容;按指定规则返回括号对位置;

    先看结果:处理字符串 "这个是一条测试用的字符串[ ( 5 ( 4( 3 [(1) (2)] ))(7))][(6)]" 结果 解决思路:参考正则表达式里面出入站部分 代码实现如下 ...

  2. [最长回文字符串]manacher马拉车

    manacher马拉车 https://www.luogu.com.cn/problem/P3805 闲言一下:花了一个中午终于把 manacher 给搞懂了.本文将以一个蒟蒻的身份来,来写写马拉车算 ...

  3. 【调制解调】PM 调相

    说明 学习数字信号处理算法时整理的学习笔记.同系列文章目录可见 <DSP 学习之路>目录,代码已上传到 Github - ModulationAndDemodulation.本篇介绍 PM ...

  4. 聊聊Spring注解@Transactional失效的那些事

    一.前言 emm,又又又踩坑啦.这次的需求主要是对逾期计算的需求任务进行优化,现有的计算任务运行时间太长了.简单描述下此次的问题:在项目中进行多个数据库执行操作时,我们期望的是将其整个封装成一个事务, ...

  5. 2023年郑州轻工业大学校赛邀请赛zxy

    第一次组队和大家去外校打比赛,真的是一次很棒的体验,尽管结果不尽人意,但总之收获颇丰,也认识到自身更多的不足. 本次比赛是三人一队,一台电脑,一分纸质试题,我们三人开始先从第一题开始,这题看起来还行, ...

  6. 使用Stable Diffusion制作AI数字人视频的简明教程

    基本方法 搞一张照片,搞一段语音,合成照片和语音,同时让照片中的人物动起来,特别是头.眼睛和嘴. 语音合成 语音合成的方法很多,也比较成熟了,大家可以选择自己方便的,直接录音也可以,只要能生成一个语音 ...

  7. 我真的想知道,AI框架跟计算图什么关系?PyTorch如何表达计算图?

    目前主流的深度学习框架都选择使用计算图来抽象神经网络计算表达,通过通用的数据结构(张量)来理解.表达和执行神经网络模型,通过计算图可以把 AI 系统化的问题形象地表示出来. 本节将会以AI概念落地的时 ...

  8. 2021-09-27 Core初步实战

    中间件Progarm的定义添加Logging public static IHostBuilder CreateHostBuilder(string[] args) => Host.Create ...

  9. 一文搞明白STM32芯片存储结构

    一.前言 本篇介绍STM32芯片的存储结构,ARM公司负责提供设计内核,而其他外设则为芯片商设计并使用,ARM收取其专利费用而不参与其他经济活动,半导体芯片厂商拿到内核授权后,根据产品需求,添加各类组 ...

  10. selenium报错:This version of ChromeDriver only supports Chrome version 109 Current browser version is 112.0.5615.49...解决办法

    前言:跟GPT交互,让其写一段代码,执行失败.经过排查验证,GPT写的代码没有问题,是本地环境问题. 执行报错: selenium.common.exceptions.SessionNotCreate ...