openssl安装及生成RSA私钥及公钥

 openssl  openssl安装及生成RSA私钥及公钥已关闭评论
3月 172016
 

openssl生成公私钥时经常需要查下使用命令,今天整理下放在这里,到时好找些, 摘录自支付宝支付资料

RSA私钥及公钥生成

OpenSSL工具安装

  • Linux用户(以Ubuntu为例)
    sudo apt-get install openssl

  • Windows用户
    开发者可以在OpenSSL官方网站下载Windows的OpenSSL安装包进行安装。

RSA私钥及公钥生成

  • Linux用户(以Ubuntu为例)
    $ openssl 进入OpenSSL程序
    OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥
    OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式
    OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥
    OpenSSL> exit ## 退出OpenSSL程序

  • Windows用户在cmd窗口中进行以下操作:
    C:\Users\Hammer>cd C:\OpenSSL-Win32\bin 进入OpenSSL安装目录
    C:\OpenSSL-Win32\bin>openssl.exe 进入OpenSSL程序
    OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥
    OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式
    OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥
    OpenSSL> exit ## 退出OpenSSL程序

注意:对于使用Java的开发者,将pkcs8在console中输出的私钥去除头尾、换行和空格,作为开发者私钥,对于.NET和PHP的开发者来说,无需进行pkcs8命令行操作。

6月 162015
 

网上找到两个解决办法:

1. 找到openssl的配置文件openssl.cnf文件,修改下面节点的值为optional

stateOrProvinceName = optional 
organizationName = optional


2. stackoverflow中有提到:

openssl is encoding using UTF8STRING and keytool (Java 6) is encoding with PRINTABLESTRING.

Worked around it by changing the openssl configuration so it matches keytool..

找到openssl的配置文件openssl.cnf文件, 修改string_mask节点值为pkix

string_mask=pkix

但我自己使用第2个方法没有成功,使用第1个方法可以。

6月 162015
 

好文章一起分享下:http://www.gaojinbo.com/openssl-%E7%94%9F%E6%88%90%E8%87%AA%E7%AD%BE%E8%AF%81%E4%B9%A6.html

要生成证书的目录下建立几个文件和文件夹,有./demoCA/ ./demoCA/newcerts/  ./demoCA/index.txt ./demoCA/serial,在serial文件中写入第一个序列号“01”

1.生成X509格式的CA自签名证书 
$openssl req -new -x509 -keyout ca.key -out ca.crt

 

2.生成服务端的私钥(key文件)及csr 文件 
$openssl genrsa -des3 -out server.key 1024 
$openssl req -new -key server.key -out server.csr

 

3.生成客户端的私钥(key文件)及csr文件 
$openssl genrsa -des3 -out client.key 1024 
$openssl req -new -key client.key -out client.csr

 

4.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名 
$openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key 
$openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

 

5. 生成p12格式证书 
$openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx 
$openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx

 

6.生成pem格式证书 
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成 
$cat client.crt client.key> client.pem 
$cat server.crt server.key > server.pem

 

7.PFX文件转换为X509证书文件和RSA密钥文件 
$openssl pkcs12 -in server.pfx -nodes -out server.pem 
$openssl rsa -in server.pem -out server2.key 
$openssl x509 -in server.pem -out server2.crt

 

这样生成服务端证书:ca.crt, server.key, server.crt, server.pem, server.pfx,客户端证书:ca.crt, client.key, client.crt, client.pem, client.pfx

5月 292015
 

PKCS #8 使用 ASN.1 的 DER 编码规则。

openssl.exe/openssl 默认生成 PEM 格式的 RSA 密钥对(经过base64编码)。


1、生成pem格式私钥,  执行命令openssl genrsa -out rsa_private_key.pem 1024

rsa_private_key.pem内容类似下面:

—–BEGIN RSA PRIVATE KEY—–
MIICXQIBAAKBgQDfUZsrPhdVmGT5OcCKlUdQcaCeZtH7HyFEgAyuerfK3B/eOAv6
mBtf2lcZ5vCqrsdEKdT96rd3N2q9Cv1R0OryJMtZ9gwEhnRxSsyEd1/xSl4EOfmV
hqn8RGjBHbSpQuiCXwVicIzKIdmN4WM0dH1M/ZweLeVR75jI7DuQtpdTowIDAQAB
AoGBAJzn+q1sZ/rFI5UU5dq5Pi0gWSlStxDJc5dsnPxuzvoipeV93bTJ8NntUCur
3sceHHYhKjzqENQbxMxkj05QCvKdqZBjAImJvaObto4JeJPa7FEzIYiVqMfPoSOa
qIEp9LkJeGRy0x2stYvpxIfWwiOC/FKCw4bzK8tkfxb1q7+5AkEA80/Hy2MHWxRL
zhnEhIb+6TRWj5gaKZVbJn90t4AllC9tKrNDTBY0BKJwbsJvs+lbjtgMsvBL4+r+
0mhL4RWn/wJBAOr2644nbS5y8mSbnMX2PmXaphz7I1DuU7ynLuEU17qh08ucLkHy
p+Ik3A9wFfySLHUkwzZw8RUQlbkNpDhmtF0CQHFGUD7pILCPd2dBadNFQgHyIuaB
KpT3etMmfYE8wMIHfmxlvsv6fkc2FOAL15NL7htHjEn2Q26dpfrxIXpt6aMCQG5L
so9sWogvVTF9Cr6ytN/DH68DBLT86znnkM3/prTpOi6eBejXK4+wlcx5ZRjG1S+4
LhrkMYcd3eqcSLZhH9ECQQCxZc/g+hyzCPdx6BGv/0DJ3MQBC3MAJUcbyers4KHD
//O0hssHqy5vuRQ9wrQeXv0wF0HNkh6VioEUkCPGS4pg
—–END RSA PRIVATE KEY—–


2、生成公钥,执行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

rsa_public_key.pem内容类似下面

—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfUZsrPhdVmGT5OcCKlUdQcaCe
ZtH7HyFEgAyuerfK3B/eOAv6mBtf2lcZ5vCqrsdEKdT96rd3N2q9Cv1R0OryJMtZ
9gwEhnRxSsyEd1/xSl4EOfmVhqn8RGjBHbSpQuiCXwVicIzKIdmN4WM0dH1M/Zwe
LeVR75jI7DuQtpdTowIDAQAB
—–END PUBLIC KEY—–


有的程序需要PKCS8格式到私钥(PHP服务端语言读取私钥不需要PKCS8转换),使用下面命令:

3、将RSA私钥转换成PKCS8格式,命令执行openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

输出内容类似下面:

—–BEGIN PRIVATE KEY—–
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAN9Rmys+F1WYZPk5
wIqVR1BxoJ5m0fsfIUSADK56t8rcH944C/qYG1/aVxnm8Kqux0Qp1P3qt3c3ar0K
/VHQ6vIky1n2DASGdHFKzIR3X/FKXgQ5+ZWGqfxEaMEdtKlC6IJfBWJwjMoh2Y3h
YzR0fUz9nB4t5VHvmMjsO5C2l1OjAgMBAAECgYEAnOf6rWxn+sUjlRTl2rk+LSBZ
KVK3EMlzl2yc/G7O+iKl5X3dtMnw2e1QK6vexx4cdiEqPOoQ1BvEzGSPTlAK8p2p
kGMAiYm9o5u2jgl4k9rsUTMhiJWox8+hI5qogSn0uQl4ZHLTHay1i+nEh9bCI4L8
UoLDhvMry2R/FvWrv7kCQQDzT8fLYwdbFEvOGcSEhv7pNFaPmBoplVsmf3S3gCWU
L20qs0NMFjQEonBuwm+z6VuO2Ayy8Evj6v7SaEvhFaf/AkEA6vbrjidtLnLyZJuc
xfY+ZdqmHPsjUO5TvKcu4RTXuqHTy5wuQfKn4iTcD3AV/JIsdSTDNnDxFRCVuQ2k
OGa0XQJAcUZQPukgsI93Z0Fp00VCAfIi5oEqlPd60yZ9gTzAwgd+bGW+y/p+RzYU
4AvXk0vuG0eMSfZDbp2l+vEhem3powJAbkuyj2xaiC9VMX0KvrK038MfrwMEtPzr
OeeQzf+mtOk6Lp4F6Ncrj7CVzHllGMbVL7guGuQxhx3d6pxItmEf0QJBALFlz+D6
HLMI93HoEa//QMncxAELcwAlRxvJ6uzgocP/87SGywerLm+5FD3CtB5e/TAXQc2S
HpWKgRSQI8ZLimA=
—–END PRIVATE KEY—–

把上面内容复制到一个新文件中(包含BEGIN PRIVATE KEYEND PRIVATE KEY行-),任意起名,就得到了一个PKCS8格式到RSA私钥。

参考资料:

用途:

pkcs8格式的私钥转换工具。它处理在PKCS#8格式中的私钥文件。它可以用多样的PKCS#5 (v1.5 and v2.0)PKCS#12算法来处理没有解密的PKCS#8 PrivateKeyInfo格式和EncryptedPrivateKeyInfo格式。

用法:

  1. openssl pkcs8 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]   
  2. [-passout arg] [-topk8] [-noiter] [-nocrypt] [-nooct] [-embed] [-nsdb] [-v2 alg] [-v1 alg] [-engine id]  

选项说明:

-inform PEM|DER::输入文件格式,DER或者PEM格式。DER格式采用ASN1DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。

-outform DER|PEM:输出文件格式,DER或者PEM格式。

-in filename:输入的密钥文件,默认为标准输入。如果密钥被加密,会提示输入一个密钥口令。

-passin arg:输入文件口令保护来源。

-out filename:输出文件,默认为标准输出。如果任何加密操作已经执行,会提示输入一个密钥值。输出的文件名字不能和输入的文件名一样。

-passout arg:输出文件口令保护来源。

-topk8:通常的是输入一个pkcs8文件和传统的格式私钥文件将会被写出。设置了此选项后,位置转换过来:输入一个传统格式的私钥文件,输出一个PKCS#8格式的文件。

-noiterMAC保护计算次数为1

-nocryptPKCS#8密钥产生或输入一般用一个适当地密钥来加密PKCS#8 EncryptedPrivateKeyInfo结构。设置了此选项后,一个不加密的PrivateKeyInfo结构将会被输出。这个选项一直不加密私钥文件,在绝对必要的时候才能够使用。某些软件例如一些JAVA代码签名软件使用不加密的私钥文件。

-nooct这个选项产生的RSA私钥文件是一个坏的格式,一些软件将会使用。特别的是,私钥文件必须附上一个八位组字符串,但是一些软件仅仅包含本身的结构体没有使八位组字符串所环绕。不采用八位组表示私钥。

-embed:这个选项产生的RSA私钥文件是一个坏的格式。在私钥结构体中采用嵌入式DSA参数格式。在这个表单中,八位组字符串包含了ASN1 SEQUENCE中的两种结构:一个SEQUENCE包含了密钥参数,一个ASN1 INTEGER包含私钥值。

-nsdb:这个选项产生的RSA私钥文件是一个坏的格式并兼容了Netscape私钥文件数据库。采用NetscapeDBDSA格式。

v2 alg:采用PKCS#5 v2.0,并指定加密算法,默认的是PKCS#8私钥文件被叫做B<pbeWithMD5AndDES-CBC>(该算法用56字节的DES加密但是在PKCS#5 v1.5中有更加强壮的加密算法)的加密算法用口令进行加密。用B<-v2>选项,PKCS#5 v2.0相关的算法将会被使用,可以是des3168字节)和rc2128字节),推荐des3

-v1 alg:采用PKCS#5 v1.5pkcs12,并指定加密算法。可采用的算法见下面。

 -engine id:指定硬件引擎。

注意:

加密了的PEM编码PKCS#8文件表单用下面的头部和尾部:

—–BEGIN ENCRYPTED PRIVATE KEY—–

 —–END ENCRYPTED PRIVATE KEY—–

未加密的表单用:

—–BEGIN PRIVATE KEY—–

 —–END PRIVATE KEY—–

跟传统的SSLeay算法相比,用PKCS#5 v2.0系列的算法加密私钥,有更高的安全性以及迭代次数。于是附加的安全性是经过深思熟虑的。

默认的加密算法仅仅是56字节的,是因为它是PKCS#8所支持的最好的方法。

有一些软件使用PKCS#12基于密钥的加密算法来加密PKCS#8格式的私钥:它们会自动的处理但是没有选项来操作。

PKCS#8格式中,有可能的是输出DER编码格式的经过加密的私钥文件,是因为加密的详细说明包含在DER等级中,相反的是传统的格式包含在PEM邓丽中。

PKCS#5 v1.5 PKCS#12 算法:

各种各样的算法可以被选项-v1所使用。包含PKCS#5 v1.5 PKCS#12 算法。详细描述如下:

B<PBE-MD2-DES PBE-MD5-DES>:这两个算法包含在PKCS#5 v1.5中。它们仅仅提供56字节的保护,加密算法用DES

B<PBE-SHA1-RC2-64 PBE-MD2-RC2-64 PBE-MD5-RC2-64 PBE-SHA1-DES>:它们在传统的PKCS#5 v1.5中没有被提到,但是它们用同样地密钥引出算法,被一些软件所支持。在PKCS#5 v2.0中所提到。它们使用64字节的RC2以及56字节的DES

B<PBE-SHA1-RC4-128 PBE-SHA1-RC4-40 PBE-SHA1-3DES PBE-SHA1-2DES PBE-SHA1-RC2-128 PBE-SHA1-RC2-40>:它们是PKCS#12基于密钥的加密算法,它们允许使用高强度的加密算法,例如3des128位的RC2

实例:

3des算法将传统的私钥文件转换为PKCS#5 v2.0

  1. openssl pkcs8 -in key.pem -topk8 -v2 des3 -out enckey.pem  


PKCS#5 1.5兼容的DES算法将私钥文件转换为pkcs8文件:

[html] view plaincopy

  1. openssl pkcs8 -in ocspserverkey.pem -topk8 -out ocspkcs8key.pem  


PKCS#12兼容的3DES算法将私钥文件转换为pkcs8文件:

[html] view plaincopy

  1. openssl pkcs8 -in key.pem -topk8 -out enckey.pem -v1 PBE-SHA1-3DES  


读取一个DER格式加密了的PKCS#8格式的私钥:

  1. openssl pkcs8 -inform DER -nocrypt -in key.der -out key.pem  


转换一个PKCS#8格式的私钥到传统的私钥:

  1. openssl pkcs8 -in pk8.pem -out key.pem  


pkcs8中的私钥以明文存放:

[html] view plaincopy

  1. openssl pkcs8 -in ocspserverkey.pem -topk8  -nocrypt -out ocspkcs8key.pem  


标准:

PKCS#5 v2.0的测试向量的实现是以通告的形式用高强度的迭代次数算法3DESDESRC2来加密的。很多人要确认能够解密产生的私钥。

PKCS#8格式的DSA私钥文件没有备注文件中的:在PKCS#11 v2.01中的11.9节被隐藏了的。OpenSSL的默认DSA PKCS#8私钥格式隐藏在这个标准中。

BUGs

必须有一个选项打印使用的加密算法的其他详细细节,例如迭代次数。

PKCS#83DESPKCS#5 v2.0必须是默认的私钥文件:目前为了命令的兼容性。