Skip to content

证书签发与自签名证书

约 1513 字大约 5 分钟

计算机技术

2025-04-19

证书签发与自签名证书

密钥生成

一般是ssh/github/WireGuard使用,生成一对公私钥
ssh-keygen -t [rsa/ecdsa/ed25519] -f [path] -C "comment"
目前RSA不建议使用,又长还不安全,建议使用ed25519,

证书生成

几个概念和文件解释

  • 文件

    1. .key: 证书对应的私钥文件
    2. .crt: CA认证后的文件,即证书
    3. .csr: 证书签名请求, 用私钥签名得到的文件
    4. .crl: 证书吊销列表
    5. .pem; 导出导入证书用的格式, .crt+.key, 使用base64存储
  • 根证书和用户证书: 根证书是信任链顶级, 用户证书是根证书签发的

    对于自签证书, 只要根证书是有效的(安装在电脑上), 则由它签发的用户证书就是可信的

  • .x509: 证书格式标准

    生成证书有两种, 自签名和CA签发, 只有CA签发的才有https锁标志, 但是加密功能来说两者等效

自签名证书

下面讲解如何生成自己的证书

根证书生成

首先需要一个根证书,我们自己就是CA
  • 创建工作目录
mkdir -p ./myca/{certs,crl,newcerts,private}
cd myca
touch index.txt
echo 1000 > serial
chmod 700 private
目录应该是这样的
.
├── certs # 证书位置
├── crl # 吊销列表
├── index.txt # 证书目录
├── newcerts # 新证书
├── private # 私钥
└── serial # 自增的index
  • 准备OpenSSL文件(openssl.cnf)
  • 生成根CA私钥
# 签发证书
openssl genrsa -out private/ca.key.pem 4096
# 用ED25519,上面默认RSA
openssl genpkey -algorithm Ed25519 -out private/ca.key.pem
chmod 400 private/ca.key.pem
  • 签发根 CA 证书
openssl req -config openssl.cnf \
  -key private/ca.key.pem \
  -new -x509 -days 3650 -sha256 \
  -extensions v3_ca \
  -out certs/ca.cert.pem
chmod 444 certs/ca.cert.pem
  • 验证
openssl x509 -in certs/ca.cert.pem -noout -text
结果
最终我们得到了
.
├── certs
│   └── ca.cert.pem # CA证书
├── crl
├── index.txt
├── newcerts
├── openssl.cnf
├── private
│   └── ca.key.pem # CA私钥
└── serial

用户证书签发

上面已经有了 CA 和私钥,下面讲解如何签发自己的证书

生成用户的私钥,其实和CA生成私钥是一样的,私钥并不分是否是CA

总之需要一个私钥
openssl genpkey -algorithm Ed25519 -out nolan.key.pem
chmod 400 nolan.key.pem
生成CSR,也就是提交给CA的证书签名请求,通过私钥获取到证书
openssl req -new -key nolan.key.pem -out nolan.csr.pem
这一步需要调整`openssl.cnf`​,末尾添加 user_crt 相关配置
[ usr_cert ]
# 普通用户证书,非 CA
basicConstraints        = critical, CA:FALSE
# 标识这个证书用作客户端认证
keyUsage                = critical, digitalSignature, keyEncipherment
extendedKeyUsage        = clientAuth
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid,issuer
  • 签发证书
# -extensions usr_cert 就指定了刚刚的配置
openssl ca -config openssl.cnf \
  -extensions usr_cert \
  -days 3650 \
  -notext \
  -md sha256 \
  -in nolan.csr.pem \
  -out certs/nolan.cert.pem
  • 验证
openssl x509 -in certs/nolan.cert.pem -noout -text
结果

Let's Encrypt 申请

certbot方法

# 安装certbot ACME
sudo apt-get install certbot

# 验证域名所有权, 并获取证书, 不过需要确保80和443没有占用
sudo certbot certonly --standalone

​ Let's Encrypt证书有效期一般只有90天, 需要续订

​ certbot一般会自动设置定时任务自动续订证书, 也可以用下面的命令测试

sudo certbot renew --dry-run # 查看续订(dry-run)

OpenSSL常用命令

  • 解析 pem 证书
openssl x509 -in cert.pem -noout -text
  • 验证证书链
openssl verify -CAfile ca-chain.pem cert.pem
  • 检查服务器证书
openssl s_client -connect axi.moe:443 \
  -servername axi.moe -showcerts </dev/null \
  2>/dev/null | openssl x509 -noout -text
  • DEBUG 用,Serve AS TLS
openssl s_server -key key.pem -cert cert.pem -accept 8443