• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SSL==java从CER读取公钥和证书信息,从PFX读取证书公钥私钥并加解密

武飞扬头像
一个java开发
帮助1

参照以上两篇文章,生成PFX证书,并且读取出公钥私钥,此时是带着换行符的,将换行符去掉用留存来和后面代码读取出来的进行对比。

  1.  
     
  2.  
    import javax.crypto.Cipher;
  3.  
    import java.io.FileInputStream;
  4.  
    import java.security.KeyFactory;
  5.  
    import java.security.KeyStore;
  6.  
    import java.security.PrivateKey;
  7.  
    import java.security.PublicKey;
  8.  
    import java.security.cert.Certificate;
  9.  
    import java.security.spec.PKCS8EncodedKeySpec;
  10.  
    import java.security.spec.X509EncodedKeySpec;
  11.  
    import java.util.Base64;
  12.  
    import java.util.Enumeration;
  13.  
     
  14.  
     
  15.  
    public class ReadPFX {
  16.  
    public static void main(String[] args) throws Exception {
  17.  
    //PFX存放的地址
  18.  
    String strPfx = "C:\\test.pfx";
  19.  
    //生成PFX文件时输入的密码
  20.  
    String strPassword = "123456";
  21.  
    KeyStore ks = KeyStore.getInstance("PKCS12");
  22.  
    FileInputStream fis = new FileInputStream(strPfx);
  23.  
    char[] nPassword = null;
  24.  
    if ((strPassword == null) || strPassword.trim().equals("")) {
  25.  
    nPassword = null;
  26.  
    } else {
  27.  
    nPassword = strPassword.toCharArray();
  28.  
    }
  29.  
    ks.load(fis, nPassword);
  30.  
    fis.close();
  31.  
    System.out.println("keystore type=" ks.getType());
  32.  
    Enumeration enumas = ks.aliases();
  33.  
    String keyAlias = null;
  34.  
    if (enumas.hasMoreElements())// we are readin just one certificate.
  35.  
    {
  36.  
    keyAlias = (String) enumas.nextElement();
  37.  
    System.out.println("alias=[" keyAlias "]");
  38.  
    }
  39.  
    // Now once we know the alias, we could get the keys.
  40.  
    System.out.println("is key entry=" ks.isKeyEntry(keyAlias));
  41.  
    PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, nPassword);
  42.  
    Certificate cert = ks.getCertificate(keyAlias);
  43.  
    PublicKey pubkey = cert.getPublicKey();
  44.  
    System.out.println("cert class = " cert.getClass().getName());
  45.  
    System.out.println("cert = " cert);
  46.  
     
  47.  
    Base64.Encoder encoder = Base64.getEncoder();
  48.  
     
  49.  
    //使用java代码从PFX读取到的公钥私钥是没有带换行符的
  50.  
    System.out.println("public key = " pubkey);
  51.  
    String publicKeyString = encoder.encodeToString(pubkey.getEncoded());
  52.  
    System.out.println("-----------------公钥--------------------");
  53.  
    System.out.println(publicKeyString);
  54.  
    System.out.println("-----------------公钥--------------------");
  55.  
     
  56.  
     
  57.  
    System.out.println("private key = " prikey);
  58.  
    String prikeyString = encoder.encodeToString(prikey.getEncoded());
  59.  
    System.out.println("-----------------私钥--------------------");
  60.  
    System.out.println(prikeyString);
  61.  
    System.out.println("-----------------私钥--------------------");
  62.  
     
  63.  
    //使用openssl从PFX中读取到的私钥,此时是带着换行符的。
  64.  
    /**从pfx提取密钥信息,并转换为key格式(pfx使用pkcs12模式补足)
  65.  
    1)提取密钥对
  66.  
    openssl pkcs12 -in test.pfx -nocerts -nodes -out 1.key
  67.  
    //如果pfx证书已加密,会提示输入密码。如果cer证书没有安装,则密码没法验证
  68.  
    2)从密钥对提取私钥
  69.  
    openssl rsa -in 1.key -out 1_pri.key
  70.  
    3)从密钥对提取公钥
  71.  
    openssl rsa -in 1.key -pubout -out 1_pub.key
  72.  
    4)因为RSA算法使用的是pkcs8模式补足,需要对提取的私钥进一步处理
  73.  
    openssl pkcs8 -topk8 -inform PEM -in 1_pri.key -outform PEM -nocrypt
  74.  
    复制窗口中生成的密钥,保存为1_pri_pkcs8.key
  75.  
    5)得到密钥对1_pri_pkcs8.key1_pub.keyopenssl pkcs12 -in test.pfx -nocerts -nodes -out 1.key
  76.  
    */
  77.  
    String privateKeyFromCA = "888888888888888888\n"
  78.  
    "888888888888888888";
  79.  
    String replace = privateKeyFromCA.replace("\n", "");
  80.  
    System.out.println(replace);
  81.  
     
  82.  
    //使用读取到的公钥和私钥进行加解密
  83.  
    String src = "6666666需要加解密6666666666666666";
  84.  
    System.out.println("\n");
  85.  
    String s1 = decryptByPrivateKey(prikeyString, encryptByPublicKey(publicKeyString, src));
  86.  
    System.out.println(s1);
  87.  
    }
  88.  
     
  89.  
    /**
  90.  
    * 公钥加密
  91.  
    *
  92.  
    * @param publicKeyText
  93.  
    * @param text
  94.  
    * @return
  95.  
    */
  96.  
    public static String encryptByPublicKey(String publicKeyText, String text) throws Exception {
  97.  
    X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(publicKeyText));
  98.  
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  99.  
    PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
  100.  
    Cipher cipher = Cipher.getInstance("RSA");
  101.  
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  102.  
    byte[] result = cipher.doFinal(text.getBytes());
  103.  
    return org.apache.commons.codec.binary.Base64.encodeBase64String(result);
  104.  
    }
  105.  
     
  106.  
    /**
  107.  
    * 私钥解密
  108.  
    *
  109.  
    * @param privateKeyText
  110.  
    * @param text
  111.  
    * @return
  112.  
    * @throws Exception
  113.  
    */
  114.  
    public static String decryptByPrivateKey(String privateKeyText, String text) throws Exception {
  115.  
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(privateKeyText));
  116.  
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  117.  
    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
  118.  
    Cipher cipher = Cipher.getInstance("RSA");
  119.  
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
  120.  
    byte[] result = cipher.doFinal(org.apache.commons.codec.binary.Base64.decodeBase64(text));
  121.  
    return new String(result);
  122.  
    }
  123.  
    }

然后通过可以与openssl读取出的进行对比,发现是一样的。然后参照下一篇文章用公钥私钥进行加密解密

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaeeaa
系列文章
更多 icon
同类精品
更多 icon
继续加载