ubuntu安装根证书 - Wed, Aug 10, 2022
ubuntu安装根证书
ubuntu安装根证书
在 Ubuntu 系统中,安装自定义根证书对于企业内部网络、自签名证书或特定安全环境非常重要。本文详细介绍如何在 Ubuntu 系统中正确安装和管理根证书。
提示: Linux发行版更新较快,命令可能因版本不同而有差异。
证书基础知识
什么是根证书
根证书是信任链的起点,由受信任的证书颁发机构(CA)签署。系统默认信任的根证书存储在特定目录中,用于验证其他证书的有效性。
Ubuntu 证书存储位置
Ubuntu 系统中证书的主要存储位置:
/usr/share/ca-certificates/: 系统级证书(只读)/usr/local/share/ca-certificates/: 本地证书(推荐)/etc/ssl/certs/: SSL 证书(系统使用)/etc/ssl/private/: 私钥目录(需要严格权限)
证书格式
常见的证书格式:
.crt: 证书文件.pem: PEM 编码证书.der: DER 编码证书.p12/.pfx: PKCS#12 格式(包含证书和私钥)
基本安装方法
方法一:使用 ca-certificates 包
# 1. 确保安装 ca-certificates
apt-get update
apt-get install -y ca-certificates
# 2. 复制证书到本地目录
cp local-ca.crt /usr/local/share/ca-certificates/
# 3. 更新证书数据库
update-ca-certificates
# 4. 验证安装
ls /etc/ssl/certs/ | grep local-ca
方法二:使用 dpkg-reconfigure
# 1. 复制证书到系统目录
cp local-ca.crt /usr/share/ca-certificates/
# 2. 更新证书数据库并重新配置
update-ca-certificates --fresh
dpkg-reconfigure ca-certificates
# 在交互界面中,选择你的证书
方法三:直接安装到系统证书目录
# 1. 复制证书到 /etc/ssl/certs/
cp local-ca.crt /etc/ssl/certs/
# 2. 创建符号链接
ln -s /etc/ssl/certs/local-ca.crt /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/local-ca.crt).0
# 3. 重新加载证书
update-ca-certificates
详细操作步骤
准备证书文件
# 1. 检查证书格式
file local-ca.crt
# 应该输出: PEM certificate 或 ASCII text
# 2. 查看证书内容
openssl x509 -in local-ca.crt -text -noout
# 3. 验证证书有效性
openssl x509 -in local-ca.crt -noout -dates
# 输出:
# notBefore=Jan 1 00:00:00 2020 GMT
# notAfter=Dec 31 23:59:59 2030 GMT
安装多个证书
#!/bin/bash
# 批量安装证书
CERT_DIR="/usr/local/share/ca-certificates"
# 创建目录(如果不存在)
sudo mkdir -p $CERT_DIR
# 安装所有 .crt 文件
for cert in *.crt; do
echo "安装 $cert..."
sudo cp "$cert" $CERT_DIR/
done
# 更新证书数据库
sudo update-ca-certificates
# 验证
echo "已安装的证书:"
ls -la $CERT_DIR/
安装 PEM 格式证书
# 1. 确保证书格式正确
openssl x509 -in cert.pem -outform der -out cert.crt
# 2. 安装
sudo cp cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# 或者直接安装 PEM 文件
sudo cp cert.pem /usr/local/share/ca-certificates/cert.crt
sudo update-ca-certificates
安装 DER 格式证书
# 1. 转换 DER 到 PEM
openssl x509 -inform der -in cert.der -out cert.pem
# 2. 安装
sudo cp cert.pem /usr/local/share/ca-certificates/cert.crt
sudo update-ca-certificates
不同应用场景
1. Web 服务器
# 为 Apache 安装 CA 证书
sudo cp local-ca.crt /etc/ssl/certs/
sudo cp local-ca.crt /etc/apache2/ssl/
sudo service apache2 reload
# 为 Nginx 安装 CA 证书
sudo cp local-ca.crt /etc/nginx/ssl/
sudo nginx -t
sudo service nginx reload
2. Git
# 配置 Git 使用自定义证书
git config --global http.sslCAInfo /etc/ssl/certs/local-ca.crt
# 或禁用 SSL 验证(不推荐,仅用于测试)
git config --global http.sslVerify false
3. Docker
# 为 Docker 守护进程配置证书
sudo mkdir -p /etc/docker/certs.d/myregistry.local
sudo cp local-ca.crt /etc/docker/certs.d/myregistry.local/ca.crt
sudo systemctl restart docker
# 为 Docker 客户端配置证书
mkdir -p ~/.docker/certs.d
cp local-ca.crt ~/.docker/certs.d/ca.crt
export DOCKER_TLS_VERIFY=1
4. Python
# 为 Python 配置证书
sudo cp local-ca.crt /usr/local/lib/python3.x/site-packages/certifi/cacert.pem
# 或者
export SSL_CERT_FILE=/etc/ssl/certs/local-ca.crt
5. curl
# 测试证书
curl --cacert /etc/ssl/certs/local-ca.crt https://example.com
# 临时禁用证书验证(仅用于测试)
curl -k https://example.com
6. wget
# 使用自定义证书
wget --ca-certificate=/etc/ssl/certs/local-ca.crt https://example.com
# 或在 ~/.wgetrc 中配置
echo "ca_certificate=/etc/ssl/certs/local-ca.crt" >> ~/.wgetrc
高级管理
创建自签名根证书
#!/bin/bash
# 创建自签名根证书
# 1. 生成私钥
openssl genrsa -out ca.key 4096
# 2. 创建配置文件
cat > ca.conf <<EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[req_distinguished_name]
C = CN
ST = Beijing
L = Beijing
O = My Organization
OU = IT Department
CN = My Root CA
[v3_ca]
basicConstraints = critical,CA:TRUE
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
EOF
# 3. 生成根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -config ca.conf
# 4. 验证证书
openssl x509 -in ca.crt -text -noout
# 5. 安装
sudo cp ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
签发子证书
#!/bin/bash
# 使用根证书签发子证书
# 1. 生成服务器私钥
openssl genrsa -out server.key 2048
# 2. 创建证书签名请求(CSR)
cat > server.conf <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = Beijing
L = Beijing
O = My Organization
OU = IT Department
CN = server.example.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = server.example.com
DNS.2 = *.example.com
IP.1 = 192.168.1.100
EOF
openssl req -new -key server.key -out server.csr -config server.conf
# 3. 使用根证书签发
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile server.conf -extensions v3_req
# 4. 验证证书链
openssl verify -CAfile ca.crt server.crt
批量管理证书
#!/bin/bash
# 证书管理脚本
CERT_DIR="/usr/local/share/ca-certificates"
# 列出所有证书
list_certs() {
echo "已安装的证书:"
ls -la $CERT_DIR/
}
# 安装证书
install_cert() {
local cert_file=$1
if [ -f "$cert_file" ]; then
sudo cp "$cert_file" $CERT_DIR/
sudo update-ca-certificates
echo "证书 $cert_file 已安装"
else
echo "错误: 文件不存在: $cert_file"
exit 1
fi
}
# 删除证书
remove_cert() {
local cert_name=$1
if [ -f "$CERT_DIR/$cert_name" ]; then
sudo rm "$CERT_DIR/$cert_name"
sudo update-ca-certificates --fresh
echo "证书 $cert_name 已删除"
else
echo "错误: 证书不存在: $cert_name"
exit 1
fi
}
# 验证证书
verify_cert() {
local cert_file=$1
openssl x509 -in "$cert_file" -text -noout
openssl x509 -in "$cert_file" -checkend 0
if [ $? -eq 0 ]; then
echo "证书有效"
else
echo "证书已过期或无效"
fi
}
# 主函数
case $1 in
list)
list_certs
;;
install)
install_cert $2
;;
remove)
remove_cert $2
;;
verify)
verify_cert $2
;;
*)
echo "用法: $0 {list|install|remove|verify} [文件名]"
exit 1
;;
esac
常见问题和解决方案
1. 证书未生效
问题: 安装证书后应用仍然报错
解决方案:
# 1. 检查证书是否正确安装
ls -la /etc/ssl/certs/ | grep your-cert
# 2. 检查证书格式
file /etc/ssl/certs/your-cert.crt
# 3. 查看证书详细信息
openssl x509 -in /etc/ssl/certs/your-cert.crt -text -noout
# 4. 重新加载证书数据库
sudo update-ca-certificates --fresh
# 5. 重启相关服务
sudo systemctl restart docker
sudo systemctl restart apache2
2. 证书过期
问题: 证书已过期,需要更新
解决方案:
# 1. 检查证书有效期
openssl x509 -in /etc/ssl/certs/your-cert.crt -noout -dates
# 2. 生成新证书
# (参考上面的创建自签名证书部分)
# 3. 删除旧证书
sudo rm /etc/ssl/certs/your-cert.crt
sudo rm /usr/local/share/ca-certificates/your-cert.crt
# 4. 安装新证书
sudo cp new-cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
3. 证书链不完整
问题: 需要安装完整的证书链
解决方案:
# 1. 合并证书链
cat root-ca.crt intermediate-ca.crt server.crt > full-chain.crt
# 2. 安装完整链
sudo cp full-chain.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# 3. 验证证书链
openssl verify -CAfile /etc/ssl/certs/root-ca.crt /usr/local/share/ca-certificates/full-chain.crt
4. 权限问题
问题: 证书文件权限不正确
解决方案:
# 1. 设置正确的权限
sudo chmod 644 /usr/local/share/ca-certificates/your-cert.crt
# 2. 确保所有者为 root
sudo chown root:root /usr/local/share/ca-certificates/your-cert.crt
# 3. 对于私钥,设置更严格的权限
sudo chmod 600 /etc/ssl/private/your-key.key
sudo chown root:root /etc/ssl/private/your-key.key
5. 应用无法识别证书
问题: 特定应用无法识别系统证书
解决方案:
# Java 应用
sudo keytool -import -trustcacerts -alias my-ca -file /etc/ssl/certs/your-cert.crt -keystore $JAVA_HOME/jre/lib/security/cacerts
# Python 应用
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/your-cert.crt
# Node.js 应用
export NODE_EXTRA_CA_CERTS=/etc/ssl/certs/your-cert.crt
监控和维护
自动检查证书过期
#!/bin/bash
# 检查证书过期状态
CERT_DIR="/usr/local/share/ca-certificates"
ALERT_DAYS=30
check_cert_expiry() {
local cert=$1
local days=$(openssl x509 -in "$cert" -noout -checkend $((ALERT_DAYS * 86400)))
if [ $? -eq 1 ]; then
local expiry_date=$(openssl x509 -in "$cert" -noout -enddate | cut -d= -f2)
echo "警告: 证书 $cert 将在 $expiry_date 过期"
return 1
else
echo "正常: 证书 $cert 有效"
return 0
fi
}
# 检查所有证书
for cert in $CERT_DIR/*.crt; do
check_cert_expiry "$cert"
done
证书备份和恢复
#!/bin/bash
# 备份所有证书
BACKUP_DIR="/backup/certs/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份系统证书
sudo cp -r /usr/local/share/ca-certificates/* $BACKUP_DIR/
sudo cp -r /etc/ssl/certs/* $BACKUP_DIR/
# 创建备份索引
sudo ls -la $BACKUP_DIR/ > $BACKUP_DIR/index.txt
echo "证书已备份到: $BACKUP_DIR"
# 恢复
# sudo cp $BACKUP_DIR/* /usr/local/share/ca-certificates/
# sudo update-ca-certificates
最佳实践
证书管理:
- 使用版本控制管理证书文件
- 定期检查证书有效期
- 建立证书更新流程
- 备份所有证书和私钥
安全措施:
- 保护私钥安全,使用严格权限
- 不要在版本控制中提交私钥
- 使用加密存储敏感信息
- 定期轮换证书
部署流程:
- 在测试环境验证证书
- 使用自动化脚本部署
- 记录证书变更历史
- 建立回滚机制
监控告警:
- 设置证书过期告警
- 监控证书使用情况
- 记录证书验证日志
- 定期审计证书列表
相关资源
- OpenSSL 文档: https://www.openssl.org/docs/
- Ubuntu 安全文档: https://help.ubuntu.com/stable/serverguide/certificates-and-security.html
- 证书最佳实践: https://letsencrypt.org/docs/certificates-for-localhost/
- Mozilla SSL 配置生成器: https://ssl-config.mozilla.org/