文档章节

OpenSSL生成根证书CA及签发子证书

摆渡者
 摆渡者
发布于 2016/04/01 15:34
字数 1612
阅读 12667
收藏 16

系统:CentOS7 32位

目标:使用OpenSSL生成一个CA根证书,并用这个根证书颁发两个子证书server和client。

先确保系统中安装了OpenSSL,若没安装,可以通过以下命令安装:

sudo yum install openssl

修改OpenSSL的配置

安装好之后,定位一下OpenSSL的配置文件openssl.cnf:

locate openssl.cnf

如图,我这里的目录是/etc/pki/tls/openssl.cnf。

修改配置文件,修改其中的dir变量,重新设置SSL的工作目录:

由于配置文件中,dir变量下还有几个子文件夹需要用到,因此在自定义的文件夹下面也创建这几个文件夹或文件,它们是:

certs——存放已颁发的证书

newcerts——存放CA指令生成的新证书

private——存放私钥

crl——存放已吊销的证书

index.txt——OpenSSL定义的已签发证书的文本数据库文件,这个文件通常在初始化的时候是空的

serial——证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并且包含一个有效的序列号

生成证书之前,需要先生成一个随机数:

openssl rand -out private/.rand 1000

该命令含义如下:

rand——生成随机数

-out——指定输出文件

1000——指定随机数长度

生成根证书

a).生成根证书私钥(pem文件)

OpenSSL通常使用PEM(Privacy Enbanced Mail)格式来保存私钥,构建私钥的命令如下:

openssl genrsa -aes256 -out private/cakey.pem 1024

该命含义如下:

genrsa——使用RSA算法产生私钥

-aes256——使用256位密钥的AES算法对私钥进行加密

-out——输出文件的路径

1024——指定私钥长度

b).生成根证书签发申请文件(csr文件)

使用上一步生成的私钥(pem文件),生成证书请求文件(csr文件):

openssl req -new -key private/cakey.pem -out private/ca.csr -subj \
"/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"

该命令含义如下:

req——执行证书签发命令

-new——新证书签发请求

-key——指定私钥路径

-out——输出的csr文件的路径

-subj——证书相关的用户信息(subject的缩写)

c).自签发根证书(cer文件)

csr文件生成以后,可以将其发送给CA认证机构进行签发,当然,这里我们使用OpenSSL对该证书进行自签发:

openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey \
private/cakey.pem -in private/ca.csr -out certs/ca.cer

该命令的含义如下:

x509——生成x509格式证书

-req——输入csr文件

-days——证书的有效期(天)

-sha1——证书摘要采用sha1算法

-extensions——按照openssl.cnf文件中配置的v3_ca项添加扩展

-signkey——签发证书的私钥

-in——要输入的csr文件

-out——输出的cer证书文件

之后看一下certs文件夹里生成的ca.cer证书文件:

用根证书签发server端证书

和生成根证书的步骤类似,这里就不再介绍相同的参数了。

a).生成服务端私钥

openssl genrsa -aes256 -out private/server-key.pem 1024

b).生成证书请求文件

openssl req -new -key private/server-key.pem -out private/server.csr -subj \
"/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"

c).使用根证书签发服务端证书

openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/cakey.pem \
-CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer

这里有必要解释一下这几个参数:

-CA——指定CA证书的路径

-CAkey——指定CA证书的私钥路径

-CAserial——指定证书序列号文件的路径

-CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀

注意:这里指定的-extensions的值为v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值为CA:FALSE,如图:

而前面生成根证书时,使用的-extensions值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书,如图:

在x509指令中,有多种方式可以指定一个将要生成证书的序列号,可以使用set_serial选项来直接指定证书的序列号,也可以使用-CAserial选项来指定一个包含序列号的文件。所谓的序列号是一个包含一个十六进制正整数的文件,在默认情况下,该文件的名称为输入的证书名称加上.srl后缀,比如输入的证书文件为ca.cer,那么指令会试图从ca.srl文件中获取序列号,可以自己创建一个ca.srl文件,也可以通过-CAcreateserial选项来生成一个序列号文件。

用根证书签发client端证书

和签发server端的证书的过程类似,只是稍微改下参数而已。

a).生成客户端私钥

openssl genrsa -aes256 -out private/client-key.pem 1024

b).生成证书请求文件

openssl req -new -key private/client-key.pem -out private/client.csr -subj \
"/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"

c).使用根证书签发客户端证书

openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/cakey.pem \
-CAserial ca.srl -in private/client.csr -out certs/client.cer

需要注意的是,上方签发服务端证书时已经使用-CAcreateserial生成过ca.srl文件,因此这里不需要带上这个参数了

 

至此,我们已经使用OpenSSL自签发了一个CA证书ca.cer,并用这个CA证书签发了server.cer和client.cer两个子证书了:

导出证书

a).导出客户端证书

openssl pkcs12 -export -clcerts -name myclient -inkey \
private/client-key.pem -in certs/client.cer -out certs/client.keystore

参数含义如下:

pkcs12——用来处理pkcs#12格式的证书

-export——执行的是导出操作

-clcerts——导出的是客户端证书,-cacerts则表示导出的是ca证书

-name——导出的证书别名

-inkey——证书的私钥路径

-in——要导出的证书的路径

-out——输出的密钥库文件的路径

b).导出服务端证书

openssl pkcs12 -export -clcerts -name myserver -inkey \
private/server-key.pem -in certs/server.cer -out certs/server.keystore

c).信任证书的导出

keytool -importcert -trustcacerts -alias www.mydomain.com \
-file certs/ca.cer -keystore certs/ca-trust.keystore

© 著作权归作者所有

共有 人打赏支持
摆渡者
粉丝 320
博文 171
码字总数 205876
作品 0
浦东
程序员
加载中

评论(3)

simplesslife
simplesslife
原来是组织名,邮箱等填写的完全一样,导致错误,修改一下就行了
摆渡者
摆渡者

引用来自“simplesslife”的评论

你好,我用你的方法生成了证书,用curl 和 nginx测试双向验证,为什么还报400,ssl认证输错?
你先看一下是报什么错呢?
simplesslife
simplesslife
你好,我用你的方法生成了证书,用curl 和 nginx测试双向验证,为什么还报400,ssl认证输错?
使用Openssl进行PKI实践(含多级证书详细步骤)

Openssl是Linux下的基础安全工具 先简要介绍一些基础知识: Openssl功能主要有:对称加密(DES、3DES、AES等),非对称加密(RSA),散列(MD5、SHA1等)以及证书的相关操作(创建、申请、颁...

niceguy_php
2014/04/02
0
0
apache 搭建双向证书认证

一. CA自签 1.建立 CA 目录结构 mkdir -p ./demoCA/{private,newcerts} touch ./demoCA/index.txt echo 01 > ./demoCA/serial # 生成 CA 的 RSA 密钥对 openssl genrsa -des3 -out ./demoCA......

niceguy_php
2014/04/02
0
0
使用 openSSL 实现CA

前言 CA是证书的签发机构,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。 它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份...

vincenteve
06/28
0
0
使用OpenSSL实现证书操作

伴随着计算机的发展,计算机的安全问题也一直困扰着我们,在现代社会计算机信息安全更显得格外的重要,如今的社会是一个信息的社会,你我每天都在使用计算机,随着电子邮件、社区网游、即使通...

景光
2013/02/02
0
0
openssl的应用及私有CA相关内容

以CA为核心生成的一套安全架构体系我们称之为: PKI:Public Key Infrastructure,公钥基础设施;其包含的内容: 1.签证机构:CA 2.证书注册机构:RA 3.证书吊销列表:CRL 4.证书存取库:CR ...

狐狸和鳄鱼
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

C++ gflags

gflags是google一个开源的处理命令行参数的库,相比getopt,更加容易使用。 定义参数 gflags主要支持的参数类型包括 DEFINEbool: boolean DEFINEint32: 32-bit integer DEFINEint64: 64-bit ...

SibylY
33分钟前
0
0
intellij IDEA Properties中文unicode转码问题

在IDEA中创建了properties文件,发现默认中文不会自动进行unicode转码。如下 在project settings - File Encoding,在标红的选项上打上勾,确定即可 效果图如下: unicode转码后效果...

muzi1994
34分钟前
0
0
Java IO类库之PipedWriter

一、PipedWriter介绍 PipedWriter是字符管道输出流,继承自Writer,功能与PipedOutputStream类似,通过与PipedReader组合使用实现类似管道的功能,在多线程环境下,一个线程使用PipedWriter...

老韭菜
38分钟前
0
0
精简分页组件(手写)

需要引入CSS(没错就是这4行) .pagelist { text-align: center; color: #666; width: 100%; clear: both; margin: 20px 0; padding-top: 20px }.pagelist a { color: #666; margin: 0 2px;......

AK灬
39分钟前
3
0
29 岁成为阿里巴巴 P8,工作前 5 年完成晋升 3 连跳,他如何做到?

泡泡是我的好朋友。今年 31 岁,毕业后就进了阿里巴巴,工作五年内从 P4 晋升至 P6、P7、P8。 和他很少聊到工作,但总觉得他有很棒的职场心得,应该分享出来,于是有了这次采访。希望对职场新...

Java填坑之路
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部