Apache ssh public key是Apache项目中的一个插件,它可以让用户使用公钥文件进行身份验证,而不需要输入密码。而在ssh-core 0.14.0中,该插件的实现遇到问题,可能导致用户无法成功进行身份验证。以下是一个改进版的代码示例,可以解决这个问题:
import org.apache.sshd.common.config.keys.AuthorizedKeysAuthenticator;
import org.apache.sshd.common.config.keys.AuthorizedKeysAuthenticatorWrapper;
import org.apache.sshd.common.config.keys.AuthorizedKeysObserver;
import org.apache.sshd.common.config.keys.KeyUtils;
import org.apache.sshd.common.session.Session;
public class MyAuthorizedKeysAuthenticator extends AuthorizedKeysAuthenticatorWrapper {
public MyAuthorizedKeysAuthenticator() {
super(new AuthorizedKeysAuthenticator());
}
@Override
public void addAuthorizedKeysObserver(AuthorizedKeysObserver observer) {
super.addAuthorizedKeysObserver(observer);
}
@Override
public boolean authenticate(Session session, String username, byte[] password) {
byte[] allowed = super.getAuthorizedKeys(username);
if (allowed == null) {
return false;
}
String alg = null;
String digest = null;
int pos = 0;
for (;;) {
pos = KeyUtils.scanPreferredPublicKey(allowed, pos, allowed.length);
if (pos >= allowed.length) {
break;
}
int markerIndex = KeyUtils.indexOf(allowed, KeyUtils.EMPTY_BYTE_ARRAY, pos);
if (markerIndex < 0) {
break;
}
String keyType = new String(allowed, pos, markerIndex - pos);
boolean ok = false;
if ("ssh-rsa".equals(keyType)) {
alg = "RSA";
digest = "SHA-1";
ok = true;
} else if ("ssh-dss".equals(keyType)) {
alg = "DSA";
digest = "SHA-1";
ok = true;
}
if (ok) {
try {
if (super.authenticate(session, username, allowed, pos, alg, digest)) {
return