`
philip01
  • 浏览: 47136 次
  • 来自: ...
社区版块
存档分类
最新评论

java 对证书操作

阅读更多

一:需要包含的包
    import java.security.*;
    import java.io.*;
    import java.util.*;
    import java.security.*;
    import java.security.cert.*;
    import sun.security.x509.*
    import java.security.cert.Certificate;
    import java.security.cert.CertificateFactory;

二:从文件中读取证书
    用keytool将.keystore中的证书写入文件中,然后从该文件中读取证书信息
    CertificateFactory cf=CertificateFactory.getInstance("X.509");
    FileInputStream in=new FileInputStream("out.csr");
    Certificate c=cf.generateCertificate(in);

    String s=c.toString();
三:从密钥库中直接读取证书
    String pass="123456";
    FileInputStream in=new FileInputStream(".keystore");
    KeyStore ks=KeyStore.getInstance("JKS");
    ks.load(in,pass.toCharArray());
    java.security.cert.Certificate c=ks.getCertificate(alias);//alias为条目的别名

四:JAVA程序中显示证书指定信息
    System.out.println("输出证书信息:\n"+c.toString());
    System.out.println("版本号:"+t.getVersion());
    System.out.println("序列号:"+t.getSerialNumber().toString(16));
    System.out.println("主体名:"+t.getSubjectDN());
    System.out.println("签发者:"+t.getIssuerDN());
    System.out.println("有效期:"+t.getNotBefore());
    System.out.println("签名算法:"+t.getSigAlgName());
    byte [] sig=t.getSignature();//签名值
    PublicKey pk=t.getPublicKey();
    byte [] pkenc=pk.getEncoded(); 
    System.out.println("公钥");
    for(int i=0;i<pkenc.length;i++)System.out.print(pkenc[i]+",");

五:JAVA程序列出密钥库所有条目
    String pass="123456";
    FileInputStream in=new FileInputStream(".keystore");
    KeyStore ks=KeyStore.getInstance("JKS");
    ks.load(in,pass.toCharArray());
    Enumeration e=ks.aliases();
    while(e.hasMoreElements())
    java.security.cert.Certificate c=ks.getCertificate((String)e.nextElement());

六:JAVA程序修改密钥库口令
    String oldpass="123456";
    String newpass="654321";
    FileInputStream in=new FileInputStream(".keystore");
    KeyStore ks=KeyStore.getInstance("JKS");
    ks.load(in,oldpass.toCharArray());
    in.close();
    FileOutputStream output=new FileOutputStream(".keystore");
    ks.store(output,newpass.toCharArray());
    output.close();

七:JAVA程序修改密钥库条目的口令及添加条目
    FileInputStream in=new FileInputStream(".keystore");
    KeyStore ks=KeyStore.getInstance("JKS");
    ks.load(in,storepass.toCharArray());
    Certificate [] cchain=ks.getCertificate(alias);获取别名对应条目的证书链
    PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass.toCharArray());获取别名对应条目的私钥
    ks.setKeyEntry(alias,pk,newkeypass.toCharArray(),cchain);向密钥库中添加条目
    第一个参数指定所添加条目的别名,假如使用已存在别名将覆盖已存在条目,使用新别名将增加一个新条目,第二个参数为条目的私钥,第三个为设置的新口令,第四个为该私钥的公钥的证书链
    FileOutputStream output=new FileOutputStream("another");
    ks.store(output,storepass.toCharArray())将keystore对象内容写入新文件

八:JAVA程序检验别名和删除条目
    FileInputStream in=new FileInputStream(".keystore");
    KeyStore ks=KeyStore.getInstance("JKS");
    ks.load(in,storepass.toCharArray());
    ks.containsAlias("sage");检验条目是否在密钥库中,存在返回true
    ks.deleteEntry("sage");删除别名对应的条目
    FileOutputStream output=new FileOutputStream(".keystore");
    ks.store(output,storepass.toCharArray())将keystore对象内容写入文件,条目删除成功

九:JAVA程序签发数字证书
    (1)从密钥库中读取CA的证书
    FileInputStream in=new FileInputStream(".keystore");
    KeyStore ks=KeyStore.getInstance("JKS");
    ks.load(in,storepass.toCharArray());
    java.security.cert.Certificate c1=ks.getCertificate("caroot");
    (2)从密钥库中读取CA的私钥
    PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());
    (3)从CA的证书中提取签发者的信息
    byte[] encod1=c1.getEncoded();    提取CA证书的编码
    X509CertImpl cimp1=new X509CertImpl(encod1);  用该编码创建X509CertImpl类型对象
    X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);  获取X509CertInfo对象
    X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME); 获取X509Name类型的签发者信息
    (4)获取待签发的证书
    CertificateFactory cf=CertificateFactory.getInstance("X.509");
    FileInputStream in2=new FileInputStream("user.csr");
    java.security.cert.Certificate c2=cf.generateCertificate(in);
    (5)从待签发的证书中提取证书信息
    byte [] encod2=c2.getEncoded();
    X509CertImpl cimp2=new X509CertImpl(encod2);  用该编码创建X509CertImpl类型对象
    X509CertInfo cinfo2=(X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);  获取X509CertInfo对象
    (6)设置新证书有效期
    Date begindate=new Date(); 获取当前时间
    Date enddate=new Date(begindate.getTime()+3000*24*60*60*1000L); 有效期为3000天
    CertificateValidity cv=new CertificateValidity(begindate,enddate); 创建对象
    cinfo2.set(X509CertInfo.VALIDITY,cv);  设置有效期
    (7)设置新证书序列号
    int sn=(int)(begindate.getTime()/1000);    以当前时间为序列号
    CertificateSerialNumber csn=new CertificateSerialNumber(sn);
    cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);
    (8)设置新证书签发者
    cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);应用第三步的结果
    (9)设置新证书签名算法信息
    AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);
    cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);
    (10)创建证书并使用CA的私钥对其签名
    X509CertImpl newcert=new X509CertImpl(cinfo2);
    newcert.sign(caprk,"MD5WithRSA"); 使用CA私钥对其签名
    (11)将新证书写入密钥库
    ks.setCertificateEntry("lf_signed",newcert);
    FileOutputStream out=new FileOutputStream("newstore");
    ks.store(out,"newpass".toCharArray());  这里是写入了新的密钥库,也可以使用第七条来增加条目

十:数字证书的检验
    (1)验证证书的有效期
  (a)获取X509Certificate类型对象
   CertificateFactory cf=CertificateFactory.getInstance("X.509");
      FileInputStream in1=new FileInputStream("aa.crt");
     java.security.cert.Certificate  c1=cf.generateCertificate(in1);
   X509Certificate t=(X509Certificate)c1;
     in2.close();
         (b)获取日期
   Date TimeNow=new Date();
     (c)检验有效性
     try{
      t.checkValidity(TimeNow);
             System.out.println("OK");
  }catch(CertificateExpiredException e){  //过期
      System.out.println("Expired");
      System.out.println(e.getMessage());
  }catch((CertificateNotYetValidException e){ //尚未生效
      System.out.println("Too early");
      System.out.println(e.getMessage());}
   (2)验证证书签名的有效性
  (a)获取CA证书
          CertificateFactory cf=CertificateFactory.getInstance("X.509");
       FileInputStream in2=new FileInputStream("caroot.crt");
       java.security.cert.Certificate  cac=cf.generateCertificate(in2);
      in2.close();
  (b)获取CA的公钥
     PublicKey pbk=cac.getPublicKey();
  (c)获取待检验的证书(上步已经获取了,就是C1)
  (d)检验证书
         boolean pass=false;
     try{
       c1.verify(pbk);
              pass=true;
          }catch(Exception e){
              pass=false;
              System.out.println(e);
        }

 

分享到:
评论

相关推荐

    JAVA对数字证书的常用操作

    以下是对Java中数字证书的一些常见操作的详细解释: 一、所需导入的包: 在处理数字证书时,Java的安全框架提供了一系列的类和接口,这些都需要导入到你的代码中。以下是一些主要的包: 1. `java.security.*`:...

    Java签名证书信息查看工具

    此外,还可以通过Portecle的工具栏进行各种证书操作,如创建新的密钥对、导入或导出证书、删除现有密钥等。 总的来说,Java签名证书信息查看工具,尤其是Portecle,为Java开发者提供了强大的证书管理功能,简化了...

    java代码生成数字证书

    4. **Java密钥和证书管理**:在Java中,`java.security.KeyPairGenerator`类用于生成密钥对,`java.security.cert.Certificate`接口代表证书,而`java.security.cert.X509Certificate`则专门处理X.509证书。...

    java生成CA证书

    在Java中,可以使用`java.security.cert.X509Certificate`类来创建和操作X.509证书。 6. **使用jre6的rt.jar**:在描述中提到引入了jre6的rt.jar,这是因为不同的Java版本可能对加密算法的支持有所不同。rt.jar是...

    Certificate_java_java数字签名_java签名证书_数字证书_

    6. **密钥库操作**:`keytool`命令行工具或Java API(如`KeyStore`类)用于管理密钥库,包括导入、导出、查看和删除证书及密钥。 7. **信任管理**:`java.security.cert.TrustManager`用于判断收到的证书是否可信,...

    CFCA证书环境Java安装

    在这些命令中,`-keystore cacerts`指定了密钥库,`-importcert`表示导入证书操作,`-alias`定义了证书别名,而`-file`指定了证书文件路径。默认的`cacerts`文件密码是`changeit`,如果提示输入密码,应输入此...

    java获取数字证书信息

    OpenSSL是一个强大的工具,用于生成私钥、创建证书请求、签发证书等操作。具体步骤包括创建私钥、生成CSR(证书签名请求)、使用CA签发证书等。 #### 三、支持第三方CA 在实际应用中,我们通常会使用由第三方认证...

    java 实现数字证书的操作实现网络安全

    Java 数字证书操作是网络安全领域中的重要组成部分,主要用于身份验证和数据加密,确保网络通信的安全。在Java中,我们可以利用Java Cryptography Extension (JCE) 和 Java Secure Socket Extension (JSSE) 这些强大...

    java证书导入工具

    Java证书导入工具的操作流程通常如下: 1. **准备证书**:首先,你需要从服务器获取到PEM或DER格式的公钥证书,或者更常用的PKCS12格式,包含私钥和证书链的文件。 2. **导入证书**:使用工具打开,选择相应的证书...

    java对数字证书常用操作

    本篇文章将深入探讨Java对数字证书的常用操作,包括导入必要的库、从文件中读取证书、从密钥库中直接读取证书、显示证书信息、列出密钥库所有条目以及修改密钥库的口令和条目口令。 首先,我们需要导入相关的Java库...

    Java实现浏览器CA证书的签名和验证

    Java提供了丰富的API来处理证书的生成、签名、验证等操作,包括但不限于使用Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE)。 在Java中,可以使用keytool工具来生成自签名证书,或者...

    windows下java查看系统证书demo

    总结来说,Windows下的Java证书操作主要依赖JSSE和`WindowsProvider`,而`mscryptofunctions.dll`可能是解决某些环境问题的关键。理解这些原理和实践,有助于在开发和调试过程中更有效地处理与证书相关的问题。

    JAVA 使用数字证书加密解密文件

    本文将深入探讨如何使用Java语言结合RSA算法,通过数字证书实现文件的加密和解密操作。RSA是一种非对称加密算法,它的核心在于一对密钥:公钥和私钥。公钥可以公开给任何人,用于加密数据;而私钥必须保密,用于解密...

    JAVA ldap AD 域 免证书 查询 修改 删除 新增 启用 禁用 修改密码

    在这篇文章中,我们将探讨使用 JAVA 实现 LDAP 的 AD 域免证书查询、修改、删除、新增、启用、禁用和修改密码的操作。 首先,让我们了解什么是 LDAP 和 AD 域。LDAP(Lightweight Directory Access Protocol)是一...

    Java发https请求证书问题

    本文将围绕“Java 发送 HTTPS 请求证书问题”这一主题展开讨论,通过对给定文件中的代码示例及操作步骤进行分析,帮助读者理解如何在 Java 中正确配置并发送 HTTPS 请求。 #### 标题:Java 发送 HTTPS 请求证书问题...

    JAVA 用代码生成数字证书源码

    在Java编程环境中,生成数字证书是一项关键的安全技术,主要用于数据加密、身份验证和签名等应用场景。...通过深入理解并运用这些源码,开发者可以更好地掌握Java中的数字证书操作,增强系统的安全性。

    java 发送https 请求 证书

    Java的TrustStore包含了系统信任的根证书,如果服务器的证书不在这个TrustStore中,Java会抛出“ sun.security.validator.ValidatorException: PKIX path building failed”这样的异常。以下是一些步骤来处理这个...

    java实现读取证书访问https接口

    在Java中,我们可以使用`java.security.cert`包中的类来操作这些证书。例如,`java.security.cert.CertificateFactory`用于创建证书,`java.security.cert.X509Certificate`则表示具体的X.509证书。 当访问HTTPS...

    java 证书 加密 解密

    Java证书加密解密是Java开发中涉及网络安全的重要环节,它主要涉及到数字证书、SSL/TLS协议、公钥加密和私钥解密等概念。在这个场景中,`Payment Mgr.p12`是一个PKCS12格式的文件,通常用于存储个人身份信息,包括...

Global site tag (gtag.js) - Google Analytics