PS:欢迎转载,但请注明出处,谢谢配合。

前言:

PEM是OpenSSL和许多其他SSL工具的标准格式,OpenSSL使用PEM文件格式存储证书和密钥。这种格式被设计用来安全的包含在ascii甚至富文本文档中,如电子邮件。这意味着您可以简单的复制和粘贴pem文件的内容到另一个文档中。

PEM文件是Base64编码的证书。PEM证书通常用于web服务器,因为他们可以通过一个简单的文本编辑器,很容易地转换成可读的数据。通常当一个PEM编码在文本编辑器中打开文件,它会包含不同的页眉和页脚。

-----BEGIN CERTIFICATE REQUEST----- and -----END CERTIFICATEREQUEST-----

CSR(证书签名请求)

-----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATEKEY-----

私钥

-----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----

证书文件

PKCS #8: Private-Key Information Syntax(语法) Standard(标准)

OpenSSL:是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

一、OpenSSL生成pem格式公私钥

1、生成RSA私钥

openssl genrsa -out rsa_private_key.pem1024

该命令会生成1024位的私钥,运行,如下图:

生成私钥文件rsa_private_key.pem,内容如下:

用记事本方式打开它,可以看到-----BEGIN RSA PRIVATE KEY-----开头,-----END

RSA PRIVATE KEY-----结尾的字符串,这个就是原始的私钥。

备注:

若运行openssl.exe,会进入OpenSSL命令行界面,此时输入命令时,则无需再写openssl。(只是该命令行界面中,暂时无法拷贝,本人太懒,不太喜欢)

2、RSA私钥转换成PKCS8格式

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem-outform PEM-nocrypt

可以看到,控制台打印出的内容,-----BEGIN PRIVATE KEY-----开头,-----END PRIVATE

KEY-----结尾的字符串,这个就是PKCS#8格式的私钥。

备注:

使用该命令,将私钥转成PKCS#8格式,但原rsa_private_key.pem文件中的私钥字符串并没有任何变化。但控制台输出的private

key,跟rsa_private_key.pem文件中的private key,不一样。若需使用PKCS8格式的私钥,即控制台中显示的私钥,将其拷贝出来即可。

切记:

opensslpkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM–nocrypt

“-”书写正确,上述–nocrypt,因为前面的“–”不是英文的,导致nocrypt失效,所以还需要输入密码。需要输入两次密码,运行,如下图:

可以看到,控制台打印出的内容,-----BEGIN ENCRYPTED PRIVATE KEY-----开头,-----END

ENCRYPTED PRIVATE KEY-----结尾的字符串,这个就是加了密的PKCS#8格式的私钥。

因为输入了密码,转换后的字符串不一样,会比加了-nocrypt的长一些,所以原来的程序解析不了该私钥字符串,会出错。

3、生成RSA公钥

openssl rsa -in rsa_private_key.pem-pubout -out rsa_public_key.pem

运行,如下图:

生成公钥文件rsa_public_key.pem,内容如下:

用记事本方式打开它,可以看到-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的字符串,这个就是公钥。

4、Java使用pem文件内容,示例代码

1)私钥签名

a)获取私钥

//获取KeyFactory,指定RSA算法

KeyFactorykeyFactory = KeyFactory.getInstance("RSA");

//将BASE64编码的私钥字符串进行解码

BASE64Decoderdecoder = newBASE64Decoder();

byte[] encodeByte = decoder.decodeBuffer(priKey);

//将BASE64解码后的字节数组,构造成PKCS8EncodedKeySpec对象,生成私钥对象

PrivateKeyprivatekey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodeByte));

b)使用私钥,对数据进行签名

//获取Signature实例,指定签名算法(本例使用SHA1WithRSA)

Signaturesignature = Signature.getInstance("SHA1WithRSA");

//加载私钥

signature.initSign(privatekey);

//更新待签名的数据

signature.update(plain.getBytes("UTF-8"));

//进行签名

byte[] signed = signature.sign();

//将加密后的字节数组,转换成BASE64编码的字符串,作为最终的签名数据

BASE64Encoderencoder = newBASE64Encoder();

return encoder.encode(signed);

2)公钥验签

a)获取公钥

//获取KeyFactory,指定RSA算法

KeyFactorykeyFactory = KeyFactory.getInstance("RSA");

//将BASE64编码的公钥字符串进行解码

BASE64Decoderdecoder = newBASE64Decoder();

byte[] encodeByte = decoder.decodeBuffer(pubKey);

//将BASE64解码后的字节数组,构造成X509EncodedKeySpec对象,生成公钥对象

PublicKeypublicKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodeByte));

b)使用公钥,进行验签

//获取Signature实例,指定签名算法(与之前一致)

Signaturesignature = Signature.getInstance("SHA1WithRSA");

//加载公钥

signature.initVerify(publicKey);

//更新原数据

signature.update(plain.getBytes("UTF-8"));

//公钥验签(true-验签通过;false-验签失败)

BASE64Decoderdecoder = newBASE64Decoder();

returnsignature.verify(decoder.decodeBuffer(sign));

备注:

验签时,签名数据需要先BASE64解码

java pem 读取_PEM_密钥对生成与读取方法相关推荐

  1. python读取文件名存到list_python读取文件名称生成list的方法

    下面为大家分享一篇python读取文件名称生成list的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 经常需要读取某个文件夹下所有的图像文件. 我使用python写了个简单的代码,读取 ...

  2. PEM_密钥对生成与读取方法

    前言: PEM是OpenSSL和许多其他SSL工具的标准格式,OpenSSL 使用PEM 文件格式存储证书和密钥.这种格式被设计用来安全的包含在ascii甚至富文本文档中,如电子邮件.这意味着您可以简 ...

  3. Web Service 简单实例(java 版本) ,IDE自动生成客户端代码方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.客户端工程 jar 包 : 二.1.  服务端:( new 一个web  service pro ...

  4. java读取ES配置生成ES管理类,获取ES连接

    java读取ES配置生成ES管理类,获取ES连接 1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询, ...

  5. java传入数据库生成柱状图_Java读取数据库数据生成柱状图

    此案例是用swing显示数据的.须要引入jfreechart相关包.不同版本号可能包不同样.本人用的是 此案例在ssi框架下会报错,不用框架就没问题. Java后台逻辑代码: public class ...

  6. java maven 读取 dbf 文件 生成 表结构 示例代码

    介绍 通过读取一个文件夹下所有dbf文件 然后生成sql 依赖 <dependency><groupId>com.github.albfernandez</groupId ...

  7. 前后端RSA互相加解密、加签验签、密钥对生成(Java)

    目录 一.序言 二.关于PKCS#1和PKCS#8格式密钥 1.简介 2.区别 二.关于JSEncrypt 三.关于jsrsasign 四.前端RSA加解密.加验签示例 1.相关依赖 2.crypto ...

  8. java 加载dll后打包_让Jacob从当前路径读取dll文件及相关打包方法

    让Jacob从当前路径读取dll文件及相关打包方法 独立观察员2013.08.12 Jacob  LibraryLoader.class修改版代码 功能:让jacob可在当前路径下的dll文件夹内读取 ...

  9. python生成表格文件_python 读取excel文件生成sql文件实例详解

    python 读取excel文件生成sql文件实例详解 学了python这么久,总算是在工作中用到一次.这次是为了从excel文件中读取数据然后写入到数据库中.这个逻辑用java来写的话就太重了,所以 ...

  10. 【转载】java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的): 一.通过jdk提供的java.util.Properties类. 此类继承自java.uti ...

最新文章

  1. 第2关:计算二叉树的深度和节点个数
  2. Consumer设计-high/low Level Consumer
  3. 毕业设计开题计算机进度安排表,关于2021届本科毕业设计选题情况及开题时间的通知...
  4. 带你少走弯路:强烈推荐的TensorFlow快速入门资料和翻译(可下载)
  5. python库路径_如何设置本地python库目录/ PYTHONPATH?
  6. GUI编程tkinter模块常用参数(python3)
  7. 福一中招聘计算机教师,2017福建福州一中招聘拟聘公示
  8. LAMP 系统性能调优
  9. 关于爬取网易云全部评论的一些疑问
  10. 微信团购小程序怎么做?一般要多少钱?
  11. 【​观察】玩客币更名“链克”背后 迅雷的区块链探索之路
  12. 开发者涨薪指南:提升软、硬实力
  13. 为什么在浏览器中不能使用搜狗输入法,而其他地方是可以的
  14. 菜鸟学exchange之五:监控exchange 邮件系统和队列查看器
  15. 精品展示案例(使用jQuery)
  16. 点云数据处理合集(二)点云数据处理
  17. Windows定时自动执行bat脚本命令
  18. 四阶段--day06-网关Gateway 应用实践
  19. 盒马-服务品牌设计的路上
  20. 面向方面情感分析的双句法感知图注意网络

热门文章

  1. Error in acquiring locks: Locks on the underlying objects cannot be acquired. retry after some time
  2. lisp 左手钢筋_左手键配置程序
  3. 软件需求的三个层次——业务需求、用户需求和功能需求的区别
  4. GBD+XGBOOST算法原理深入解析
  5. PLL Simulink行为模型
  6. 百思不得其姐关注模块的推荐关注中 右侧TableView刷新细节
  7. 免费的caj转word批量转换方法
  8. 2015年3月CCF软考试题
  9. java qua_Qua Vadis Eclipse? 第一部分
  10. ant design pro 关闭国际化语言