Преобразование файла закрытого ключа PEM в объект JAVA PrivateKey

Я знаю, что есть несколько других вопросов по этой теме, но ни один из них мне не помог. Я также пробовал BouncyCastle lib. Может ли кто-нибудь помочь мне здесь? Файл PEM выглядит так:

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpAIBAAKCAQEAq2eYtnTsEc/qyqS ...


   ... zY3WG++SA+amcXiO721hJWNC+uTbZ1bzQ==
    -----END RSA PRIVATE KEY-----

я использую этот метод

public static PrivateKey getPemPrivateKey(String filename) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException  {
    File f = new File(PEMFILES_FOLDER+filename);
    FileInputStream fis = new FileInputStream(f);
    DataInputStream dis = new DataInputStream(fis);
    byte[] keyBytes = new byte[(int) f.length()];
    dis.readFully(keyBytes);
    dis.close();

    String temp = new String(keyBytes);
    //TODO care about the linefeeds
    String privKeyPEM = temp.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
    privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");

    System.out.println("Private key: \n"+privKeyPEM);

    Base64 b64 = new Base64();
    byte [] decoded = b64.decode(privKeyPEM);


    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
    KeyFactory kf = KeyFactory.getInstance(RSA);
    return kf.generatePrivate(spec);
}

Я получаю эту ошибку:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence

person Hansi Zimmrer    schedule 15.01.2014    source источник


Ответы (1)


Я надеюсь это тебе поможет. Я скопировал рабочую копию getPemPrivatekey и то, как я ее вызываю в основной функции:

public  PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception {
          File f = new File(filename);
          FileInputStream fis = new FileInputStream(f);
          DataInputStream dis = new DataInputStream(fis);
          byte[] keyBytes = new byte[(int) f.length()];
          dis.readFully(keyBytes);
          dis.close();

      String temp = new String(keyBytes);
      String privKeyPEM = temp.replace("-----BEGIN PRIVATE KEY-----", "");
      privKeyPEM = privKeyPEM.replace("-----END PRIVATE KEY-----", "");
      //System.out.println("Private key\n"+privKeyPEM);

      BASE64Decoder b64=new BASE64Decoder();
      byte[] decoded = b64.decodeBuffer(privKeyPEM);

      PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
      KeyFactory kf = KeyFactory.getInstance(algorithm);
      return kf.generatePrivate(spec);
      }

Основная программа выглядит так: ....

gcsr = new ...... // здесь создаем экземпляр класса

 privateKey= gcsr.getPemPrivateKey("c:\\testdir\\java_private.pem", "RSA");
    BASE64Encoder encoder1= new BASE64Encoder();
    String s1=encoder1.encodeBuffer(gcsr.getPrivateKey().getEncoded());
    System.out.println("Private Key in Base64:"+s1+"\n");

В настоящее время это работает (Java 8 на моем компьютере!). «gcsr» — это имя объекта, который я создал из класса, содержащего функцию. С уважением.

person Desphilboy    schedule 27.05.2014