ssh-keygen,openssl生成rsa密钥

799 阅读2分钟

前言

在生成rsa密钥之前,我们需要先了解以下pkcs1和pkcs8规范,这在我们编程的中使用太频繁了。我们只是在生成私钥的时候需要用到这两个规范(规范也没有提到公钥的存储格式),而公钥我们绝大数使用的是x509中的PKIX格式。另外在我的开发经历中PKCS8用的比较多PKCS1用的很少,但是需要注意的是oepnssl和ssh-keygen这些工具默认生成的格式都是pkcs1格式。如下是两个规范的简介:

PKCS1: 全名《Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications》最新版本2.2 (rfc8017, 有兴趣的同学可以读一下) ,从名称上可以看出它是针对RSA算法的一个规范。里面包含了RSA加密、解密、签名验签等所有的内容,当然也包含了私钥的格式。PKCS1的1.1版本是1991年发布的。
PKCS8: 全名《Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification》最新版本1.2,从名称上可以看出它是一个专门用来存储私钥的文件格式规范。PKCS1的1.2版本是2008年发布的。

这两个规范简单点说就是规定密钥的存储格式。由于PKCS1发布较早,当时非对称算法几乎只有RSA,所以规范比较局限于RSA算法,而PKCS8则比较全面。openssl和ssh-keygen都可以生成符合pkcs1规范和pkcs8规范的ras密钥,因为openssl的功能比较齐,所以我在工作中一般都使用openssl。

1.openssl

生成私钥(pkcs1)

openssl genrsa -out private_key_pkcs1.pem 2048

生成公钥(pkcs1)

openssl rsa -pubout -in private_key_pkcs1.pem -out public_key_pkcs8.pem

私钥转 pkcs1 to pkcs8 格式

openssl pkcs8 -topk8 -in private_key_pkcs1.pem -inform pem -out private_key_pkcs8.pem -outform pem -nocrypt

私钥 pkcs8 to pkcs1 格式

openssl rsa -in private_key_pkcs8.pem -out privateKeyPKCS1.pem

2.ssh-keygen

ssh生成私钥(pkcs1),格式可选择PKCS8/PEM/SSH2

ssh-keygen -t rsa -P  "123456" -b 2048 -C 张三 -m PEM -f ./id_rsa

转换私钥格式为PKCS8

ssh-keygen -P "123456"  -N "123456"  -e -p -m PKCS8 -f ./id_rsa

由于ssh-keygen创建的公钥是自己的规范,不属于常见的PKIX格式。需要从ssh私钥生成通用的公钥:

ssh-keygen -e -m PKCS8 -f ./id_rsa>./id_rsa.pub.pkcs8
openssl rsa -in ./id_rsa -pubout -outform PEM > ./id_rsa.pub.pkcs8

3.利用openssl自建ssl证书

  • key,pem 私钥
  • csr 证书请求
  • crt 证书

生成私钥

openssl genrsa -out pri.pem 2048

生成证书请求

openssl req -new -key pri.pem -out my.csr

查看生成的请求

可以看到这个请求文件并没有加密,已经包含了公钥信息以及证书请求的信息。

openssl req -text -in my.csr

对请求签名

openssl x509 -req -days 365 -in my.csr -signkey pri.pem  -out sign.crt

参考链接:www.jianshu.com/p/a428e183e…