TypechoJoeTheme

安逸

统计
登录
用户名
密码

生成本地测试用的root CA证书

2021-12-15
/
0 评论
/
2,280 阅读
/
正在检测是否收录...
12/15

根CA配置
创建目录结构,以及生成秘钥与根证书文件

mkdir -p /etc/pki/tls
mkdir -p /etc/pki/CA
mkdir -p /etc/pki/CA/private
mkdir -p /etc/pki/CA/newcerts
touch /etc/pki/CA/index.txt  #生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial #指定第一个颁发证书的序列号

根CA自签名证书,根CA是最顶级的认证机构,没有人能够认证他,所以只能自己认证自己生成自签名证书。
该证书需要安装到最终用户终端,这样最终用户对该CA根以及相关子证书才能信任

生成证书的参数:
-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书
-key: 生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
-subj: 获取证书的终端所在的国家(C),省(ST),组织(O),计算机名(CN)

openssl genrsa -out /etc/pki/CA/private/cakey.pem 8192 #生成CA秘钥,8192是秘钥位数
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem -subj /C=CN/ST=GD/O=LINZ/CN=RootCA #根据秘钥生成证书
openssl x509 -outform der -in /etc/pki/CA/cacert.pem -out /etc/pki/CA/cacert.crt #转Windows支持的格式

如果生成证书成功,可以用这个命令查看证书信息:

openssl x509 -noout -text -in /etc/pki/CA/cacert.pem
如果要把证书给windows系统,需要导出为windows格式.
linux下的证书格式和windows格式是不同的,需要进行转换,转换完成后,把crt文件,用你能想到的方式复制到windows设备双击即可安装.
具体区别,请看这
Win10似乎也支持PEM格式的证书,改个后缀即可安装.
Windows安装时应安装到"受信任的根证书颁发机构"

写配置文件

vim /usr/lib/ssl/openssl.cnf

其中有个CA_default段落,将内容改为如下:

[ CA_default ]
dir             = /etc/pki/CA           # CA的默认工作目录
certs           = $dir/certs            # 认证证书的目录
crl_dir         = $dir/crl              # 证书吊销列表的路径
database        = $dir/index.txt        # 数据库的索引文件
new_certs_dir   = $dir/newcerts         # 新颁发证书的默认路径
certificate     = $dir/cacert.pem       # 此服务认证证书,如果此服务器为根CA那么这里为自颁发证书
serial          = $dir/serial           # 下一个证书的证书编号
crlnumber       = $dir/crlnumber        # 下一个吊销的证书编号
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# CA的私钥
RANDFILE        = $dir/private/.rand    # 随机数文件
x509_extensions = usr_cert              # The extentions to add to the cert
name_opt        = ca_default            # 命名方式,以ca_default定义为准
cert_opt        = ca_default            # 证书参数,以ca_default定义为准
default_days    = 365                   # 证书默认有效期
default_crl_days= 30                    # CRl的有效期
default_md      = sha256                # 加密算法
preserve        = no                    # keep passed DN ordering
policy          = policy_match          #policy_match策略生效

某处还有个usr_cert段落,改为如下,该节点允许CA签出来的证书作为子CA:

[ usr_cert ]
# These extensions are added when 'ca' signs a request.
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:true,pathlen:3

子CA配置
创建目录结构

mkdir -p /etc/pki/tls/private
mkdir /etc/pki/CA
mkdir /etc/pki/CA/private
mkdir /etc/pki/CA/newcerts
touch /etc/pki/CA/index.txt        #生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial       #指定第一个颁发证书的序列号
echo "unique_subject = no">/etc/pki/CA/index.txt.attr #允许签发多个名称属性一样的证书
写配置文件
vim /usr/lib/ssl/openssl.cnf

其中有个CA_default段落,将内容改为如下:

[ CA_default ]
dir             = /etc/pki/CA           # CA的默认工作目录
certs           = $dir/certs            # 认证证书的目录
crl_dir         = $dir/crl              # 证书吊销列表的路径
database        = $dir/index.txt        # 数据库的索引文件
new_certs_dir   = $dir/newcerts         # 新颁发证书的默认路径
certificate     = $dir/cacert.pem       # 此服务认证证书,如果此服务器为根CA那么这里为自颁发证书
serial          = $dir/serial           # 下一个证书的证书编号
crlnumber       = $dir/crlnumber        # 下一个吊销的证书编号
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# CA的私钥
RANDFILE        = $dir/private/.rand    # 随机数文件
x509_extensions = usr_cert              # The extentions to add to the cert
name_opt        = ca_default            # 命名方式,以ca_default定义为准
cert_opt        = ca_default            # 证书参数,以ca_default定义为准
default_days    = 365                   # 证书默认有效期
default_crl_days= 30                    # CRl的有效期
default_md      = sha256                # 加密算法
preserve        = no                    # keep passed DN ordering
policy          = policy_match          #policy_match策略生效

Chrome浏览器要求证书中必须包含“Subject Alternative Names”这一参数。如果没有这个参数,chrome不认.后面这几个配置可添加此段:

找到[ req ]段落在底下添加req_extentions = v3_req


找到[ v3_req ]段落,添加subjectAltName = @alt_names
添加一个段落
[ alt_names ]
DNS.1 = ca.test(web服务端域名,需要根据申请者的域名修改)
效果:

生成秘钥和证书请求文件

# 生成秘钥
openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
# 生成证书请求文件
openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/subca1.csr -subj /C=CN/ST=GD/O=LINZ/CN=SubCA1

获取子CA证书
上面的命令执行完成后把subca1.csr发到根CA的/etc/pki/CA/newcerts目录里面

下面这个命令在根CA终端执行

openssl ca -in /etc/pki/CA/newcerts/subca1.csr -cert /etc/pki/CA/cacert.pem  -keyfile /etc/pki/CA/private/cakey.pem  -out /etc/pki/CA/newcerts/cacert.pem -days 3650

如果没问题newcerts目录里可以找到一个新的cacert.pem文件,传到子CA的/etc/pki/CA/里面.并且安装到Windows的"中间证书颁发机构"

WEB服务端
生成key和证书请求
注意Common Name这里,要填写域名,否则浏览器会认为不安全!

mkdir ~/cert/
openssl genrsa -out ~/cert/catest.key 2048
openssl req -new -key ~/cert/catest.key -out ~/cert/catest.csr -subj /C=CN/ST=GD/O=LINZ/CN=ca.test

csr传到子CA的/etc/pki/CA/newcerts目录里面

子CA:

openssl ca -in /etc/pki/CA/newcerts/catest.csr -out /etc/pki/CA/newcerts/catest.crt -days 365  -extensions v3_req

得到catest.csr文件(虽然生成的时候文件后缀名设为crt实际上是pem格式,如果需要der格式,加-outform der参数),传回web服务端~/cert/目录.

Nginx配置

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 1024;
        # multi_accept on;
}

http {
    server {
        listen 443;
        server_name ca.test;
        ssl on;
        ssl_certificate /root/cert/catest.crt;
        ssl_certificate_key  /root/cert/catest.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        location / {
                root html;
                index index.html;
        }
    }
}

最终客户端

赞(0)
版权属于:

安逸

本文链接:

https://www.anyi.men/index.php/archives/29/(转载时请注明本文出处及文章链接)

评论 (0)
本篇文章评论功能已关闭