使用OpenSSL证书操作详解
一、OpenSSL简介
OpenSSL支持多种秘钥算法,包括RSA、DSA、ECDSA,RSA使用比较普遍。官网地址:https://www.openssl.org/,一般CeontOS系统都装有OpenSSL,可使用命令openssl verson查看
openssl verson

二、秘钥操作
A)生成RSA私钥。-out private.key 输出秘钥文件为private.key;128 为秘钥大小,目前认为2048大小是比较安全的,本文测试使用128大小。
openssl genrsa -out private.key 128

生成的私钥样例为:
-----BEGIN RSA PRIVATE KEY-----
MGMCAQACEQDS52MK0Nw1QIfRfSaTOhdnAgMBAAECEQCV/r6v6I9Uxv/J3tc5onvB
AgkA6o1Gly9yqVECCQDmMIZkMe6HNwIIaKE68yhMWvECCBXOAuz6zd2BAgkAlR9Y
VQCWm2A=
-----END RSA PRIVATE KEY-----
B)生成带密码的RSA私钥。-aes256:指定私钥密码加密方式;-passout pass:1234:设置私钥密码为1234
openssl genrsa -aes256 -passout pass:1234 -out private.key 128
生成的私钥样例如下:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B15639107691B98267AD45CF619539BB Xf7uNMPFE3pdc0T5hmrZWaU5GmK/Jaf7B8oF4pmeTWAJ7SvGvQKxeFBecE1ROn6z
xIuSkHI9SwsdTlwNJmvYzGLwLwHNwXGc/cJF0EISlsBYTE/v2C12tj9E5VGKiTeH
DRuIEhyaypqMp5+Ceyi61A==
-----END RSA PRIVATE KEY-----
C)私钥加密:
openssl rsa -in private.key -aes256 -passout pass:1234 -out private_pwd.pem
私钥去除加密:
openssl rsa -in private_pwd.key -passin pass:1234 -out private.key
D)生成公钥, 如果私钥private.pem有密码,生成公钥时会提示需要输入密码。
openssl rsa -in private.key -pubout -out public.key

公钥样例如下:
-----BEGIN PUBLIC KEY-----
MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRANGuQHQ1P4GTgcQwHdS4nIcCAwEAAQ==
-----END PUBLIC KEY-----
三、生成自签名证书
A)使用已有的私钥创建自签名根证书(x509证书包含公钥、身份信息、签名信息)
openssl genrsa -out root.key 2048 // 生成私钥
openssl req -new -x509 -days 3650 -key root.key -out root.crt -subj "/C=CN/ST=hubei/L=wuhan/O=zhi/OU=zhi/CN=root" // 直接生成签名证书 #下面2个命令等效上面这个命令
openssl req -new -key root.key -out root.csr -subj "/C=CN/ST=hubei/L=wuhan/O=zhi/OU=zhi/CN=root" // 生成签名申请
openssl x509 -req -days 3650 -in root.csr -signkey root.key -out root.crt // 生成签名证书
-subj拥有者信息,CN:姓名;OU:组织单位名称;O:组织名称;L:省/市/自治区名称;C:国家/地区代码
生成证书的效果:

B)使用根证书签名其他证书。
openssl genrsa -out second.key 2048 // 生成私钥
openssl req -new -key second.key -out second.csr -subj "/C=CN/ST=hubei/L=SZ/O=test/OU=test/CN=second" // 生成签名请求
openssl ca -in second.csr -days 3650 -out second.crt -cert root.crt -keyfile root.key // 使用root证书进行签名

生成的证书样式效果:

我们也可以使用二级证书签名其他证书:
openssl genrsa -out tomcat.key 2048 // 生成私钥
openssl req -new -key tomcat.key -out tomcat.csr -subj "/C=CN/ST=hubei/L=SZ/O=test/OU=test/CN=tomcat" // 生成签名请求
openssl ca -in tomcat.csr -days 3650 -out tomcat.crt -cert second.crt -keyfile second.key // 使用second证书进行签名

签名过程中出现的问题:
1、找到不index.txt文件
/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
139798482433936:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/index.txt','r')
139798482433936:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
解决方式,在/etc/pki/CA目录创建详细的文件:
cd /etc/pki/CA
touch index.txt
touch serial
echo "01" > serial

2、The organizationName field needed to be the same in the CA certificate (zhi) and the request (test),修改/etc/pki/tls/openssl.cnf,将organizationName的值有match改为optional。

四、证书转换
openssl x509 -in root.crt -out root.pem // crt转pem格式
openssl x509 -in mycert.crt -out mycert.pem -outform pe // crt转pem格式
openssl x509 -in root.crt -out root.cer -outform der // crt转cer格式
openssl pkcs12 -export -in root.crt -inkey root.key -out root.p12 -name root // crt转p12格式
使用JDK自带的ketool进行jks和p12格式互转:
keytool -importkeystore -srckeystore test.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore test.jks
keytool -importkeystore -srckeystore test.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore test.p12
p12证书中提取信息:
openssl pkcs12 -in keystore.p12 -password pass:123456 -passout pass:123456 -nocerts -out private.pem // 提取私钥(加密私钥文件)
openssl pkcs12 -in keystore.p12 -password pass:123456 -nodes -nocerts -out private.pem // 提取私钥(不加密私钥文件)
openssl pkcs12 -in keystore.p12 -password pass:123456 -nokeys -out out/all_cert.pem // 提取所有证书
openssl pkcs12 -in keystore.p12 -password pass:123456 -nokeys -cacerts -out out/cacert.pem // 仅输出CA证书
openssl pkcs12 -in keystore.p12 -password pass:123456 -nokeys -clcerts -out out/cert.pem // 仅输出客户端证书
使用openssl pkcs12 help可获取更多参数信息。
使用OpenSSL证书操作详解的更多相关文章
- C语言操作WINDOWS系统存储区数字证书相关函数详解及实例
C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...
- MongoDB各种查询操作详解
这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下 一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...
- Linux Shell数组常用操作详解
Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...
- [Android新手区] SQLite 操作详解--SQL语法
该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法 :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...
- shell字符串操作详解
shell字符串操作详解的相关资料. 1.shell变量声明的判断 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...
- memcached 命令操作详解
memcached 命令操作详解 一.存储命令 存储命令的格式: <command name> <key> <flags> <exptime> < ...
- windows phone 8.1开发SQlite数据库操作详解
原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...
- MySQL 操作详解
MySQL 操作详解 一.实验简介 本节实验中学习并实践 MySQL 上创建数据库.创建表.查找信息等详细的语法及参数使用方法. 二.创建并使用数据库 1. 创建并选择数据库 使用SHOW语句找出服务 ...
- python/ORM操作详解
一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...
随机推荐
- STM32 F4xx Fault 异常错误定位指南
STM32 F407 采用 Cortex-M4 的内核,该内核的 Fault 异常可以捕获非法的内存访问和非法的编程行为.Fault异常能够检测到以下几类非法行为: 总线 Fault: 在取址.数据读 ...
- 记录使用echarts的graph类型绘制流程图全过程(二)- 多层关系和圆形图片的设置
本文主要记录在使用echarts的graph类型绘制流程图时候遇到的2个问题:对于圆形图片的剪切和多层关系的设置 图片的设置 如果用echarts默认的symbol参数来显示图片,会显示图片的原始状态 ...
- 【编译系统01】编译器 - 词法分析器(lexial)的设计思路
时间:2019/11/29 首先,词法分析器由一个扫描器与状态机组成. 一. 词法分析器整体设计流程 二.设计细节 1. code.txt: 我们假设读取下面文本 2.符号类型的设计 我们使用 enu ...
- Koa + GraphQL 示例
初始化项目 创建 graphql-example 文件夹进入后初始化一个 package.json 文件. $ mkdir graphql-example && cd $_ $ yar ...
- 用python执行Linux命令
例1:在python中包装ls命令 #!/usr/bin/env python #python wapper for the ls command import subprocess subproce ...
- 20个Python代码段,你需要立刻学会,好用到哭!
Python是一种非BS编程语言.设计简单和易读性是它广受欢迎的两大原因.正如Python的宗旨:美丽胜于丑陋,显式胜于隐式. 记住一些帮助提高编码设计的常用小诀窍是有用的.在必要时刻,这些小诀窍能够 ...
- Python笔记:设计模式之工厂模式
工厂模式:“工厂”即表示一个负责创建其他类型的对象的类,通常情况下,一个工厂的对象会有一个或多个方法与之关联,这些方法用于创建不同类型的对象,工厂对象会根据客户端给方法传递的不同的参数或者客户端调用不 ...
- JAVA 基础篇
一.数组 1. 什么是数组? 数组和变量差不多,也是可以存放数据的,但是数组可以存放多个数据,而且多个数据的数据类型统一 格式 数据类型 [] 数组名称; 还有一种等效的写法,不推荐 数据类型 数组名 ...
- CSS 2D 转换
通过CSS 2D转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 2D转换一共五个属性:transfrom=> translate(X轴数值px,Y轴数值px):元素从其当前位置移动,根据 ...
- 2019年上半年收集到的人工智能GAN干货文章
2019年上半年收集到的人工智能GAN干货文章 GAN简介及其常见应用 训练GAN,你应该知道的二三事 了解生成对抗网络(GAN) CosmoGAN:训练GAN,让AI寻找宇宙中的暗物质 关于GAN的 ...