密钥-证书
密钥生成
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 # 查看续订