PEM_密钥对生成与读取方法
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
位的私钥,运行,如下图:
生成私钥文件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解码
PEM_密钥对生成与读取方法的更多相关文章
- ECDSA密钥对生成以及在Token中的应用
1 概述 本文主要讲述了如何利用Openssl生成ECDSA密钥对,并利用Auth0库进行Token生成及验证的过程. 2 ECDSA 2.1 简介 ECC(Elliptic Curve Crypto ...
- mvn生成runnablejar 的方法
主要讲3点,生成runnable jar 方法1是生成一个目录 方法2是直接一个runnable的jar 方法3是关于包含spring工程的情况 方法2和3其实是一致的 1.生成runnable j ...
- jquery-qrcode 生成和读取二维码
首先要导入jar包(生成二维码的jar和读取二维码的jar) 生成二维码: package com.imooc.qrcode; import java.awt.Color; import java.a ...
- iOS开发 - 二维码的生成与读取
二维码的生成 从iOS7開始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk眼下不支持64位处理器 生成二维码的步骤: 导入CoreImage框架 通过滤镜CIFilter生成二维码 二维 ...
- exiftool生成XMP文件方法
ExifTool是一个独立于平台的Perl库,另外还有一个命令行应用程序,用于读取,编写和编辑各种文件中的元信息.ExifTool支持许多不同的元数据格式,包括EXIF,Gps,IPTC,XMP,JF ...
- .net又一个生成缩略图的方法,不变形
生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...
- .net又一个生成缩略图的方法,不变形,非常好用
生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...
- php 依据字符串生成相应数组方法
php 依据字符串生成相应数组方法 比如: <?php $config = array( 'project|page|index' => 'content', 'project|page| ...
- C#生成缩略图的方法
1.需要添加应用System.Drawing.dll 2.命名空间 using System.IO; using System.Drawing; using System.Drawing.Imagin ...
随机推荐
- CentOS 7 网络配置、远程访问
网络配置(配置固定IP访问) 相关命令 ip add 查看网卡状态 ifup eth0 打开端口eth0 ifdown eth0 关闭端口eth0 dhclient 自动获取IP mii-tool e ...
- Scala中的“=>”和“<-”
“=>”符号大概可以看做是创建函数实例的语法糖,例如 args.foreach(arg => println(arg)) 大概可以看做 args.foreach(Function(arg) ...
- HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)
http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. 接下来n行,每行两 ...
- 16、cgminer学习之:pthread_mutex_init和pthread_cond_init
1.原理 假设有两个线程同时访问一个全局变量 n,这个全局变量的初始值等于0. Int n = 0 ; 消费者线程 A 进入临界区,访问 n,A 必须等到 n 大于 0 才能接着往下执行,如果 n= ...
- update进行跨表之间的更新
有时我们可能须要多个表之间进行更新数据. 我们能够使用这个语句 UPDATE table1,table2 SET table1.column=table2.column, table1.column1 ...
- maven插件介绍之tomcat7-maven-plugin
tomcat7-maven-plugin插件的pom.xml依赖为: <dependency> <groupId>org.apache.tomcat.maven</gro ...
- amazeui学习笔记--css(常用组件3)--按钮组Button-group
amazeui学习笔记--css(常用组件3)--按钮组Button-group 一.总结 1.按钮组用法:把一系列要使用的 .am-btn 按钮放入 .am-btn-group . 2.按钮工具栏: ...
- Socket 长连接与短连接,心跳
长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 短连接是指通信双方有数据交互时 ...
- Altium Designer中敷铜和板子一样大
- equals、HashCode与实体类的设计
equals和HashCode都是用来去重的,即判断两个对象是否相等.如果是String类则我们直接用.equals()判断,如果是我们自己定义的类,需要有自己的判断方法,重写equals,如果是集合 ...