`
luckliu521
  • 浏览: 258784 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java CA证书相关操作,Android,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();
(c)获取CA的公钥
  PublicKey pbk=cac.getPublicKey();
(b)获取待检验的证书(上步已经获取了,就是C1)
(c)检验证书
         boolean pass=false;
         try{
      c1.verify(pbk);
             pass=true;
         }catch(Exception e){
             pass=false;
             System.out.println(e);
  }
分享到:
评论

相关推荐

    CA证书认证

    总结来说,CA证书、RSA加密算法和Keytool工具在IT领域,特别是在Android开发中,有着密切的联系。CA证书确保了网络通信的安全,RSA提供了加密基础,而Keytool则帮助管理和操作这些安全元素。理解并熟练掌握这些知识...

    深入理解Android之Java Security

    KeyChain 可以帮助开发者在 Android 应用程序中执行各种安全相关的操作,如创建和存储密钥对、获取证书等。 - **Message Digest (消息摘要)**:消息摘要是通过算法计算出的数据的固定长度哈希值,常用于验证数据的...

    android+java ssldemo

    这可能与硬件加速、操作系统版本、特定的安全策略或者SSL/TLS库的实现有关。为了优化性能,开发者可能需要: 1. 检查硬件加速:某些Android设备支持硬件加速SSL/TLS,确保此功能已启用可以提升性能。 2. 更新系统和...

    java用户证书.zip

    在Java平台上,证书是一种数字身份,它包含了发布者的公开密钥和相关的身份信息,由受信任的证书颁发机构(CA)签名,确保软件的来源可靠,防止恶意代码的注入。 在Android系统中,Java证书对于开发和分发应用程序...

    android访问自签CA的Https SSL双向认证(j2SE也能使用)

    2. **安装自签CA到设备**:将生成的CA证书导入到Android设备的信任存储中。这可以通过创建一个TrustManager并覆盖其检查证书链的方法来实现。在Android 7.0及以上版本,还需要在应用的清单文件中声明使用不受信任的...

    android https遇到自签名证书/信任证书

    在正常情况下,服务器会提供由权威证书颁发机构(CA)签发的数字证书,客户端(如Android设备)会验证这个证书的有效性,确保与之通信的服务器是真实的,而非中间人攻击。 二、自签名证书 自签名证书是由服务器自身...

    Learn Java for Android Development

    ### 学习Java以进行Android开发 随着移动设备在全球范围内的普及与应用,Android平台作为全球最受欢迎的移动操作系统之一...最后,完成本书的学习后,可以继续深入学习Android相关的技术和框架,开启Android开发之旅。

    BT_android.rar_CA蓝牙开发_android_android 蓝牙_蓝牙_蓝牙开发包

    本资源"BT_android.rar_CA蓝牙开发_android_android 蓝牙_蓝牙_蓝牙开发包"提供了一个基于CA0037蓝牙开发板的手机应用程序源代码,这将帮助开发者了解如何在Android设备上实现与蓝牙设备的通信。 首先,我们要讨论...

    基于openssl的CA证书服务器 你可以用它搭建自己的专属CA服务器,以方便为用户生成私钥、证书请求、颁发证书、吊销证书、证书

    基于openssl的CA证书服务器。...项目是产品化的,不用修改代码就可以管理CA服务器整个生命周期,计划未来增加web操作页面,实现用户从网页端申请、下载、续期等证书操作,以及证书吊销列表的分发。

    java一机一密实现代码

    `BKS` 通常用于 Android 平台,而 `JKS` 是标准的 Java Keystore。在 `exportToJKS` 方法中,我们将证书从 BKS 导出到 JKS 格式,以便在其他 Java 应用程序中使用。 3. **创建 SSLSocketFactory**: `...

    安卓android数字证书及扩展项解释生成类库

    本篇将深入探讨安卓Android中的数字证书以及相关扩展项,特别是针对描述中提到的类库,它专注于证书的生成和解释。 首先,我们需要理解数字证书的基本概念。数字证书是一种电子文档,由受信任的证书颁发机构(CA)...

    客户端与服务器SSL双向认证(客户端:java-服务端:java)

    - 客户端证书:类似地,也需要为客户端生成一个证书,通常会由权威的证书颁发机构(CA)签署,但在测试环境中可以自签。 2. **配置服务器**: - 配置Keystore:将服务器证书导入到Keystore文件中,设置Keystore和...

    Android签名证书描述及使用流程

    不过,与传统的数字证书不同,Android证书并不需要由权威的证书颁发机构(CA)进行认证,开发者可以自签证书,这大大降低了发布应用的门槛。 Android数字证书的一些关键点包括: 1. 所有应用必须有证书,无证书的...

    Learn.Java.for.Android.Development_Apress.2010+src

    Learn Java for Android Developmentteaches programmers of any skill level the essential Java language and foundational Java API skills that must be learned to improve the programmer''s chances of ...

    android客户端发送https请求

    2. **创建TrustManager**:Android系统默认只信任预装的CA证书,若服务器使用自签名证书,我们需要自定义TrustManager,接受该特定的证书。创建一个继承X509TrustManager的类,重写checkServerTrusted方法,添加对...

    验证证书unable to find valid certification path to requested target

    这个问题的根本原因是Java的信任存储(通常是JKS格式的证书库,默认位于$JAVA_HOME/lib/security/cacerts文件中)中没有包含服务器证书的根CA证书,或者服务器证书本身不是由受信任的CA签发,或者证书链不完整。...

    Android双向SSL例子

    2. **包含的bcprov-jdk15on-146.jar**: 这是一个Bouncy Castle库的Java版本,它提供了对各种加密算法的支持,包括SSL/TLS所需的公钥基础设施(PKI)操作,如证书的创建和解析。 3. **服务端实现**:服务端通常由一...

    JAVA签名实例

    2. **移动应用**:在Android平台上,应用必须签名才能发布到Google Play商店,以及进行系统级别的操作。 3. **企业应用**:内部的企业应用可能需要签名,以确保它们来源于可信源,且未被篡改。 六、注意事项 1. ...

    Android-愿支付是整合支付模块微信支付支付宝的java项目

    【Android-愿支付:整合支付模块的Java项目】 在移动应用开发中,支付功能是不可或缺的一部分,尤其是在Android平台上。"Android-愿支付"项目旨在提供一个集成微信支付和支付宝的解决方案,帮助开发者快速地在自己...

Global site tag (gtag.js) - Google Analytics