自签证书的相关问题

证书中可能遇到的问题

域名管理服务器的配置问题

主机申请证书时,需要连接到域名管理服务器,比如 Cloudflare。
因为申请证书,代表你现在没有证书,所以肯定是走 http 协议的。所以你的域名服务器必须能够接受 http 响应。
在 cloudflare 中,需要你将域名 A 记录的解析中,代理状态从橘色改成灰色, 仅 DNS
。再把 SSL/TLS严格 改成 灵活
等证书申请完,再改回来。

acme 申请证书时的报错

问题:missing fullchain.cer

申请证书时需要用到服务器 80443 端口,检查是否开放:

# 查看服务器端口情况
sudo ufw status verbose

打开端口

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

查看是否生效,没有生效则重启服务

# 查看是否生效
sudo ufw status verbose

# 重启服务
sudo ufw disable
sudo ufw enable

使用 acme 脚本的自签流程

方法一:使用 acme 脚本申请

申请证书

安装证书所需的包:

sudo apt install socat -y 
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

申请证书和安装证书:

~/.acme.sh/acme.sh --issue -d gtoxai.com --standalone -k ec-256 --force --insecure

~/.acme.sh/acme.sh --install-cert -d gtoxai.com \
    --key-file /root/certs/gtoxai.com.key \
    --fullchain-file /root/certs/fullchain.cer

其它证书申请方案(可选)

如果上面申请证书失败,可以再次尝试下面两种方法。

申请证书方式 2:

~/.acme.sh/acme.sh --register-account -m "mail.gtoxai.com" --server buypass --force --insecure && ~/.acme.sh/acme.sh  --issue -d gtoxai.com --standalone -k ec-256 --force --insecure --server buypass

申请证书方式 3:

~/.acme.sh/acme.sh --register-account -m "${RANDOM}@chacuo.net" --server zerossl --force --insecure && ~/.acme.sh/acme.sh  --issue -d gtoxai.com --standalone -k ec-256 --force --insecure --server zerossl

使用 Docker 创建和管理自签证书

可以使用一个 Docker 容器来完成证书的生成和管理。一个常用的工具是 certbot,但它主要用于 Let's Encrypt 的证书。对于自签证书,可以创建一个自定义的 Docker 镜像来使用 OpenSSL。

创建流程

1. 创建生成证书的脚本

创建一个名为 generate-cert.sh 的脚本:

#!/bin/bash

# 设置证书的参数
DOMAIN="gtoxai.com"
DAYS=365

# 创建工作目录
mkdir -p /root/cert

# 生成私钥
openssl genpkey -algorithm RSA -out /root/cert/$DOMAIN.key

# 生成CSR
openssl req -new -key /root/cert/$DOMAIN.key -out /root/cert/$DOMAIN.csr -subj "/C=US/ST=State/L=City/O=Organization/OU=Department/CN=$DOMAIN"

# 生成自签证书
openssl x509 -req -days $DAYS -in /root/cert/$DOMAIN.csr -signkey /root/cert/$DOMAIN.key -out /root/cert/$DOMAIN.crt

2. 创建 Dockerfile

首先,创建一个 Dockerfile:

# 使用官方的Debian镜像
FROM debian:latest

# 安装OpenSSL
RUN apt-get update && apt-get install -y openssl

# 创建脚本生成自签证书
COPY generate-cert.sh /usr/local/bin/generate-cert.sh
RUN chmod +x /usr/local/bin/generate-cert.sh

# 设置工作目录
WORKDIR /cert

# 运行脚本生成证书
CMD ["/usr/local/bin/generate-cert.sh"]

3. 构建和运行 Docker 容器

构建 Docker 镜像:

docker build -t cert-gen .

运行 Docker 容器以生成证书:

docker run --rm -v /root/cert:/root/cert cert-gen

这样,生成的自签证书 (.crt 文件) 和私钥 (.key 文件) 将会存储在当前目录的 cert 文件夹中。

管理和更新证书

管理和更新证书可以通过定期运行上述 Docker 容器来完成。你可以设置一个定时任务(如 cron job)来自动生成新的证书。

例如,编辑 cron job:

crontab -e

添加以下行来每月运行一次证书生成脚本:

0 0 1 * * docker run --rm -v /root/cert:/root/cert cert-gen

检查 cron job 是否生效

可以通过以下命令查看已添加的 cron job:

crontab -l

确保输出中包含你刚刚添加的行:
0 0 1 * * docker run --rm -v /root/cert:/root/cert cert-gen

测试 Docker 容器

为了确保一切正常工作,可以手动运行一次 Docker 容器:

docker run --rm -v /root/cert:/root/cert cert-gen

运行后,你可以检查 /root/cert 目录下是否生成了新的证书文件和私钥文件。

通过以上步骤,你可以确保每月自动更新自签证书的有效期,从而保持系统安全。

证书申请的过程(原理)

1. 安装 OpenSSL

首先,确保你已经安装了 OpenSSL:

sudo apt update
sudo apt install openssl

2. 创建私钥和证书签名请求 (CSR)

生成一个私钥(KEY):
可以使用 RSA 算法,也可以使用 ec-256 算法

openssl genpkey -algorithm RSA -out mydomain.key

生成一个证书签名请求 (CSR):

openssl req -new -key mydomain.key -out mydomain.csr

在生成 CSR 时,你会被提示输入一些信息,如国家、州、市、组织等。

3. 创建自签证书(CRT)

使用私钥(KEY)和 证书签名请求(CSR) 生成自签证书(CRT):

openssl x509 -req -days 365 -in mydomain.csr -signkey mydomain.key -out mydomain.crt

这样,你就生成了一个有效期为 365 天的自签证书。