非对称密码-公私钥的创建

admin 2022年4月3日15:01:49评论246 views字数 3391阅读11分18秒阅读模式

简述

我们这里创建的并非SSL证书,而是一对公私钥,SSL证书只能说是公私钥加密的一种应用。

OpenSSL工具

OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现ssl协议。OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto。

生成私钥

openssl genrsa -out rsa_private_key.pem 2048 #生成密钥长度为2048的文本形式的私钥,如果不加长度,默认是1024长度的私钥。

非对称密码-公私钥的创建

生成公钥(由私钥计算产生)

首先要明白一点,公钥是公开透明的,私钥是独有的,我们想要的效果就是难以从公钥推出私钥,这就涉及到数学中的模运算了。从私钥生成公钥是通过正向的模运算算得的,计算机很快就能产生,但要反过来要计算机从公钥做逆模运算求得私钥,只要位数够长,就几乎是难以算出的。

因此公钥、私钥,都是成对出现的,公钥也是由私钥经过运算求得的。

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem  #由私钥文件生成公钥

非对称密码-公私钥的创建

Keytool工具

Keytool工具是JDK中自带的密钥管理工具,可以制作Keystore(jks)格式的证书文件

由于使用Keytool工具制作的公钥和私钥默认是不可以导出的,需要从已经创建好的.keystore文件中导出私钥。

https://www.cnblogs.com/mozq/p/11731598.html(keytool使用大全)

keystore(密钥库)是什么

这里需要注意的是,密钥库其实就是一种保存格式,通常为.jks、.pkcs12之类的。如果不知道是其后缀名被改了,不知道是什么格式,使用keytool list就能知道了,然后根据它的类型,才决定能否获取私钥。Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中,常用于SSL通信。在KeyStore中通常包含两种数据:• 密钥实体: 密钥(对称加密)或者是公私钥(非对称加密)• 可信任证书实体:公钥和证书信息。

所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,根据密钥库可以存储的条目以及密钥库如何存储条目,Java中有几种不同类型的密钥库:JKS,JCEKS,PKCS12,PKCS11和DKS。最常见的是JKS,JCEKS,PKCS12类型

一个简单的理解就是:把证书和密钥等信息放到一块统一保存的文件,其中根据不同的密钥库类型,为密钥提高了不同程度的保密。

JKS,Java Key Store

此密钥库是特定于Java平台的,通常具有jks的扩展名。此类型的密钥库可以包含私钥和证书,但不能用于存储密钥。由于它是Java特定的密钥库,因此不能在其他编程语言中使用。存储在JKS中的私钥无法在Java中提取。

目前,Java中的默认密钥库类型是JKS,即如果在使用keytool创建密钥库时未指定-storetype,则密钥库格式将为JKS.

JCEKS,JCE密钥库(Java Cryptography Extension KeyStore)

可以认为是增强式的JKS密钥库,支持更多算法。可以参考com.sun.crypto.provider.JceKeyStore类,此密钥库具有jceks的扩展名。可以放入JCEKS密钥库的条目是私钥,密钥和证书。此密钥库通过使用Triple DES加密为存储的私钥提供更强大的保护。

PKCS12

PKCS12,一种标准的密钥库类型,可以在Java和其他语言中使用。它通常具有p12或pfx的扩展名。可以在此类型上存储私钥,密钥和证书。与JKS不同,PKCS12密钥库上的私钥可以用Java提取。此类型是可以与其他语言(如C,C ++或C#)编写的其他库一起使用。默认密钥库类型将在Java 9中更改为PKCS12,因为与JKS相比,它具有增强的兼容性

PKCS11

硬件密钥库类型。为Java库提供了一个接口,用于连接硬件密钥库设备,如智能卡。可以参考sun.security.pkcs11.P11KeyStore类。此密钥库可以存储私钥,密钥和证书。加载密钥库时,将从密钥库中检索条目,然后将其转换为软件成勋可识别的条目;

BKS,BoucyCastle密钥库

是一种密钥库格式,提供了流行的第三方Java加密库提供程序–BouncyCastle。它是一个类似于Oracle JDK提供的JKS的密钥库。支持存储密钥,私钥和证书,经常用于移动应用程序开发。

创建密钥库,提取公式钥

keytool不能直接创建出一对公私钥,一般我们都是用它来创建一个自签名证书,然后从中提取公私钥的。

创建一个证书

keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "mykeystore.keystore"  -keysize 2048 -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass "123456" -storepass 123456 -validity 360 -storetype PKCS12#如上,我们就创建了一个mykeystore.keystore的密钥库,里面有一个别名为tomcat的PKCS12证书,其中使用的是RSA 2048的私钥, 该数字证书绑定的域名是localhost。密钥库的密码为123456,证书密码也是123456

非对称密码-公私钥的创建

参数说明:

-genkeypair 表示要创建一个新的密钥
-dname  表示密钥的Distinguished Names, 表明了密钥的发行者身份
CN=commonName 注:生成证书时,CN要和服务器的域名相同,如果在本地测试,则使用localhost
OU=organizationUnit
O=organizationName
L=localityName
S=stateName
C=country
-keyalg    使用加密的算法,这里是RSA
-keysize 密钥长度
-alias     和keystore关联的别名,这个alias通常不区分大小写
-keypass   私有密钥的密码,这里设置为 123456
-keystore   密钥保存路径
-storepass  存取密码
-validity    该密钥的有效期 (默认为90天)
-storetype 密钥库类型

从密钥库中提取公私钥

keytool -list -keystore mykeystore.keystore  #查看密钥库的密钥

非对称密码-公私钥的创建

keytool -exportcert -alias tomcat -keystore mykeystore.keystore -storepass 123456 -file key.cer #把证书从密钥库中导出来。

非对称密码-公私钥的创建

keytool -list -rfc -keystore mykeystore.keystore -storepass 123456 | openssl x509 -inform pem -pubkey #查看公钥

非对称密码-公私钥的创建

这里需要注意的是,我们前面创建的密钥库是PKCS12类型,这种密钥库直接就能够提取私钥。

openssl pkcs12 -in /home/momo/桌面/ssl/mykeystore.keystore -nocerts -nodes #直接提取私钥

非对称密码-公私钥的创建

JKS类型的密钥库提取公私钥

这种类型的密钥库,我们只需要将它转换成pkcs12类型的密钥库就能够正常提取公私钥了。

如图,直接提取是失败的

非对称密码-公私钥的创建

keytool -v -importkeystore -srckeystore mykeystore.jks -srcstoretype jks  -destkeystore mykeystore.pfx -deststoretype pkcs12   #将jks密钥库转成pkcs12类型
openssl pkcs12 -in /home/momo/桌面/ssl/mykeystore.pfx -nocerts -nodes   #提取私钥

非对称密码-公私钥的创建


关于我们


原文始发于微信公众号(风起专注的安全小屋):非对称密码-公私钥的创建

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月3日15:01:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   非对称密码-公私钥的创建http://cn-sec.com/archives/865943.html

发表评论

匿名网友 填写信息