生成CA自签名根证书和颁发证书和证书提取
CA(Certificate Authority)被称为证书授权中心,是数字证书发放和管理的机构。
根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。
生成CA证书私钥
代码语言:javascript
复制
1# 生成aes128位编码的 密码为Test@2022 2048位的 key 文件 (带密码 、加密格式 aes、des 3des等)
2openssl genrsa -aes128 -passout pass:Test@2022 -out ca_private.key 2048
3# 生成 2048位的 key 文件 (不带密码,加密格式 等)
4openssl genrsa -out ca_private.key 2048
5# 也可生成 ca_private.pem 文件,将后缀.key 变更为.pem
6openssl genrsa -aes128 -passout pass:Test@2022 -out ca_private.pem 2048
7openssl genrsa -out ca_private.pem 2048
生成CA证书请求文件
代码语言:javascript
复制
1# 有效期20年
2# 也可以 将后缀.key 变更为.pem 带密码(注意目录,文件放在哪个目录下,一会用的到,别找不到路径)
3openssl req -new -key ca_private.key -passin pass:Test@2022 -out ca_req.csr -days 7300
4# 不带密码
5openssl req -new -key ca_private.key -out ca_req.csr -days 7300
6# 填写 国家、机构、密码等,按实际情况填写即可
生成CA根证书
代码语言:javascript
复制
1# 注意目录,文件放在哪个目录下,一会用的到,别找不到路径
2openssl x509 -req -in ca_req.csr -signkey ca_private.key -out ca_root.crt -days 7300 -passin pass:Test@2022
3# 不带密码
4openssl x509 -req -in ca_req.csr -signkey ca_private.key -out ca_root.crt -days 7300
注:接下来服务器证书要根据 以上证书 来生成
服务器证书生成
与根节点服务器证书类似,只是生成 服务器证书的第三部要依赖 生成的 ca 根证书
代码语言:javascript
复制
1# 1. 生成服务器私钥
2openssl genrsa -aes128 -passout pass:Test@2022 -out server_private.key 2048
3## 带秘钥 带加密方式 等同 ca 第一步
4## 可以 去掉密码 去掉加密 方式
5openssl genrsa -out server_private.key 2048
6
7# 2. 生成服务端的待签名证书
8## 有效期10年
9openssl req -new -key server_private.key -passin pass:Test@2022 -out server_req.csr -days 3650
10## 无密码可以去掉密码部分
11openssl req -new -key server_private.key -out server_req.csr -days 3650
12
13# 3. 使用CA根证书对服务端证书签名
14## key版
15openssl x509 -req -in server_req.csr -days 3650 -CAkey ca_private.key -CA ca_root.crt -CAcreateserial -out server.crt
16## pem 版本
17openssl x509 -req -in server_req.csr -days 3650 -CAkey ca_private.pem -CA ca_root.pem -CAcreateserial -out server.crt
chrome错误
错误码:NET::ERR_CERT_COMMON_NAME_INVALID
错误信息:此服务器无法证实它就是 mousemin.com - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。
解决方案
新建一个文件 ext.ini
,写入以下内容:
代码语言:javascript
复制
1basicConstraints = CA:FALSE
2keyUsage = nonRepudiation, digitalSignature, keyEncipherment
3subjectAltName = @alt_names
4
5[alt_names]
6DNS.1 = *.mousemin.com
7DNS.2 = mousemin.com
alt_names
下面填写上所有的域名即可,然后签发证书的时候带上参数:
代码语言:javascript
复制
1openssl x509 ... -extfile ext.ini
服务器证书生成脚本
代码语言:javascript
复制
1#!/usr/bin/env bash
2set -e
3
4File=$1
5if [[ "${File}" == "" ]]
6then
7 echo "gen.sh filename [domain...]"
8 exit
9fi
10
11if [[ "$#" < 1 ]]
12then
13 echo "gen.sh filename [domain...]"
14 exit
15fi
16
17domains=($*)
18
19# 生成私钥
20openssl genrsa -out ${File}.key 2048
21
22# 生成服务端的待签名证书
23openssl req -new -key ${File}.key -out ${File}.csr -days 3650
24
25# 生成ext.ini
26echo "basicConstraints = CA:FALSE" > ${File}_ext.ini
27echo "keyUsage = nonRepudiation, digitalSignature, keyEncipherment" >> ${File}_ext.ini
28echo "subjectAltName = @alt_names" >> ${File}_ext.ini
29echo "[alt_names]" >> ${File}_ext.ini
30
31for(( i=1; i<${#domains[@]}; i++)) do
32 echo "DNS.${i} = ${domains[i]}" >> ${File}_ext.ini
33done
34
35for(( i=0;i<${#domains[@]};i++)) do
36 echo "DNS.${i} = ${domains[i]}" >> ${File}_ext.ini
37done
38
39# 使用CA根证书对服务端证书签名
40openssl x509 -req -in ${File}.csr -days 3650 -CAkey ca_private.key -CA ca_root.crt -CAcreateserial -out ${File}.crt -extfile ${File}_ext.ini
41
42rm -f ${File}.csr ${File}_ext.ini
一键生成
代码语言:javascript
复制
1openssl req -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out mousemin.com.crt -keyout mousemin.com.key