`
security
  • 浏览: 379482 次
  • 来自: www.pgp.org.cn
社区版块
存档分类
最新评论

如何从pfx/p12文件中提取RSA密钥长度及其他相关信息

阅读更多

在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对象有很多方法,tain198127网友希望读取RSA密钥(公私钥)及其长度(见http://www.matrix.org.cn/thread.shtml?topicId=43786&forumId=55&#reply),那真是太Easy了,
            X509Certificate keyPairCert = x509Certs[0];
            int iKeySize = X509CertUtil.getCertificateKeyLength(keyPairCert);
            System.out.println("证书密钥算法="+keyPairCert.getPublicKey().getAlgorithm());
            System.out.println("证书密钥长度="+iKeySize);
提取了他所需要的信息。

下面的代码来自于我的SecureX项目(https://sourceforge.net/projects/securex)的一部分,仅供参考,可以运行,但需要安装BouncyCastle。

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 
=  X509CertUtil.convertCertificates(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();
        }
        
    }


}
另外,我会调用其他一个工具类X509Utils来分析证书结构
package org.dev2dev.security.keytool;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SignatureException;
import java.security.cert.CRLException;
import java.security.cert.CertPath;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509CRL;
import java.security.cert.X509Certificate;
import java.security.spec.DSAPublicKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.ResourceBundle;
import java.util.Vector;

import org.bouncycastle.asn1.DEROutputStream;
import org.bouncycastle.asn1.x509.X509Name;
import org.bouncycastle.jce.PKCS10CertificationRequest;
import org.bouncycastle.jce.X509Principal;
import org.bouncycastle.jce.X509V1CertificateGenerator;

public final class X509CertUtil extends Object
{
    
/** *//** Resource bundle */
    
private static ResourceBundle m_res = ResourceBundle.getBundle("org/dev2dev/security/keytool/resources");

    
/** *//** Type name for X.509 certificates */
    
private static final String X509_CERT_TYPE = "X.509";

    
/** *//** PKCS #7 encoding name */
    
private static final String PKCS7_ENCODING = "PKCS7";

    
/** *//** Begin certificate in RFC 1421 encoding */
    
private static final String BEGIN_CERT = "-----BEGIN CERTIFICATE-----";

    
/** *//** End certificate in RFC 1421 encoding */
    
private static final String END_CERT = "-----END CERTIFICATE-----";

    
/** *//** The maximum length of lines in printable encoded certificates */
    
private static final int CERT_LINE_LENGTH = 64;

    
/** *//** Begin certificate signing request */
    
private static final String BEGIN_CERT_REQ = "-----BEGIN CERTIFICATE REQUEST-----";

    
/** *//**
分享到:
评论
1 楼 danni505 2009-05-19  
最近在做这个方面的东西,很受用!
如果可以希望能和你交流下。
MSN:danni-505@htomail.com

相关推荐

    制作RSA非对称加密证书(pfx\der)openssl

    使用`openssl genpkey`命令生成一对RSA密钥。例如,创建一个2048位的密钥对: ``` openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048 ``` 这将在当前目录下生成一个名为`private...

    将P12/PFX导入支持CSP的设备的工具源码

    本源码包的目标是实现一个工具,该工具能够将P12/PFX文件中的数字证书和密钥对导入到这些支持CSP的设备中。这里的关键步骤可能包括: 1. **读取P12/PFX文件**:使用特定的API(如Windows API的`CryptAcquireContext...

    通过RSA证书提取XML/PEM公钥私钥

    3. **提取公钥和私钥信息**:解密后,可以获取到RSA密钥对的结构体,从中提取出公钥和私钥的模数、指数等参数。 4. **转换成XML格式**:对于XML,需要构建一个符合XML标准的证书结构,包含必要的元素和属性,如`...

    2022如何在Java处理PFX格式证书.docx

    "Java处理PFX格式证书相关知识...在Java中处理PFX格式证书需要了解PFX文件格式的基本知识,并使用Java语言来读取PFX文件、提取证书链和密钥。通过本文的介绍和示例代码,读者可以更好地理解Java处理PFX格式证书的过程。

    OpenSSL 解析P12格式证书文件

    3. **OpenSSL命令行工具**:OpenSSL提供了一系列的命令行工具,如`openssl x509`用于处理X509证书,`openssl rsa`用于处理RSA密钥,以及`openssl pkcs12`用于处理P12文件。掌握这些工具的使用方法对于管理和操作证书...

    数字证书格式详细说明

    从 p12/pfx 文件中提取密钥对及其长度可以按照以下步骤进行: 1. 读取 pfx/p12 文件(需要提供保护密码)。 2. 通过别名(Alias)提取你想要分析的证书链。 3. 再将其转换为一个以 X509 证书结构体。 4. 提取里面的...

    cer 转成p12方法

    在微软CA的用户证书申请过程中,用户通常不会自行创建RSA密钥对,而是直接使用CA系统生成的密钥对来创建CSR(证书请求)文件并颁发.CER证书。这种情况下,用户往往不具备生成证书所需的RSA私钥,因此无法直接生成...

    Win64OpenSSL工具和p12秘钥解析方式

    本文将详细讲解Windows环境下64位版本的OpenSSL工具的安装及使用,以及p12(也称为PFX)文件的密钥解析方法。 首先,让我们来了解如何在Windows上安装Win64OpenSSL。`Win64OpenSSL_Light-1_1_0h.exe`是一个轻量级的...

    win32api 实现 RSA加解密/SHA1WithRSA/.../PEM,CER,P12解析/-易语言

    私钥 P12/PFX 导入/解析 RSA公钥加密(RSA_PKCS1_PADDING) RSA私钥解密 MD5WithRSA SHA1WithRSA SHA256WithRSA SHA384WithRSA SHA512WithRSA [hmac-]md2/md4/md5/sha1/sha256/sha384/sha512 AES128/AES192/AES256/...

    openssl windows 一键安装版本

    4. **导出PFX/P12文件**:`openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt`将私钥和证书打包成PFX/P12格式,便于在IIS或其他服务器上导入。 通过这些步骤,用户可以在...

    PfxCreator:根据证书和私钥的PEM表示创建PKCS#12文件(.pfx,.p12)。 无需安装

    PfxCreator PEM证书+私钥-> PFXPfxCreator是一个简单的单exe工具,用于根据证书和私钥的PEM表示创建PKCS#12文件(.pfx,.p12)。 无需安装或依赖文件。 PfxCreator的工作简单明了,在许多需要将证书导入Microsoft...

    Tomcat更换SSL证书方法(jks与pfx转换)

    ### Tomcat更换SSL证书方法(JKS与PFX转换) 在IT行业中,为了保障网络通信的安全性,使用SSL证书加密已经...在实际操作过程中,可能还需要注意一些细节问题,比如证书的有效期、密钥长度等,以确保整个过程的顺利进行。

    Linux环境下证书的生成及使用方法.zip

    提供的`RSAUtils.java`和`PFXUtil.java`可能是Java代码示例,用于处理RSA密钥和PFX文件。在Java中,你可以使用`java.security.KeyStore`类来加载和操作这些证书和密钥。 6. **JavaScript加密**: `js加密的方法....

    Node.js中.pfx后缀文件的处理方法

    一旦你从.pfx文件中提取出了私钥和证书,就可以在Node.js程序中加载它们来建立SSL/TLS连接,比如使用`crypto.createCredentials`方法。 在某些情况下,Node.js的第三方库可能已经封装了这些操作,使得处理.pfx文件...

    p12_key.rar_p12

    PKCS#12文件通常以.p12或.pfx为扩展名,它是一个二进制格式,可以包含一个或多个密钥对以及相关的证书链。这些文件在互联网安全领域扮演着重要角色,因为它们允许用户安全地存储和传输个人身份信息。文件“p12_key.c...

    java实现pdf文件电子签名

    这里`-alias`是别名,`-keyalg`指定生成的密钥算法(如RSA),`-keystore`是存储密钥的文件,`-storetype`为存储类型,`-keypass`和`-storepass`分别为密钥和存储的密码。 有了PFX证书后,我们需要一个PDF处理库来...

    rsa pkcs-12v1

    它的文件扩展名通常是.pfx或者.p12,常用于Windows系统中私钥和证书的封装格式。PKCS#12标准于1999年6月24日由RSA Laboratories发布,其内容详细地规定了个人身份信息的传输语法,包括私钥、证书、各种保密信息以及...

    portecle-1.9

    2. **PKCS#12 (PFX/P12)**:这是一个跨平台的密钥和证书存储格式,由RSA Security开发。P12文件包含用户的私钥、公钥以及证书链,常用于个人身份验证、电子邮件保护、网站安全等场景。在导入或导出证书时,通常会...

    提取证书私钥

    证书通常是以.p12或.pfx格式存储,包含了公钥、私钥以及相关证书链信息。 2. **使用工具**:有多种工具可以用于提取私钥,如OpenSSL、Java的keytool、Windows的mmc.exe等。例如,在OpenSSL中,可以使用`pkcs12`命令...

    [PKI]常见证书格式和转换

    - **从PFX格式文件中提取私钥** - 通过`openssl pkcs12`命令,将PFX格式的文件(mycert.pfx)中的私钥提取出来,保存为.mycert.key格式。 - **PEM到SPC的转换** - 使用`openssl crl2pkcs7`命令,将PEM格式的文件...

Global site tag (gtag.js) - Google Analytics