【问题标题】:Using private RSA Key from .keystore File with Jsch将 .keystore 文件中的私有 RSA 密钥与 Jsch 一起使用
【发布时间】:2017-07-02 22:22:39
【问题描述】:

我正在尝试从我创建的 .keystore 文件中获取私钥。

到目前为止,这是有效的:

        try {
        FileInputStream is = new FileInputStream("C:\\Program Files\\Java\\...mykeystore.keystore");

        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystore.load(is, "mypassword".toCharArray());
        Key privKey = keystore.getKey("alias", "mypassword".toCharArray());

        StringWriter stringWriter = new StringWriter();
        JcaPEMWriter pemWriter = new JcaPEMWriter(stringWriter);
        pemWriter.writeObject(privKey);
        pemWriter.close();
        System.out.println(stringWriter);

对于 System.out.println(stringWriter) 我得到以下输出:

-----开始 RSA 私钥--

这里有私钥

-----结束 RSA 私钥-----

我现在想使用这个私钥创建一个到 Unix 服务器的 ssh 连接。在 unix 服务器端,我已经将公钥放入了 authorized_key 文件中。

对于 ssh 连接,我使用 JSch。 根据JSCH - Invalid private key,我现在需要将此密钥转换为 PEM 格式。我用 Abdelhameed Mahmoud 的例子做到了这一点:

        StringWriter stringWriter = new StringWriter();
        JcaPEMWriter pemWriter = new JcaPEMWriter(stringWriter);
        pemWriter.writeObject(privKey);
        pemWriter.close();
        System.out.println(stringWriter);
        byte[] privateKeyPEM = stringWriter.toString().getBytes();

这就是我卡住的地方。

如何使用 privateKeyPEM 字节对象? 我想将它与 jsch.addIdentity() 一起使用

但我不太明白如何使用这个 byte[] privateKeyPEM 变量来设置身份?

这是我的 JSch 部分的示例:

     JSch jsch = new JSch();
        jsch.addIdentity(**What to put here??**);
        session = jsch.getSession(user, getIP(), getPort());
        session.setConfig("PreferredAuthentications", "publickey");
        //session.setPassword(pwd);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect(3000);

有人有这方面的经验吗?

对缺少的 cmets 感到抱歉,因为我仍在研究如何让这个工作,所以我还没有添加任何 cmets。

在此先感谢您提供任何有用的意见。

干杯 阿明

【问题讨论】:

    标签: java ssh keystore jsch


    【解决方案1】:

    您可以将您的 privateKeyPEM 用作字节数组:

    jsch.identityRepository.add(privateKeyPEM)
    

    这是 LocalIdentityRepository 的实现:

    public synchronized boolean add(byte[] identity) {
      try{
        Identity _identity = IdentityFile.newInstance("from remote:", identity, null, jsch);
        add(_identity);
        return true;
      }
      catch(JSchException e){
        return false;
      }
    }
    

    请记住,-----BEGIN RSA PRIVATE KEY----- 是私钥的一部分。 jsch检查密钥类型。

    if(buf[i]=='B'&& i+3<len && buf[i+1]=='E'&& buf[i+2]=='G'&& buf[i+3]=='I') {
      ....
    
      if(buf[i]=='R'&& buf[i+1]=='S'&& buf[i+2]=='A'){ type=RSA; }
      ....
    }
    
    # Refer to: https://github.com/is/jsch/blob/master/src/main/java/com/jcraft/jsch/KeyPair.java#L210
    

    【讨论】:

      【解决方案2】:

      jsch 文档中对此一无所知吗?

      参数为:

      JSch.addIdentity(String name, byte[] prvkey, byte[] pubkey, byte[] passphrase) 
      

      在您的情况下(未加密的 PEM):

      jsch.addIdentity(user, privateKeyPEM, null, null);
      

      【讨论】:

      • 嗨 Omikron。非常感谢您的反馈。我只是对您可以使用的字符串/字节公钥/密码参数感到困惑。由于某些原因,我对此感到困惑。一开始我总是收到一些奇怪的错误,可能是我把错误的用户作为字符串。无论如何,非常感谢您的反馈。有了这个,现在一切正常。干杯
      • 太棒了!真的很有帮助,无处可寻。没有文档,什么都没有……尤其是最初的问题是有用的问题
      猜你喜欢
      • 2015-04-11
      • 2020-03-20
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多