当前位置: 首页 > 面试题库 >

私钥/公钥认证的ssh示例

邹昊
2023-03-14
问题内容

谁能给我sshj中的私钥/公钥身份验证示例?

在sshj中,等效的命令行是什么,

ssh -i /path/to/mykey.private username@host

我试过了(省略了错误处理),

final SSHClient ssh = new SSHClient();
ssh.loadKnownHosts();
ssh.connect("host");
ssh.authPublickey("username", "/path/to/mykey.private");
final Session session = ssh.startSession();
...

但在日志语句中,我看到了

DEBUG net.schmizz.sshj.SSHClient - Attempting to load key from: /path/to/mykey.private
WARN  net.schmizz.sshj.SSHClient - Could not load keys due to: {}
net.schmizz.sshj.common.SSHException: No provider available forUnknown key file
    at net.schmizz.sshj.SSHClient.loadKeys(SSHClient.java:482) ~[sshj-0.3.0.jar:na]
...
Exception in thread "main" 10:49:55.943 [reader] DEBUG
net.schmizz.sshj.transport.Reader - Stopping
net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods

谢谢


问题答案:

尝试KeyPairWrapper像这样使用:

KeyPair kp = ... // read keypair from file
ssh.authPublickey(user, new KeyPairWrapper(keypair));

使用BouncyCastle提供程序,您可以使用类似的方法从PKCS8 PEM(为混乱的代码道歉)中提取KeyPair。

/**
 * Takes a PEM-encoded PKCS8 key-containing InputStream and returns the KeyPair within. Only the first keypair is considered
 * 
 * @return
 * @throws IOException if the stream is not a valid PKCS8 wrapped keypair
 */
public static KeyPair readKeypair(final InputStream is, final char[] password) throws IOException {
    PasswordFinder passwordFinder = password != null ? new StaticPasswordFinder(password) : null;

    KeyPair kp = null;
    try {
        // read the stream as a PEM encoded
        try {

            final PEMReader pem = new PEMReader(new InputStreamReader(is), passwordFinder);
            try {
                // Skip over entries in the file which are not KeyPairs
                do {
                    final Object o = pem.readObject();

                    if (o == null)
                        break; // at end of file
                    else if (o instanceof KeyPair)
                        kp = (KeyPair) o;
                } while (kp == null);
            }
            finally {
                pem.close();
            }
        }
        catch (EncryptionException e) {
            throw new IOException("Error reading PEM stream: " + e.getMessage(), e);
        }
    }
    finally {
        is.close();
    }

    // Cast the return to a KeyPair (or, if there is no [valid] return, throw an exception)
    if (kp != null)
        return kp;
    else
        throw new IOException("Stream " + is + " did not contain a PKCS8 KeyPair");
}


 类似资料:
  • 我使用命令“ssh-keygen-t rsa”创建了一个没有密码的公钥,我打算将其用于github,但我错误地发送了公钥和私钥...... 这到底意味着什么?

  • 我创建了一个小型vertx auth服务器,它使用公钥/私钥签名/生成JWT令牌。 现在,当我从客户端访问/api/new token时,我从上面的身份验证服务器获得了一个JWT令牌。然而,我有一些悬而未决的问题: auth-server如何确保客户端具有服务器公钥并且它是真实的? 客户端如何向auth-server发送公钥? 我怎样才能让 /api/new-token安全,只有合法的客户端可以连

  • 我正在尝试使用openssl生成一个安全的私钥和公钥,以便与我的云托管提供商一起使用,但当我这样做时,openssl的公钥输出未被识别。 生成RSA私钥后,2048位长模,然后 它编写了RSA公钥。输出如下所示: 这是标准格式,它非常适合其他用途,但所有云和托管服务提供商都需要这样的公钥: 这是他们识别的唯一有效格式。 我知道ssh-keygen可以轻松完成所有这些,但我正在使用当前最新的open

  • 通常情况下,访问远程服务器上的 Git 仓库要受到限制。你可能不希望任何人都能读取文件,或者至少不能改动文件吧。在这种情况下,进行有效的认证就是非常必要地。 你可能已经通过你所使用的浏览器了解了 “HTTPS” 协议,尽管它使用起来很简单,但是很多系统管理员还是会出于各种原因去选择使用更为普遍的 “SSH” 协议。在这种协议之下,当涉及到身份验证时,你就很可能需要 “SSH公钥”。 对于这种类型的

  • Auth0提供了两个JWT库,一个用于Node:Node jsonwebtoken,另一个用于Java:Java JWT。事实证明,JavaJWT不支持公钥/私钥对。 然而,另一个java库jjwt库声称支持该特性。但是,该文档没有显示如何在jjwt中使用自己的公钥/私钥对。 我创建了私有/公钥对,并在Node中成功地使用了node-jsonwebToken: 但是我发现在Java中用JWT无法做

  • 我试图理解使用带有私钥/公钥(RS512)的JSON Web令牌的逻辑,当将从客户端(在本例中是React Native App)发送到服务器的数据有效载荷签名时。 我认为私钥/公钥的全部意义在于将私钥保持为私钥(在我的服务器上),并将公钥交给成功登录应用程序的人。 我认为,对于我的服务器的每个API请求,经过身份验证的应用程序用户将使用公钥创建JWT(在客户端),服务器将使用私钥验证来自API请