有个需求:iOS客户端给密码RSA加密,传到java后台,解密。JAVA和IOS各自找了RSA的算法实现代码,都能正常根据密钥对加解密。问题是各自使用对方的密钥对就不能加解密成功。

原来在用mac自带的openssl生成的密钥对文件是X509编码格式的。而JAVA所需的私钥文件是PKCS#8编码格式的,所以要将在mac系统中生成的私钥文件转下码就行了。


常见证书格式及相互转换

PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 15 个标准。 
常用的有:
PKCS#7 Cryptographic Message Syntax Standard
PKCS#10 Certification Request Standard
PKCS#12 X.509是常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI) 制定的 ITU-T X509 国际标准。
 PKCS#7 常用的后缀是: .P7B .P7C .SPC
 PKCS#12 常用的后缀有: .P12 .PFX
 X.509 DER 编码(ASCII)的后缀是: .DER .CER .CRT
 X.509 PAM 编码(Base64)的后缀是: .PEM .CER .CRT
 .cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
 .pem跟crt/cer的区别是它以Ascii来表示。
 pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式
 p10是证书请求
 p7r是CA对证书请求的回复,只用于导入
 p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。—————-
 der,cer文件一般是二进制格式的,只放证书,不含私钥
 crt文件可能是二进制的,也可能是文本格式的,应该以文本格式居多,功能同der/cer
 pem文件一般是文本格式的,可以放证书或者私钥,或者两者都有
 pem如果只含私钥的话,一般用.key扩展名,而且可以有密码保护
 pfx,p12文件是二进制格式,同时含私钥和证书,通常有保护密码
 怎么判断是文本格式还是二进制?用记事本打开,如果是规则的数字字母,如
 —–BEGIN CERTIFICATE—–
 MIIE9jCCA96gAwIBAgIQVXD9d9wgivhJM//a3VIcDjANBgkqhkiG9w0BAQUFADBy
 —–END CERTIFICATE—–就是文本的,上面的—–BEGIN CERTIFICATE—–,说明这是一个证书
如果是—–BEGIN RSA PRIVATE KEY—–,说明这是一个私钥
 文本格式的私钥,也可能有密码保护
 文本格式怎么变成二进制? 从程序角度来说,去掉前后的—-行,剩下的去掉回车,用base64解码,就得到二进制了
 不过一般都用命令行openssl完成这个工作
一 用openssl创建CA证书的RSA密钥(PEM格式):
 openssl genrsa -des3 -out ca.key 1024二 用openssl创建CA证书(PEM格式,假如有效期为一年):
 openssl req -new -x509 -days 365 -key ca.key -out ca.crt -config openssl.cnf
 openssl是可以生成DER格式的CA证书的,最好用IE将PEM格式的CA证书转换成DER格式的CA证书。三 x509到pfx
 pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx四 PEM格式的ca.key转换为Microsoft可以识别的pvk格式。
 pvk -in ca.key -out ca.pvk -nocrypt -topvk五 PKCS#12 到 PEM 的转换
 openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
 验证 openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem六 从 PFX 格式文件中提取私钥格式文件 (.key)
 openssl pkcs12 -in mycert.pfx -nocerts -nodes -out mycert.key七 转换 pem 到到 spc
 openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
 用 -outform -inform 指定 DER 还是 PAM 格式。例如:
 openssl x509 -in Cert.pem -inform PEM -out cert.der -outform DER八 PEM 到 PKCS#12 的转换
 openssl pkcs12 -export -in Cert.pem -out Cert.p12 -inkey key.pem
九 从用户证书 server.crt提取出公钥文件
 openssl x509 -outform PEM -in server/server.crt -pubkey -out server/server.pubkey

 -----BEGIN PUBLIC KEY-----
 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYhJizzt4+zhLMTSjDk0rd6MlK
 xBYKIp972+Wc9KSpOs5LGQ+2802mlr6dSDWJJhJShArqOIKgxNE7ZBZYlGeDo4l6
 Dm4DyVFpu62fObgk6vmU8T7nvF8Uo7sQdpfqgUjofGFgUDjB3fYgKUTp+kOj6RMh
 R3uttrZmOraF/rEUkQIDAQAB
 -----END PUBLIC KEY-----


 可以显示公钥信息,手动将其中内容复制到一个文件中做公钥测试成功,但是此命令输出的文件内容不是公钥信息,内容如下:
 -----BEGIN CERTIFICATE-----
 MIICpTCCAg6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJjbjEQ
 MA4GA1UECBMHYmVpamluZzEMMAoGA1UEChMDYW9lMRYwFAYDVQQDEw13d3cuenlu
 ZXQubXRuMB4XDTEzMDYwMjAxMjIxNloXDTE0MDYwMjAxMjIxNlowbzELMAkGA1UE
 BhMCY24xEDAOBgNVBAgMB2JlaWppbmcxDDAKBgNVBAoMA0FPRTEPMA0GA1UEAwwG
 d2l6YXJkMQwwCgYDVQQLDANjb3AxITAfBgkqhkiG9w0BCQEWEnd6aGgxOTg4QGdt
 YWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA2ISYs87ePs4SzE0o
 w5NK3ejJSsQWCiKfe9vlnPSkqTrOSxkPtvNNppa+nUg1iSYSUoQK6jiCoMTRO2QW
 WJRng6OJeg5uA8lRabutnzm4JOr5lPE+57xfFKO7EHaX6oFI6HxhYFA4wd32IClE
 6fpDo+kTIUd7rba2Zjq2hf6xFJECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgB
 hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE
 FOhSP6PH+gt+PZjgIjhLGMMakFfMMB8GA1UdIwQYMBaAFMy18STW93imC2lMDsqI
 i6P0N+1hMA0GCSqGSIb3DQEBBQUAA4GBAH5nNEEP9HeBI7osag8SKRwu4VICQl5W
 AkHv08/kbVxd8B6ieI9si+DpHMQMl5Uk44Vz164aEAlkJFL3UEt8XJPpnYmrEM5X
 jdF4+VmQqPcxsSlxRmk60VMpR+cTZURPweKtbTD8WkszaShG263k+4GWuiERxVJu
 uL1TUTvMbg6B
 -----END CERTIFICATE-----

 直接输入  openssl x509 -in ca.crt -pubkey
 会看到两个公钥输出,如果将它转换成der格式文件的公钥文件,则没有任何多余输出
 openssl x509 -in ca.crt -inform PEM -out ca.der -outform DER
十 openssl从PFX导出私钥、公钥
 从pfx提取密钥信息,并转换为key格式(pfx使用pkcs12模式补足)
 1、提取密钥对(如果pfx证书已加密,会提示输入密码。)
        openssl pkcs12 -in 1.pfx -nocerts -nodes -out 1.key
 2、从密钥对提取私钥
        openssl rsa -in  1.key -out 1_pri.key
 3、从密钥对提取公钥
        openssl rsa -in 1.key -pubout -out 1_pub.key
 4、因为RSA算法使用的是pkcs8模式补足,需要对提取的私钥进一步处理
        openssl pkcs8 -in 1_pri.key -out 1_pri.p8 -outform der -nocrypt -topk8
密钥库文件格式【Keystore】
格式     :  JKS
  扩展名  : .jks/.ks
  描述     : 【Java Keystore】密钥库的Java实现版本,provider为SUN
  特点     :  密钥库和私钥用不同的密码进行保护
  
 格式     :  JCEKS
  扩展名  :  .jce
  描述     : 【JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE
  特点     :  相对于JKS安全级别更高,保护Keystore私钥时采用TripleDES
  
 格式     :  PKCS12
 扩展名  :  .p12/.pfx
  描述     : 【PKCS #12】个人信息交换语法标准
  特点     :  1、包含私钥、公钥及其证书
                2、密钥库和私钥用相同密码进行保护
  
 格式     :  BKS
  扩展名  : .bks
  描述     :  Bouncycastle Keystore】密钥库的BC实现版本,provider为BC
  特点     :  基于JCE实现
  
 格式     : UBER
 扩展名  : .ubr
  描述     : 【Bouncycastle UBER Keystore】密钥库的BC更安全实现版本,provider为BC 
证书文件格式【Certificate】 
格式          :  DER 
 扩展名       :  .cer/.crt/.rsa  描述          : 【ASN .1 DER】用于存放证书 
 特点          :  不含私钥、二进制 格式          :  PKCS7 
扩展名       : .p7b/.p7r 
 描述          : 【PKCS #7】加密信息语法标准  特点          : 1、p7b以树状展示证书链,不含私钥
                   2、p7r为CA对证书请求签名的回复,只能用于导入 格式          :  CMS 
 扩展名       :  .p7c/.p7m/.p7s 
 描述          : 【Cryptographic Message Syntax】 
 特点          : 1、p7c只保存证书
                   2、p7m:signature with enveloped data
                   3、p7s:时间戳签名文件
  
格式          :  PEM
 扩展名       : .pem 
 描述          : 【Printable Encoded Message】 
 特点          : 1、该编码格式在RFC1421中定义,其实PEM是【Privacy-Enhanced Mail】的简写,但他也同样广泛运用于密钥管理
                   2、ASCII文件
                   3、一般基于base 64编码 格式         :  PKCS10 
 扩展名      : .p10/.csr 
 描述         : 【PKCS #10】公钥加密标准【Certificate Signing Request】
 特点         :  1、证书签名请求文件
                   2、ASCII文件
                   3、CA签名后以p7r文件回复 格式         :  SPC 
 扩展名      : .pvk/.spc 
 描述         : 【Software Publishing Certificate】 
 特点         :  微软公司特有的双证书文件格式,经常用于代码签名,其中
                   1、pvk用于保存私钥
                   2、spc用于保存公钥