kaisawind's blog
  • 关于
  • 所有帖子

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

最佳实践

  1. 证书管理:

    • 使用版本控制管理证书文件
    • 定期检查证书有效期
    • 建立证书更新流程
    • 备份所有证书和私钥
  2. 安全措施:

    • 保护私钥安全,使用严格权限
    • 不要在版本控制中提交私钥
    • 使用加密存储敏感信息
    • 定期轮换证书
  3. 部署流程:

    • 在测试环境验证证书
    • 使用自动化脚本部署
    • 记录证书变更历史
    • 建立回滚机制
  4. 监控告警:

    • 设置证书过期告警
    • 监控证书使用情况
    • 记录证书验证日志
    • 定期审计证书列表

相关资源

  • 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/


辽ICP备2021007608号 | © 2026 | kaisawind

Facebook Twitter GitHub