一、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证书操作详解的更多相关文章

  1. C语言操作WINDOWS系统存储区数字证书相关函数详解及实例

     C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...

  2. MongoDB各种查询操作详解

    这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

  3. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

  4. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  5. shell字符串操作详解

    shell字符串操作详解的相关资料. 1.shell变量声明的判断  表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...

  6. memcached 命令操作详解

    memcached 命令操作详解 一.存储命令 存储命令的格式: <command name> <key> <flags> <exptime> < ...

  7. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

  8. MySQL 操作详解

    MySQL 操作详解 一.实验简介 本节实验中学习并实践 MySQL 上创建数据库.创建表.查找信息等详细的语法及参数使用方法. 二.创建并使用数据库 1. 创建并选择数据库 使用SHOW语句找出服务 ...

  9. python/ORM操作详解

    一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...

随机推荐

  1. Ubuntu 16.04 + Realsense D435i + ROS 环境配置

    参考: [1] Realsense-Ros: https://github.com/IntelRealSense/realsense-ros#installation-instructions [2] ...

  2. HTML5之图片转base64编码

    之前在群里看到很多小哥哥小姐姐讨论关于图片base64互转的方法,刚好我之前用到的一个方法给大家分享一下. <!Doctype html><html> <head> ...

  3. 深入理解Java中的Garbage Collection

    前提 最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优.但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结.本文只针对Ho ...

  4. WPF——如何为项目设置全局样式。

    在项目中,需要为所有的Button.TextBox设置一个默认的全局样式,一个个的为多个控件设置相同的样式显然是不明智的.在WPF中可以通过资源设置全局样式,主要有俩种方法: 1.第一种就是先写好按钮 ...

  5. 怎样深入学习php,成为php高手!?

    本文章开头我想问一句话:PHP是做什么的? 因为这是面试中会问到的一个问题,虽然它看起来很简单,回答做网站的,也就是个简单建站的水平.回答做网站后端开发的,对PHP有了一定的认识,回答做后端处理的,有 ...

  6. crm-1

    1.crm 客户关系管理系统 :1.业务逻辑部分  2.权限插件 2.forms组件之modelform modelform就是model+form ,form根据model的字段生成标签 ,校验信息 ...

  7. JS基础语法---一元运算符

        *    ++  -- 都是运算符     *    ++ 和 --  可以分为:前+ 和后+  and   前- 和后-          *  如果++在后面:如: num++ +10参与 ...

  8. 配置oracle的ssl连接

    配置oracle的ssl连接   网上也没有中文资料,我硬着头皮看官方文档肯完,终于配置成功,下面是我配置步骤 配置安全套接层连接oracle 目录 1.        配置简介        1 2 ...

  9. Bn Bp Binder native层关系

    Servicemanager 源码在/frameworks/base/cmds/servicemanager/service_manager.c 编译成 systemmanager 可执行文件 sys ...

  10. easyui入门

    什么是easyui! easyui=jquery+html4(用来做后台的管理界面) 1.通过layout布局 我们先把该导的包导下 然后就是JSP页面布局 2.通过tree加载菜单 先来一个实体类 ...