文档章节

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

摆渡者
 摆渡者
发布于 2016/04/01 15:34
字数 1612
阅读 11788
收藏 16
点赞 5
评论 3

系统: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

© 著作权归作者所有

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

评论(3)

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

引用来自“simplesslife”的评论

你好,我用你的方法生成了证书,用curl 和 nginx测试双向验证,为什么还报400,ssl认证输错?
你先看一下是报什么错呢?
simplesslife
simplesslife
你好,我用你的方法生成了证书,用curl 和 nginx测试双向验证,为什么还报400,ssl认证输错?
openssl的应用及私有CA相关内容

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

狐狸和鳄鱼 ⋅ 04/16 ⋅ 0

【大量干货】史上最完整的Tengine HTTPS原理解析、实践与调试

本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验。内容主要有四个方面:HTTPS趋势、HTTPS基础、HTTPS实践、HTTPS调试。 一、HTTPS趋势 这一章节主要介绍近几年和未来H...

樰篱 ⋅ 05/29 ⋅ 0

openssl基本原理 + 生成证书 + 使用实例

1. 基本原理 参考:http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html == Begin http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html == 公司一个项目要进行交易......

sandshell ⋅ 昨天 ⋅ 0

windows server 2016 证书服务

证书服务 证书作用 加密数据 身份识别 密钥(加密)基本概念 数据传输:使用加密的方法将数据的内容加密,或者用于身份识别 对称加密:发送和接收方必须使用相同的方式对数据的内容进行加密和...

haitao0228 ⋅ 04/20 ⋅ 0

openssl基本原理 + 生成证书 + 使用实例-测试场景使用

1. 基本原理 参考:http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html == Begin http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html == 公司一个项目要进行交易......

sandshell ⋅ 昨天 ⋅ 0

CentOS 7.4 Tengine安装配置详解(五)

十四、配置Tengine支持HTTPS 1、演示环境: 备注:Tengine和CA可以部署于同一台服务器 2、修改配置文件nginx.conf,创建基于主机名的虚拟主机: server { listen 80; server_name web.vhosts...

Marion0728 ⋅ 05/29 ⋅ 0

Linux openssh openssl

Linux openssh openssl 笔记日期20180524 目录 openssh 配置ssh基于密钥的方式认证 服务器端配置文件 ssh服务的最佳实践 OpenSSL 三个组件 PKI: Public Key Infrastructure 建立私有CA 证书申...

Winthcloud ⋅ 05/24 ⋅ 0

数字证书(1)

工作原理 数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)...

wbf961127 ⋅ 2017/11/08 ⋅ 0

各种类型SSL数字证书的区别,如何选择

用于网站HTTPS化的SSL数字证书,当前主要分为DV SSL、OV SSL、EV SSL三种类型的证书。 DV SSL数字证书部署在服务器上后,用户浏览器访问网站时,展示如下: OV SSL数字证书部署在服务器上后,...

sandshell ⋅ 06/12 ⋅ 0

互联网什么是SSL证书?什么是HTTPS?

互联网什么是SSL证书?什么是HTTPS? 什么是SSL证书?您每次访问我们的网站时都会在您的URL栏中看到HTTPS。那个符号有意义。这不仅仅是一些随机的,在互联网上它意味着什么。 挂锁是表示已在...

优惠券发放 ⋅ 06/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 34分钟前 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部