首页域名资讯 正文

java处理加密文件—数字证书文件格式(cer和pfx)的区别

2025-02-18 1 0条评论

java处理加密文件中常见的两种数字证书文件格式(cer和pfx)

数字证书文件格式(cer和pfx)的区别
1.带有私钥的证书
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

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

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

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

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

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

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

在Security编程中,有几种典型的密码交换信息文件格式:
DER-encoded certificate: .cer, .crt
PEM-encoded message: .pem
PKCS#12 Personal Information Exchange: .pfx, .p12
PKCS#10 Certification Request: .p10
PKCS#7 cert request response: .p7r
PKCS#7 binary message: .p7b

.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
.pem跟crt/cer的区别是它以Ascii来表示。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式
p10是证书请求
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

其中,介绍如何从p12/pfx文件中提取密钥对及其长度:
1,首先,读取pfx/p12文件(需要提供保护密码)
2,通过别名(Alias,注意,所有证书中的信息项都是通过Alias来提取的)提取想要分析的证书链
3,再将其转换为一个以X509证书结构体
4,提取里面的项,如果把证书项放在第一位(单一证书),直接读取 x509Certs[0](见下面的代码)这个X509Certificate对象
5,X509Certificate对象有很多方法,读取RSA密钥(公私钥)及其长度(见?topicId=43786&forumId=55&),
X509Certificate keyPairCert = x509Certs[0];
int iKeySize = X509CertUtil.getCertificateKeyLength(keyPairCert);
System.out.println(“证书密钥算法=”+keyPairCert.getPublicKey().getAlgorithm());
System.out.println(“证书密钥长度=”+iKeySize);
提取了所需要的信息。

package  org.dev2dev.client.keypair;

import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileNotFoundException;
import  java.io.IOException;
import  java.security.KeyStore;
import  java.security.KeyStoreException;
import  java.security.NoSuchAlgorithmException;
import  java.security.NoSuchProviderException;
import  java.security.Security;
import  java.security.cert.Certificate;
import  java.security.cert.CertificateException;
import  java.security.cert.X509Certificate;
import  org.dev2dev.security.keytool.X509CertUtil;

public   class  LoadKeyFromPKCS12   {

public   static   void  main(String[] args)   {
try    {
//  Open an input stream on the keystore file
String pfxFileName = ” c:\\david.turing.pfx ” ;
String pfxPassword = ” 123456 ” ;

File fPkcs12  =   null ;
if  (pfxFileName  !=   null )   {
//  Open the file
fPkcs12  =   new  File(pfxFileName);
}

FileInputStream fis  =   new  FileInputStream(fPkcs12);

//  Create a keystore object
KeyStore keyStore  =   null ;
try
{
//  Need BC provider for PKCS #12, BKS and UBER
if  (Security.getProvider( ” BC ” )  ==   null )
{
throw   new  Exception( ” 不能Load入BouncyCastle! ” );
}

keyStore  =  KeyStore.getInstance( ” PKCS12 ” ,  ” BC ” );
}
catch  (KeyStoreException ex)
{
throw   new  Exception( ” 不能正确解释pfx文件! ” );
}
catch  (NoSuchProviderException ex)
{
throw   new  Exception( ” Security Provider配置有误! ” );
}

try
{
//  Load the file into the keystore
keyStore.load(fis, pfxPassword.toCharArray());
}
catch  (CertificateException ex)
{
throw   new  Exception( ” 证书格式问题! ” );
}
catch  (NoSuchAlgorithmException ex)
{
throw   new  Exception( ” 算法不支持! ” );
}
catch  (FileNotFoundException ex)
{
throw   new  Exception( ” pfx文件没找到 ” );
}
catch  (IOException ex)
{
throw   new  Exception( ” 读取pfx有误! ” );
}

// 获取证书链的中keyEntry的别名
Certificate[] certs  =  keyStore.getCertificateChain( ” david.turing ” );
X509Certificate[] x509Certs  =  nvertCertificates(certs);

if  (x509Certs  ==   null )
{
return ;
}

x509Certs  =  X509CertUtil.orderX509CertChain(x509Certs);

X509Certificate keyPairCert  =  x509Certs[ 0 ];

int  iKeySize  =  X509CertUtil.getCertificateKeyLength(keyPairCert);
System.out.println( ” 证书密钥算法= ” + keyPairCert.getPublicKey().getAlgorithm());
System.out.println( ” 证书密钥长度= ” + iKeySize);

}   catch  (Exception e)   {
e.printStackTrace();
}
}

}

相关搜索

  • pfx导出cer
  • pfx证书导出cer
  • java生成pfx cer
  • java pfx cer
  • pfx cer文件区别
  • cer pfx
  • pfx转cer
  • 生成cer公钥和pfx私钥
  • cer转pfx工具
文章版权及转载声明

本文作者:亿网 网址:https://edns.com/ask/post/163020.html 发布于 2025-02-18
文章转载或复制请以超链接形式并注明出处。