Files
article/私有CA.md
2025-07-29 10:59:12 +08:00

212 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### 一、安装CFSSL工具
CFSSLCloudFlare's PKI Toolkit是一个开源的PKI工具集可用于创建私有CA和证书。
1. **Linux/macOS**
```bash
# 下载cfssl和cfssljson工具
curl -o cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -o cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssl cfssljson
sudo mv cfssl cfssljson /usr/local/bin/
```
2. **Windows**
- 从 [CFSSL Releases](https://github.com/cloudflare/cfssl/releases) 下载对应版本的 `cfssl.exe``cfssljson.exe`
- 将可执行文件添加到系统PATH路径
### 二、创建私有CA
#### 1. 配置CA证书
创建一个名为 `ca-config.json` 的文件,定义证书的有效期和使用策略:
```json
{
"signing": {
"default": {
"expiry": "87600h" // 10年有效期
},
"profiles": {
"server": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "server auth"]
},
"client": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "client auth"]
},
"peer": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "server auth", "client auth"]
}
}
}
}
```
#### 2. 创建CA证书签名请求(CSR)配置
创建 `ca-csr.json` 文件:
```json
{
"CN": "My Private CA",
"key": {
"algo": "rsa",
"size": 4096
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "My Organization",
"OU": "IT Department"
}
],
"ca": {
"expiry": "87600h" // CA证书有效期10年
}
}
```
#### 3. 生成CA证书和私钥
执行以下命令生成自签名CA证书
```bash
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
```
这将生成三个文件:
- `ca.pem`CA公钥证书
- `ca-key.pem`CA私钥妥善保管不要泄露
- `ca.csr`CA证书签名请求
### 三、使用CA签署服务器证书
#### 1. 创建服务器证书CSR配置
创建 `server-csr.json` 文件:
```json
{
"CN": "server.example.com",
"hosts": [
"server.example.com",
"192.168.1.100",
"localhost",
"127.0.0.1"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "My Organization",
"OU": "IT Department"
}
]
}
```
> 注意:`hosts` 字段必须包含服务器的域名、IP地址以及任何需要访问的别名
#### 2. 生成服务器证书和私钥
使用CA直接签署服务器证书
```bash
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=server \
server-csr.json | cfssljson -bare server
```
这将生成:
- `server.pem`:服务器公钥证书
- `server-key.pem`:服务器私钥
### 四、使用CA签署客户端证书
#### 1. 创建客户端证书CSR配置
创建 `client-csr.json` 文件:
```json
{
"CN": "client.example.com",
"hosts": [], // 客户端证书通常不需要指定hosts
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "My Organization",
"OU": "IT Department"
}
]
}
```
#### 2. 生成客户端证书和私钥
```bash
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=client \
client-csr.json | cfssljson -bare client
```
这将生成:
- `client.pem`:客户端公钥证书
- `client-key.pem`:客户端私钥
### 五、证书验证
#### 1. 验证服务器证书
```bash
openssl verify -CAfile ca.pem server.pem
```
如果输出 `server.pem: OK`,则证书有效
#### 2. 验证客户端证书
```bash
openssl verify -CAfile ca.pem client.pem
```
### 六、证书使用示例
#### 1. 在HTTPS服务器中使用
`server.pem``server-key.pem` 配置到你的Web服务器如Nginx、Apache
```nginx
server {
listen 443 ssl;
server_name server.example.com;
ssl_certificate /path/to/server.pem;
ssl_certificate_key /path/to/server-key.pem;
ssl_client_certificate /path/to/ca.pem; # 客户端证书验证(可选)
ssl_verify_client on; # 启用客户端证书验证(可选)
# 其他配置...
}
```
#### 2. 在客户端应用中使用
在需要验证服务器证书的客户端应用中,导入 `ca.pem` 作为信任的根证书。例如使用curl访问HTTPS服务器
```bash
curl --cacert ca.pem https://server.example.com
```
### 七、安全注意事项
1. **私钥保护**
- `ca-key.pem``server-key.pem``client-key.pem` 是敏感文件,应存储在安全位置
- 限制访问权限:`chmod 400 *.key.pem`
2. **证书备份**
- 定期备份CA证书和私钥
- 考虑使用硬件安全模块(HSM)存储CA私钥
3. **证书撤销**
- 如需撤销证书可使用CFSSL生成证书撤销列表(CRL)
- 更新 `ca-config.json` 添加CRL配置
通过以上步骤你已成功创建了一个有效期10年的私有CA并使用它签署了服务器和客户端证书。