跳转至

密钥-证书

密钥生成

ssh-keygen -t [rsa/ecdsa/ed25519] -f [path] -C "comment"

​ 建议使用ed25519, 方便还安全

证书生成

几个概念和文件解释

  • 文件
  • .key: 私钥
  • .csr: 证书签名请求, 用私钥签名得到的文件
  • .crt: CA认证后的文件
  • .crl: 证书吊销列表
  • .pem; 导出导入证书用的格式, .crt+.key, 使用base64存储

  • 根证书和用户证书: 根证书是信任链顶级, 用户证书是根证书签发的

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

  • .x509: 证书格式标准

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

自签名证书

https://zhuanlan.zhihu.com/p/449484785

  • 根证书生成
# 生成私钥
openssl genrsa -out ca.key 2048

# 生成证书签名请求, 会要求输入各种信息, 国家地址等, 也可以留空默认
openssl req -new -key ca.key -out ca.csr

# 生成自签名证书
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
  • 用户证书生成(签发证书)
# 用户私钥
openssl genrsa -out server.key 2048

# 用户证书签名请求, 跟上面一样
# 注意国家名必须和上面一致, 且Common Name需要有
# Common Name对于服务器来说是域名, 不过现代并不完全依赖这个字段验证
openssl req -new -key server.key -out server.csr

# 用刚刚的ca签发
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

​ 理论上来说ca根证书也能用作https, 不过这不是最佳实践

​ 在执行第三条命令可能会报错, 是因为CA需要一个目录存储生成的文件和记录证书, 需要三个文件和目录:

 ./demoCA/newcerts
 ./demoCA/index.txt
 ./demoCA/serial

# 执行:
mkdir -p ./demoCA/newcerts
touch ./demoCA/index.txt
echo 1000 > ./demoCA/serial

​ 其中第一个是目录, 用于存储

​ index.txt 是CA数据库, 跟踪所有已发证书的状态

​ serial文件是证书序列号(ID), 一个数字(如1000)

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 # 查看续订