OpenSSL创建自签名CA,中间CA,服务端和客户端证书

创建自签名Root CA

方法一:通过修改openssl.cnf文件来制作, 这个方法是最正规的方法,如果需要生成中间证书,或者需要db/index进行证书维护的话,这个方法是必要的。

准备必要的文件夹和文件

mkdir -p ~/ssl/demo_rootCA/{certs,newcerts,crl,csr,private}
cd ~/ssl/demo_rootCA
touch index.txt
echo "01" > serial

其实index.txt 和 serial 文件的路径也是openssl.cnf 中定义的,所以复制出来openssl.cnf 为所用的root-ca.cnf 之后,也要注意这个路径在root-ca.cnf内配置是否正确

复制openssl.cnf模板为root-ca.conf,进行自定义设置

sudo cp /etc/ssl/openssl.cnf ~/ssl/demo_rootCA/root-ca.cnf
vi ~/ssl/demo_rootCA/root-ca.cnf

主要是修改如下部分:


####################################################################
[ CA_default ]

dir     = /root/ssl/demo_rootCA/    # Where everything is kept
certificate = $dir/certs/root-ca.crt.pem
private_key = $dir/private/root-ca.key.pem

要注意下,cnf文件中默认给予的privatekey文件的默认名字, index.txt, serial路径等信息是否符合预期,或者正确

生成Root CA的私钥

cd ~/ssl/demo_rootCA

# 注意这里的私钥名字和路径要和cnf文件里面的对应
openssl genrsa -aes256 -out private/root-ca.key.pem 4096

# 养成给key 400的习惯
chmod 400 private/root-ca.key.pem

生成Root CA的CSR请求文件

这一步会开始询问CN等信息,一步步回答即可。

cd ~/ssl/demo_rootCA

openssl req -new -config ./root-ca.cnf -sha256 -key private/root-ca.key.pem -out csr/root-ca.csr.pem

(Optional)免去交互应答的设定CSR的设置

[ req ]
# Options for the `req` tool (`man req`).
# Optionally, specify some defaults.
prompt = no
input_password = 123456

(Optional) 查看CSR文件

openssl req -text -noout -in csr/rootca.csr.pem

创建Root CA的证书

这里要注意几点:

  1. -selfsing选项,它说明所有的根证书都是自签名的
  2. 这一步会有交互,询问你有效时间,几个证书需要签名等
  3. 当前文件夹下,会有新的serial,index.txt 等文件生成
  4. 正常的生产环境则是找第三方CA公司进行签发。
openssl ca -selfsign -config root-ca.cnf -extensions v3_ca -days 7300 -notext -md sha256 -in csr/root-ca.csr.pem -out certs/root-ca.crt.pem

(Optional) 查看证书详情信息

openssl x509 [-noout] -text -in rootca.crt

且,查看证书详情里面,主要要关注以下信息:
Subject 指明证书自身的信息,这里 Issurer 和 Subject 的信息是一样的;下面还有 X509 协议相关的信息,这部分信息由配置文件 rootca.cnf 中的 [ v3_ca ] 段控制:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            55:a4:cd:af:b4:2b:e2:cc:af:ff:d7:7f:ae:42:59:a0:a3:1a:45:64
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = Guangdong, L = Guangzhou, O = "Demo, Ltd.", OU = Demo CA ROOT, CN = *.demo.com, emailAddress = dev@demo.com
        Validity
            Not Before: Nov 27 09:26:42 2022 GMT
            Not After : Nov 27 09:26:42 2023 GMT
        Subject: C = CN, ST = Guangdong, L = Guangzhou, O = "Demo, Ltd.", OU = Demo CA ROOT, CN = *.demo.com, emailAddress = dev@demo.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
...

X509v3 extensions:
            X509v3 Subject Key Identifier: 
                CB:DF:E7:A0:CC:79:49:A6:C6:5A:14:49:21:0D:56:8E:80:30:CF:DD
            X509v3 Authority Key Identifier: 
                CB:DF:E7:A0:CC:79:49:A6:C6:5A:14:49:21:0D:56:8E:80:30:CF:DD
            X509v3 Basic Constraints: critical
                CA:TRUE

方法二:简单些方法步来完成制作自签名根CA(不指定openssl.cnf文件)

生成root CA的私钥,(实际上无论根CA,还是服务端,客户端,私钥均是如此生成)。 经过测试,如果制定-aes256参数,则会询问输入密码。

openssl genrsa [-aes256] -out rootca.key 4096

(Optional) 查看Key文件详细解析:

openssl rsa -in rootca.key -text

(Optional) 通过私钥可以提取公钥

openssl rsa -pubout -in rootca.key

根据私钥文件生成CSR请求文件, 这个过程中,会询问CN等信息,按照需要填写

openssl req -new [-sha256] -out root-req.csr -key rootca.key [-keyform PEM]

(Optional) 查看CSR文件详情

openssl req -text -noout -in root-req.csr

利用上一步得到的CSR签发自签名的RootT CA根证书,注意,正常的生产环境则是找第三方CA公司进行签发。

openssl x509 -req -days 365 [-sha256 -CAcreateserial -extensions v3_ca] -in root-req.csr -signkey rootca.key -out rootca.crt

-CAcreateserial,创建证书序列号,使用此选项,当CA序列号文件不存在时将被创建:它将包含序列号“02”(根据实际配置文件Serial来),正在签名的证书将具有1作为其序列号。通常如果指定了-CA选项并且序列号文件不存在,则会出现错误
-extensions, ignoring -extensions option without -extfile, 需要指定extfile

Tips

Tips: 方法二实际上就是方法三的拆解步骤。在某些特殊需求条件下,我们是需要保留类似CSR请求文件和Serial文件的,所以方法一和方法二,某些场景下,依然需要。

方法三:直接一步命令生成CA证书密钥对

一步生成CA证书和对应密钥,实际上就是免去了中间生成CSR的步骤,而是通过交互方式完成输入过程。

openssl req -new -x509 -newkey rsa:4096 -keyout cakey.key -out cacert.crt -days 365

甚至连交互输入CSR信息都免去,命令后参数带上-subj参数

openssl req -x509 -newkey rsa:4096 -days 365 -nodes -keyout ca-key.pem -out ca-cert.pem -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=Demo, Ltd./OU=Demo CA ROOT/CN=*.demo.com/emailAddress=dev@demo.com"

创建中间Intermediate CA

必要说明

该部分操作,是延续上文中创建root CA方法一之后的延续。请参考上文说明之后进行如下操作

准备文件夹和文件

mkdir -p ~/ssl/demo_intermediateCA/{certs,newcerts,crl,csr,private}
cd ~/ssl/demo_intermediateCA
touch index.txt
echo "01" > serial

复制openssl.cnf模板为intermediate-ca.cnf,进行自定义设置

sudo cp /etc/ssl/openssl.cnf ~/ssl/demo_intermediateCA/intermediate-ca.cnf
vi ~/ssl/demo_intermediateCA/intermediate-ca.cnf

主要是修改如下部分:


####################################################################
[ CA_default ]

dir     = /root/ssl/demo_intermediateCA/    # Where everything is kept
certificate = $dir/certs/intermediate-ca.crt.pem
private_key = $dir/private/intermediate-ca.key.pem # The private key

...


(Optional) 同时要注意,要给上一级root ca的cnf文件 rootca.cnf也进行下修改,修改如下 --- 当然不修改也可以,直接使用默认值**v3_ca**设定也可以, 这里只是提供一种思路

[ req ]

...

# 原本为v3_ca
x509_extensions = v3_intermediate_ca    # The extensions to add to the self signed cert

...

# 可以从[ v3_ca ] section进行复制并修改如下
[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

要注意下,cnf文件中默认给予的privatekey文件的默认名字, index.txt, serial路径等信息是否符合预期,或者正确
这里为了和root ca进行区分,把private key的默认名字修改了下。实际上不修改也可以,只要操作者能区分即可。

创建私钥

cd ~/ssl/demo_intermediateCA

#注意和intermediate.cnf 文件内的路径一致
openssl genrsa -aes256 -out private/intermediate-ca.key.pem 4096

# 养成给key 400的习惯
chmod 400 private/intermediate-ca.key.pem

生成CSR请求文件

这一步的交互问答CN等重要信息,不要和Root CA一样,要有区别。

cd ~/ssl/demo_intermediateCA

openssl req -new -config ./intermediate-ca.cnf -sha256 -key private/intermediate-ca.key.pem -out csr/intermediate-ca.csr.pem 

创建中间CA证书

这里有几点需要注意的地方:

  1. 注意!这里是用的是Root CA 的 root-ca.cnf 和 Intermediate CA 自己的 csr 为用户生成中间CA证书。
  2. 另外,这里是直接使用了 v3_ca的section,并非是上文修改的 c3_intermediate_ca
  3. 文件夹下的index.txt 等文件都会更新的
  4. **./demo_rootCA/index **文件是 OpenSSL CA 工具存储证书的数据库,请不要手动修改这个文件
cd ..

openssl ca -config ./demo_rootCA/root-ca.cnf -extensions v3_ca -days 365 -notext -md sha256 -in ./demo_intermediateCA/csr/intermediate-ca.csr.pem -out ./demo_intermediateCA/certs/intermediate-ca.crt.pem

查看证书信息

openssl x509 -noout -text -in ./demo_intermediateCA/certs/intermediate-ca.crt.pem

验证中间证CA书

openssl verify -CAfile ./demo_rootCA/certs/root-ca.crt.pem ./demo_intermediateCA/certs/intermediate-ca.crt.pem 
./demo_intermediateCA/certs/intermediate-ca.crt.pem: OK

创建证书链

所谓的证书链,简单的说就是把根证书和中间证书按照顺序放置在同一个证书文件中。重点是:中间证书在上面,根证书在下面

cat ./demo_intermediateCA/certs/intermediate-ca.crt.pem ./demo_rootCA/certs/root-ca.crt.pem > ./demo_intermediateCA/certs/ca-chain.crt.pem

(Optional)生成pkcs12的证书链

openssl pkcs12 --export -name "intermediate CA chain pkcs12" -inkey ./demo_intermediateCA/private/intermediate-ca.key.pem -in ./demo_intermediateCA/certs/intermediate-ca.crt.pem -certfile ./demo_intermediateCA/certs/ca-chain.crt.pem -out ./demo_intermediateCA/certs/ca-chain.crt.pk12

Enter pass phrase for ./demo_intermediateCA/private/intermediate-ca.key.pem:
Enter Export Password:
Verifying - Enter Export Password:

创建(对CA而言)客户端证书

概念容易混淆的地方说明

对于网络服务器和浏览器两者,或者OpenVPN而言,分为服务端和客户端,都是两个对端彼此校验。我们习惯性称为服务端客户端. 但是对于CA来说,他们都是对于CA来说的“客户端”。所以下面的操作步骤,我们只需要执行两次---生成两套证书,分别给网络的服务端和用户客户端分别使用即可。
我这里使用“enduser"作为名字,实际操作中,可以将”enduser"替换为“server_end" 和 ”client_end" 来生成两套证书即可

准备文件夹和文件

mkdir -p ~/ssl/demo_enduserCert/{certs,newcerts,crl,csr,private}
cd ~/ssl/demo_enduserCert
touch index.txt
echo "01" > serial

复制openssl.cnf模板为intermediate-ca.cnf,进行自定义设置

sudo cp /etc/ssl/openssl.cnf ~/ssl/demo_enduserCert/enduser-cert.cnf
vi ~/ssl/demo_enduserCert/enduser-cert.cnf

主要是修改如下部分:


####################################################################
[ CA_default ]

dir     = /root/ssl/demo_enduserCert/   # Where everything is kept
certificate = $dir/certs/enduser-cert.crt.pem
private_key = $dir/private/enduser-cert.key.pem # The private key

...


创建私钥

cd ~/ssl/demo_enduserCert

#注意和intermediate.cnf 文件内的路径一致
openssl genrsa -aes256 -out private/enduser-cert.key.pem 4096

# 养成给key 400的习惯
chmod 400 private/enduser-cert.key.pem

创建CSR请求文件

openssl req -new -sha256 -config ./enduser-cert.cnf -key private/enduser-cert.key.pem -out csr/enduser-cert.csr.pem

利用中间CA来签发证书

注意要点:

  1. 用的是中间CA的cnf文件
  2. 用enduser 自己的csr文件
  3. 注意extensions指定的是中间CA的cnf文件里面usr_cert的section
openssl ca -config ./demo_intermediateCA/intermediate-ca.cnf -extensions usr_cert -days 365 -notext -md sha256 -in ./demo_enduserCert/csr/enduser-cert.csr.pem -out ./demo_enduserCert/certs/enduser-cert.crt.pem

如果不想使用intermediate-ca.cnf 文件,也可以用如下命令来用中间CA来签发证书:

openssl x509 -req -in ./demo_enduserCert/csr/enduser-cert.csr.pem -CA ./demo_intermediateCA/certs/intermediate-ca.crt.pem -CAkey ./demo_intermediateCA/private/intermediate-ca.key.pem -out ./demo_enduserCert/certs/enduser-cert-without-cnf.crt.pem -set_serial 1000 -days 365

#或者

openssl x509 -req -in ./demo_enduserCert/csr/enduser-cert.csr.pem -CA ./demo_intermediateCA/certs/intermediate-ca.crt.pem -CAkey ./demo_intermediateCA/private/intermediate-ca.key.pem -out ./demo_enduserCert/certs/enduser-cert-without-cnf-createserial.crt.pem -CAcreateserial -days 365

查看证书信息

我们可以注意到是中间CA签发的(Issuer字段)。且CA:FALSE, 表示不能作为CA证书了。

openssl x509 -noout -text -in ./demo_enduserCert/certs/enduser-cert.crt.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = Shanghai, O = JP Org, OU = JP Org Unit, CN = JP Intermediate CA
        Validity
            Not Before: Nov 27 15:53:56 2022 GMT
            Not After : Nov 27 15:53:56 2023 GMT
        Subject: C = CN, ST = Shanghai, O = JP Org, OU = JP Org Unit, CN = JP Enduser Cert
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:

...

X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE


验证证书的合法性

openssl verify -CAfile ./demo_intermediateCA/certs/ca-chain.crt.pem ./demo_enduserCert/certs/enduser-cert.crt.pem 
./demo_enduserCert/certs/enduser-cert.crt.pem: OK

如果用的不是完整证书链,而仅仅是中间CA的话,报错如下

openssl verify -CAfile ./demo_intermediateCA/certs/intermediate-ca.crt.pem ./demo_enduserCert/certs/enduser-cert.crt.pem 
C = CN, ST = Shanghai, O = JP Org, OU = JP Org Unit, CN = JP Intermediate CA
error 2 at 1 depth lookup: unable to get issuer certificate
error ./demo_enduserCert/certs/enduser-cert.crt.pem: verification failed

部署和安装

部署的话,以部署服务端证书为例子。
把上面的enduser 的证书,部署到服务端,比如Web服务器中,然后用户的电脑或者Firefox导入对应的证书链即可。

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容