---
title: 证书签发
description: "1. CA服务器搭建。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200SPC2/accel/kunpengaccel_haf_06_0028.html
sourcePath: /source/zh/kunpengboostkithistory/2200SPC2/accel/kunpengaccel_haf_06_0028.html
indexId: 56dad839a8158b57aba165687457e7ad48fdfda1be54fb7efd4eeb2df7267aa278
---
# 证书签发

1. CA服务器搭建。

  a. 选择一台服务器作为根证书服务器，并进行CA签发证书目录环境准备。

```
mkdir -p /home/ca_server
cd /home/ca_server/
mkdir demoCA
cp /etc/pki/tls/openssl.cnf ./
mkdir ./demoCA/newcerts  ./demoCA/private ./demoCA/certs
chmod 777 ./demoCA/private/
echo 01 > ./demoCA/serial
touch ./demoCA/index.txt
```


  b. 修改openssl.cnf文件中CA_default选项中的dir目录为CA服务器的目录。

    1. 将dir设置为“/home/ca_server/demoCA/”。

```
vi openssl.cnf
```


    2. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  c. 生成CA私钥和根证书，证书有效期建议选择为30年，例如-days 10950。

```
openssl genrsa  -out ca.key 3072
openssl req -new -x509 -days 10950 -sha1 -extensions v3_ca  -key ca.key  -out ca.crt   -subj "/C=CN/ST=shenzhen/L=shenzhen/O=Huawei/OU=Huawei/CN=CA1"  -config ./openssl.cnf
cp ca.key demoCA/private/cakey.pem
cp ca.crt demoCA/cacert.pem
```


  d. 确认CA证书，观察是否为CA:TRUE。

```
openssl x509 -in ca.crt -noout -text
```


2. 证书签发。
执行完导出证书请求文件后，会将节点的证书请求文件传输到远端CA服务器对应的签发路径下。前缀为导出证书请求文件的MAC地址。
MAC地址的获取方式为：ifconfig | grep ether | awk 'NR==1' | awk '{print $2}' ，如68:4x:xx:xx:xx:aa，mac_address为该结果删除:后的字符串。

```
[root@agent3]# ll /home/ca_server/
total 32K
-rw------- 1 root root 1.5K Nov 17 09:07 844xxxxxxxbbtarget.csr
-rw-r--r-- 1 root root 1.7K Nov 17 10:24 ca.crt
-rw------- 1 root root 2.5K Nov 17 10:24 ca.key
drwxr-xr-x 5 root root 4.0K Nov 17 15:32 demoCA
-rw-r--r-- 1 root root  11K Nov 17 10:23 openssl.cnf
```


  - 手动签发
    在CA服务器证书签发路径下，执行证书签名的命令如下，分别签发haf_user和daemon的证书：

```
openssl ca -policy policy_anything  -extensions v3_req -out 844xxxxxxxbbtarget.crt  -config openssl.cnf -days 10950 -cert ca.crt -keyfile ca.key -infiles 84xxxxxxx2bbtarget.csr
```


**表1 openssl证书签发命令参数**

| 选项 | 取值 |
| --- | --- |
| \-out | 输出的证书文件。 说明： 该证书文件名的前缀必须与输出的证书请求文件一致。 |
| \-config | 配置文件。 |
| \-days | 证书有效期，单位：天。 |
| \-cert | 用于签发的根CA证书。 说明： 该证书的名字需命名为ca.crt，用于后续导入步骤使用。 |
| \-keyfile | CA的私钥证书文件。 |
| \-infiles | 需要进行处理的证书请求文件。 说明： 该证书对应步骤中导出的证书请求文件，命名需保持一致。 |


  - 自动签发
可通过脚本的方式实现证书的自动签发，主要功能和参考实现如下：

    a. 实时监测证书产生目录下是否有新产生的csr文件。
    b. 有新的csr就对其进行签发，并在当前目录下产生相同前缀的.crt文件。如service.csr，则对应的crt为service.crt。证书有效期建议选择为30年，例如-days 10950。

```
#监测目录下是否有新产生的csr文件，并进行签名
cert_path=/home/ca_server/
inotifywait -m -e create "${cert_path}"| while read path action file
do
if [[ "$file" =
~
.*csr$ ]]; then # Does the file end with .csr?
echo "Find new csr file "
cert_name=$path$file
echo ${cert_name}
prefix_name="${cert_name%.*}"
echo ${prefix_name}
cd ${cert_path}
openssl ca -batch -policy policy_anything -extensions v3_req  -out $prefix_name.crt -days 10950 -config ${cert_path}/openssl.cnf -cert ${cert_path}/ca.crt -keyfile ${cert_path}/ca.key -infiles ${cert_name}
rm -rf ${cert_name}
fi
echo "End"
done
```


    c. 若启动上述证书自动签发脚本，则导出后，可以直接在证书签发路径下获取到签发后的证书。CA服务器上相应的证书请求文件会自动被删除。

```
[root@ca_server]# ll /home/ca_server/
total 40K
-rw-r--r-- 1 root root 5.6K Nov 17 15:44 8446fe73b2bbtarget.crt
-rw-r--r-- 1 root root 1.7K Nov 17 10:24 ca.crt
-rw------- 1 root root 2.5K Nov 17 10:24 ca.key
drwxr-xr-x 5 root root 4.0K Nov 17 15:44 demoCA
-rw-r--r-- 1 root root  11K Nov 17 10:23 openssl.cnf
```
