Java Keystore 与Openssl Pem 的转换

一般情况,生成证书会用到java的keytool生成自签名证书,用在tomcat、applet等场合,生成的证书都是二进制文件,不能直接在nginx、或需要pem的场合下使用,因此需要对其进行各种常用转换,下面是一个典型的使用场景。


1 利用keytool生成store并转换为PKCS#12

keytool -genkey -alias clusterkey -dname "CN=xxxx" -keyalg RSA -keystore cluster.store -storepass 123456 -keypass 123456


[root@kibana ssl]# keytool -importkeystore -srckeystore cluster.store -destkeystore cluster.store.p12 -srcstoretype JKS -deststoretype PKCS12
Enter destination keystore password:  
Re-enter new password: 
Enter source keystore password:  

Entry for alias clusterkey successfully imported.


2 生成certificate.pem和privatekey.pem

[root@kibana ssl]# openssl pkcs12 -nocerts -nodes -in cluster.store.p12 -out cluster-private-key.pem                                
Enter Import Password:
MAC verified OK


只复制“BEGIN CERTIFICATE”  “END CERTIFICATE” 到新文件 cert.pem
[
 pem里面内容(下的一样):
-----BEGIN CERTIFICATE-----
。。。。
-----END CERTIFICATE-----
]
只复制 “BEGIN RSA PRIVATE KEY”   “END RSA PRIVATE KEY” 到新文件private.pem


3keytool导出certificate后则可以使用:


keytool -export -alias clusterkey -file cluster-pub.cer -keystore cluster.store -storepass 123456

openssl x509 -in cluster-pub.cer -inform DER -out cluster-pub.pem -outform PEM


3 Ngix配置


 openssl pkcs12 -in cluster.store.p12  -nodes -nocerts -out server.key
 openssl pkcs12 -in cluster.store.p12  -nodes -nokeys -clcerts -out server.crt



http://www.cnblogs.com/interdrp/p/4880891.html

nginx配置如下:

server {
        listen       443;
        server_name  localhost;

        ssl                  on;
        ssl_certificate      /test/server.crt;
        ssl_certificate_key  /test/server.key;

        ssl_session_timeout  5m;
    }



参考:

http://blog.chinaunix.net/uid-26575352-id-3073802.html

常见证书格式及相互转换

PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 15 个标准。 常用的有:
PKCS#7 Cryptographic Message Syntax Standard
PKCS#10 Certification Request Standard
PKCS#12 Personal Information Exchange Syntax Standard
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 privatekey.pem
openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
openssl pkcs12 -nodes -in ./cert.p12 -out ./cert_key.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

九 cer 到 pem
openssl x509 -in aps_developer.cer -inform DER -out aps_developer.pem -outform PEM

十 der 到 pem
der和cer是一样的,如果openssl x509不能load证书,报如下错:
unable to load certificate
就说明不是一个证书,用下面的命令试一下,因为der也可能是一个csr转换格式后的文件:
openssl req -inform der -outform pem -in ./customer.der -out ./customer.csr
十一、密钥去掉加密(使用时不用手动输入密码)
openssl rsa -in customerPrivateKey.pem -out ./customerPrivateKey_unenrypted.pem
十二、合成证书和密钥
cat ./customerPrivateKey_unenrypted.pem ./mdm_push_cert.pem > merger2.pem

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

http://blog.csdn.net/jiayanhui2877/article/details/7288987

常见数字证书及协议介绍

证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSRCRTCRL 、OCSP、SCEP等。

PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:

  1. 内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
  2. 头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
  3. 信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。

使用PEM格式存储的证书:

($ openssl x509 -in ./cacert.pem -text    )

—–BEGIN CERTIFICATE—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE—–
使用PEM格式存储的私钥:
—–BEGIN RSA PRIVATE KEY—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END RSA PRIVATE KEY—–
使用PEM格式存储的证书请求文件:
—–BEGIN CERTIFICATE REQUEST—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE REQUEST—–

DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。
PFX 或 P12 – 公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件。通常可以将Apache/OpenSSL使用的“KEY文件 +CRT文件”格式合并转换为标准的PFX文件,你可以将PFX文件格式导入到微软IIS 5/6、微软ISA、微软Exchange Server等软件。转换时需要输入PFX文件的加密密码。
JKS – 通常可以将Apache/OpenSSL使用的“KEY文件 +CRT文件”格式”转换为标准的Java Key Store(JKS)文件。JKS文件格式被广泛的应用在基于JAVA的WEB服务器、应用服务器、中间件。你可以将JKS文件导入到TOMCAT、 WEBLOGIC 等软件。
KDB – 通常可以将Apache/OpenSSL使用的“KEY文件 +CRT文件”格式转换为标准的IBM KDB文件。KDB文件格式被广泛的应用在IBM的WEB服务器、应用服务器、中间件。你可以将KDB文件导入到IBM HTTP Server、IBM Websphere 等软件。
CSR - 证书请求文件(Certificate Signing Request)。生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由 CA 来签发证书。大致过程如下(X509 证书申请的格式标准为 pkcs#10 和 rfc2314):

  1. 用户生成自己的公私钥对;
  2. 构造自己的证书申请文件,符合 PKCS#10 标准。该文件主要包括了用户信息、公钥以及一些可选的属性信息,并用自己的私钥给该内容签名;
  3. 用户将证书申请文件提交给 CA;
  4. CA 验证签名,提取用户信息,并加上其他信息(比如颁发者等信息),用 CA 的私钥签发数字证书;
  5. 说明:数字证书(如x.509)是将用户(或其他实体)身份与公钥绑定的信息载体。一个合法的数字证书不仅要符合 X509 格式规范,还必须有 CA的签名。用户不仅有自己的数字证书,还必须有对应的私钥。X509v3数字证书主要包含的内容有:证书版本、证书序列号、签名算法、颁发者信息、有效时间、持有者信息、公钥信息、颁发者 ID、持有者 ID 和扩展项。

OCSP– 在线证书状态协议(OCSP,Online Certificate StatusProtocol,rfc2560)用于实时表明证书状态。OCSP 客户端通过查询 OCSP服务来确定一个证书的状态,可以提供给使用者一个或多个数字证书的有效性资料,它建立一个可实时响应的机制,让用户可以实时确认每一张证书的有效性,解决由CRL引发的安全问题。。OCSP 可以通过 HTTP协议来实现。rfc2560 定义了 OCSP 客户端和服务端的消息格式。
CER  - 一般指使用DER格式的证书。der和cer是一样的,都是一个证书,cer是windows上用的。
CRT - 证书文件。可以是PEM格式。
KEY   - 一般指PEM格式的私钥文件。
CRL- 证书吊销列表 (Certification Revocation List) 是一种包含撤销的证书列表的签名数据结构。CRL是证书撤销状态的公布形式,CRL 就像信用卡的黑名单,用于公布某些数字证书不再有效。CRL是一种离线的证书状态信息。它以一定的周期进行更新。CRL 可以分为完全 CRL和增量 CRL。在完全 CRL中包含了所有的被撤销证书信息,增量 CRL 由一系列的 CRL 来表明被撤销的证书信息,它每次发布的 CRL 是对前面发布 CRL的增量扩充。基本的 CRL 信息有:被撤销证书序列号、撤销时间、撤销原因、签名者以及 CRL 签名等信息。基于 CRL的验证是一种不严格的证书认证。CRL 能证明在 CRL 中被撤销的证书是无效的。但是,它不能给出不在 CRL中的证书的状态。如果执行严格的认证,需要采用在线方式进行认证,即 OCSP认证。一般是由CA签名的一组电子文档,包括了被废除证书的唯一标识(证书序列号),CRL用来列出已经过期或废除的数字证书。它每隔一段时间就会更新,因此必须定期下载该清单,才会取得最新信息。
SCEP - 简单证书注册协议。基于文件的证书登记方式需要从您的本地计算机将文本文件复制和粘贴到证书发布中心,和从证书发布中心复制和粘贴到您的本地计算机。 SCEP可以自动处理这个过程但是CRLs仍然需要手工的在本地计算机和CA发布中心之间进行复制和粘贴。
PKCS7 – 加密消息语法(pkcs7),是各种消息存放的格式标准。这些消息包括:数据、签名数据、数字信封、签名数字信封、摘要数据和加密数据。
PKCS12 – pkcs12 (个人数字证书标准)用于存放用户证书、crl、用户私钥以及证书链。pkcs12 中的私钥是加密存放的。


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

数字证书cer和pfx的区别

作为文件形式存在的证书一般有这几种格式:

  1.带有私钥的证书

  由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

  2.二进制编码的证书

  证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。

  3.Base64编码的证书

证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。

    如果客户端与网站通信时需要用到私钥(基本所有需要数字证书的网站都会用到私钥),则cer证书是无法正常访问网站的,网站会提示“该页要求客户证书”。

    由于cer证书只包含公钥信息,一般只能用于解密使用(解密该公钥对应的私钥加密的数据)。

  在pfx证书的导入过程中有一项是“标志此密钥是可导出的。这将您在稍候备份或传输密钥”。一般是不选中的,如果选中,别人就有机会备份你的密钥了。如果是不选中,其实密钥也导入了,只是不能再次被导出。这就保证了密钥的安全。

  如果导入过程中没有选中这一项,做证书备份时“导出私钥”这一项是灰色的,不能选。只能导出cer格式的公钥。如果导入时选中该项,则在导出时“导出私钥”这一项就是可选的。

  如果要导出私钥(pfx),是需要输入密码的,这个密码就是对私钥再次加密,这样就保证了私钥的安全,别人即使拿到了你的证书备份(pfx),不知道加密私钥的密码,也是无法导入证书的。相反,如果只是导入导出cer格式的证书,是不会提示你输入密码的。因为公钥一般来说是对外公开的,不用加密


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

证书与编码

http://www.360doc.com/content/13/1125/11/12430356_331996097.shtml


本至上,X.509证书是一个数字文档,这个文档根据RFC 5280来编码并/或签发。

实际上,“X.509证书”经常被用来指代IETF的PKIX(Public Key Infrastructure)证书和X.509 v3 证书标准中的CRL(Certificate Revocation List)。


X509 文件扩展名

首先我们要理解文件的扩展名代表什么。DER、PEM、CRT和CER这些扩展名经常令人困惑。很多人错误地认为这些扩展名可以互相代替。尽管的确有时候有些扩展名是可以互换的,但是最好你能确定证书是如何编码的,进而正确地标识它们。正确地标识证书有助于证书的管理。


编码 (也用于扩展名)

  • .DER = 扩展名DER用于二进制DER编码的证书。这些证书也可以用CER或者CRT作为扩展名。比较合适的说法是“我有一个DER编码的证书”,而不是“我有一个DER证书”。
  • .PEM = 扩展名PEM用于ASCII(Base64)编码的各种X.509 v3 证书。文件开始由一行"—– BEGIN …“开始。

常用的扩展名

  • .CRT = 扩展名CRT用于证书。证书可以是DER编码,也可以是PEM编码。扩展名CER和CRT几乎是同义词。这种情况在各种unix/linux系统中很常见。
  • CER = CRT证书的微软型式。可以用微软的工具把CRT文件转换为CER文件(CRT和CER必须是相同编码的,DER或者PEM)。扩展名为CER的文件可以被IE识别并作为命令调用微软的cryptoAPI(具体点就是rudll32.exe cryptext.dll, CyrptExtOpenCER),进而弹出一个对话框来导入并/或查看证书内容。
  • .KEY = 扩展名KEY用于PCSK#8的公钥和私钥。这些公钥和私钥可以是DER编码或者PEM编码。

CRT文件和CER文件只有在使用相同编码的时候才可以安全地相互替代。


Nginx SSL 配置:证书文件制作
http://blog.sina.com.cn/s/blog_4b81125f0100ky4e.html

一、制作负载均衡使用的证书文件
 从相关部门获取对应的证书文件(my.jks)、证书的密码(mypass)、证书对应的名称,通常为IP或者域名(myalias),
 通常jks文件包含了服务器的私钥(server.key),服务器证书(server.crt)、根证书(ca.crt)
二、通过java的keytool工具导出成 PKCS12 格式文件(my.p12)
 
 keytool -importkeystore -srckeystore my.jks -destkeystore my.p12 -srcstoretype JKS -deststoretype PKCS12  \
  -srcstorepass mypass -deststorepass mypass -srcalias myalias -destalias myalias -srckeypass mypass -destkeypass mypass -noprompt
 
 上述命令在一行执行
 
三、使用openssl把PKCS12文件(my.p12)转换成我们需要的pem文件(my.pem)

 openssl pkcs12 -in my.p12 -out my.pem -passin pass:mypass -passout pass:mypass

四、分离my.pem文件,导出服务器配置所需文件
 my.pem一个文件里面实际上包含了服务器做双向SSL证书认证的所有文件,打开my.pem能查看所有的key和证书
 
 得到配置服务器使用的 server.crt,server.key,ca.crt 文件,上述访问的命令分别为:
 openssl pkcs12 -in my.p12  -nodes -nocerts -out server.key
 openssl pkcs12 -in my.p12  -nodes -nokeys -clcerts -out server.crt
 openssl pkcs12 -in my.p12  -nodes -nokeys -cacerts -out ca.crt
 
 
 
五、配置NGINX
  ssl  on;
  ssl_certificate  /path/to/server.crt;
  ssl_certificate_key  /path/to/server.key;                              
  ssl_client_certificate /path/to/ca.crt;
  ssl_verify_client on; 
  
  # 此行方便在java中能够得到证书信息
  proxy_set_header    X-Forwarded-Proto https;
 
六、上述配置后,在重新启动服务器的时候,老是让你输入私有key的密码,为此

  openssl rsa -in server.key -out server.key.unsecure
  修改NGINX配置:
  ssl_certificate_key  /path/to/server.key.unsecure;



你可能感兴趣的:(java,linux,ssl,OpenSSL)