actions = (List) actionsF.get(c);
- actions.add(a);
- } catch (Exception x2) {
- LOGGER.log(Level.WARNING, null, x2);
- }
- }
- }
-
private boolean hasExistingTrustAction(SlaveComputer computer, HostKey hostKey) {
for (TrustHostKeyAction action : computer.getActions(TrustHostKeyAction.class)) {
if (!action.isComplete() && action.getHostKey().equals(hostKey)) {
return true;
}
}
-
+
return false;
}
-
+
@Extension
public static class ManuallyTrustedKeyVerificationStrategyDescriptor extends SshHostKeyVerificationStrategyDescriptor {
+ @NonNull
@Override
public String getDisplayName() {
return Messages.ManualTrustingHostKeyVerifier_DescriptorDisplayName();
}
-
+
}
-
+
}
diff --git a/src/main/java/hudson/plugins/sshslaves/verifiers/MissingVerificationStrategyAdministrativeMonitor.java b/src/main/java/hudson/plugins/sshslaves/verifiers/MissingVerificationStrategyAdministrativeMonitor.java
index 62994a60..4235400f 100644
--- a/src/main/java/hudson/plugins/sshslaves/verifiers/MissingVerificationStrategyAdministrativeMonitor.java
+++ b/src/main/java/hudson/plugins/sshslaves/verifiers/MissingVerificationStrategyAdministrativeMonitor.java
@@ -65,6 +65,11 @@ public String getDisplayName() {
}
public String getAgentNames() {
- return agentNames != null ? agentNames.toString() : "";
+ return agentNames != null ? agentNames.toString() : "";
+ }
+
+ @Override
+ public boolean isSecurity() {
+ return true;
}
}
diff --git a/src/main/java/hudson/plugins/sshslaves/verifiers/NonVerifyingKeyVerificationStrategy.java b/src/main/java/hudson/plugins/sshslaves/verifiers/NonVerifyingKeyVerificationStrategy.java
index 5a95097d..56f38317 100644
--- a/src/main/java/hudson/plugins/sshslaves/verifiers/NonVerifyingKeyVerificationStrategy.java
+++ b/src/main/java/hudson/plugins/sshslaves/verifiers/NonVerifyingKeyVerificationStrategy.java
@@ -23,6 +23,7 @@
*/
package hudson.plugins.sshslaves.verifiers;
+import edu.umd.cs.findbugs.annotations.NonNull;
import org.kohsuke.stapler.DataBoundConstructor;
import hudson.Extension;
@@ -45,21 +46,22 @@ public class NonVerifyingKeyVerificationStrategy extends SshHostKeyVerificationS
public NonVerifyingKeyVerificationStrategy() {
super();
}
-
+
@Override
public boolean verify(SlaveComputer computer, HostKey hostKey, TaskListener listener) {
listener.getLogger().println(Messages.NonVerifyingHostKeyVerifier_NoVerificationWarning(SSHLauncher.getTimestamp()));
return true;
}
-
+
@Extension
public static class NonVerifyingKeyVerificationStrategyDescriptor extends SshHostKeyVerificationStrategyDescriptor {
+ @NonNull
@Override
public String getDisplayName() {
return Messages.NonVerifyingHostKeyVerifier_DescriptorDisplayName();
}
-
+
}
-
-}
\ No newline at end of file
+
+}
diff --git a/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help.properties b/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help.properties
index aea3739c..44420a0a 100644
--- a/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help.properties
+++ b/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help.properties
@@ -21,5 +21,5 @@
# THE SOFTWARE.
blurb=Starts an agent by sending commands over a secure SSH connection. \
- The agent needs to be reachable from the master, and you will have to supply an \
+ The agent needs to be reachable from the Jenkins controller, and you will have to supply an \
account that can log in on the target machine. No root privileges are required.
diff --git a/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help_de.properties b/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help_de.properties
index 7c9a56ef..3ca66d2e 100644
--- a/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help_de.properties
+++ b/src/main/resources/hudson/plugins/sshslaves/SSHLauncher/help_de.properties
@@ -22,6 +22,6 @@
blurb=Startet einen Agent durch Kommandos, die \u00FCber eine gesicherte SSH-Verbindung \
gesendet werden. \
- Der Agent muss dazu vom Master aus erreichbar sein, und Sie m\u00FCssen einen \
+ Der Agent muss dazu vom Controller aus erreichbar sein, und Sie m\u00FCssen einen \
Benutzeraccount mit Login-Rechten auf dem Agent angeben. \
Root-Rechte sind f\u00FCr diesen Account nicht erforderlich.
diff --git a/src/main/resources/hudson/plugins/sshslaves/verifiers/KnownHostsFileKeyVerificationStrategy/help.html b/src/main/resources/hudson/plugins/sshslaves/verifiers/KnownHostsFileKeyVerificationStrategy/help.html
index 86ec8c73..2a7a7d8e 100644
--- a/src/main/resources/hudson/plugins/sshslaves/verifiers/KnownHostsFileKeyVerificationStrategy/help.html
+++ b/src/main/resources/hudson/plugins/sshslaves/verifiers/KnownHostsFileKeyVerificationStrategy/help.html
@@ -1,2 +1,2 @@
Checks the known_hosts file (~/.ssh/known_hosts) for the user Jenkins is executing under, to see if an entry exists that matches the current connection.
-This method does not make any updates to the Known Hosts file, instead using the file as a read-only source and expecting someone with suitable access to the appropriate user account on the Jenkins master to update the file as required, potentially using the ssh hostname command to initiate a connection and update the file appropriately.
+This method does not make any updates to the Known Hosts file, instead using the file as a read-only source and expecting someone with suitable access to the appropriate user account on the Jenkins controller to update the file as required, potentially using the ssh hostname command to initiate a connection and update the file appropriately.
diff --git a/src/test/java/hudson/plugins/sshslaves/SSHLauncherTest.java b/src/test/java/hudson/plugins/sshslaves/SSHLauncherTest.java
index 3d27c7c9..f0b69b31 100644
--- a/src/test/java/hudson/plugins/sshslaves/SSHLauncherTest.java
+++ b/src/test/java/hudson/plugins/sshslaves/SSHLauncherTest.java
@@ -76,6 +76,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -154,12 +155,7 @@ private static boolean checkSupported(final String testVersionOutput) throws IOE
}
private static void assertNotSupported(final String testVersionOutput) throws AssertionError {
- try {
- checkSupported(testVersionOutput);
- fail("Expected version " + testVersionOutput + " to be not supported, but it is supported");
- } catch (IOException e) {
- // expected
- }
+ assertThrows(IOException.class, () -> checkSupported(testVersionOutput));
}
private void checkRoundTrip(String host) throws Exception {
@@ -400,7 +396,7 @@ public void getMd5Hash() {
try {
byte[] bytes = "Leave me alone!".getBytes();
String result = SSHLauncher.getMd5Hash(bytes);
- assertTrue("1EB226C8E950BAC1494BE197E84A264C".equals(result));
+ assertEquals("1EB226C8E950BAC1494BE197E84A264C", result);
} catch (Exception e) {
e.printStackTrace();
}
@@ -420,7 +416,7 @@ public void readInputStreamIntoByteArrayAndClose() {
byte[] bytes = SSHLauncher.readInputStreamIntoByteArrayAndClose(inputStream);
assertNotNull(bytes);
assertTrue(bytes.length > 0);
- assertTrue("Don't change me or add newlines!".equals(new String(bytes)));
+ assertEquals("Don't change me or add newlines!", new String(bytes));
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentConnectionBase.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentConnectionBase.java
new file mode 100644
index 00000000..7d6a3e98
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentConnectionBase.java
@@ -0,0 +1,117 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+import hudson.plugins.sshslaves.rules.Retry;
+import org.apache.commons.io.IOUtils;
+import org.junit.Rule;
+import org.junit.rules.Timeout;
+import org.jvnet.hudson.test.JenkinsRule;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.SSHLauncher;
+import hudson.plugins.sshslaves.rules.CheckIsDockerAvailable;
+import hudson.plugins.sshslaves.rules.CheckIsLinuxOrMac;
+import hudson.plugins.sshslaves.verifiers.NonVerifyingKeyVerificationStrategy;
+import hudson.slaves.DumbSlave;
+import com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey;
+import com.cloudbees.plugins.credentials.CredentialsScope;
+import com.cloudbees.plugins.credentials.SystemCredentialsProvider;
+import com.cloudbees.plugins.credentials.common.StandardUsernameCredentials;
+import com.cloudbees.plugins.credentials.domains.Domain;
+import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Base class to test connections to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+public class AgentConnectionBase {
+ public static final String USER = "jenkins";
+ public static final String PASSWORD = "password";
+ public static final String AGENT_WORK_DIR = "/home/jenkins";
+ public static final int SSH_PORT = 22;
+ public static final String SSH_SSHD_CONFIG = "ssh/sshd_config";
+ public static final String DOCKERFILE = "Dockerfile";
+ public static final String SSH_AUTHORIZED_KEYS = "ssh/authorized_keys";
+ public static final String AGENTS_RESOURCES_PATH = "/hudson/plugins/sshslaves/agents/";
+
+ @Rule
+ public CheckIsLinuxOrMac isLinuxOrMac = new CheckIsLinuxOrMac();
+
+ @Rule
+ public CheckIsDockerAvailable isDockerAvailable = new CheckIsDockerAvailable();
+
+ @Rule
+ public JenkinsRule j = new JenkinsRule();
+
+ @Rule
+ public Retry retry = new Retry(3);
+
+ @Rule
+ public Timeout globalTimeout= new Timeout(4, TimeUnit.MINUTES);
+
+ protected boolean isSuccessfullyConnected(Node node) throws IOException, InterruptedException {
+ boolean ret = false;
+ int count = 0;
+ while (count < 30) {
+ Thread.sleep(1000);
+ String log = node.toComputer().getLog();
+ ret = log.contains("Agent successfully connected and online");
+ count++;
+ }
+ return ret;
+ }
+
+ protected void waitForAgentConnected(Node node) throws InterruptedException {
+ int count = 0;
+ while (!node.toComputer().isOnline() && count < 150) {
+ Thread.sleep(1000);
+ count++;
+ }
+ assertTrue(node.toComputer().isOnline());
+ }
+
+ protected Node createPermanentAgent(String name, String host, int sshPort, String keyResourcePath, String passphrase)
+ throws Descriptor.FormException, IOException {
+ String credId = "sshCredentialsId";
+ createSshKeyCredentials(credId, keyResourcePath, passphrase);
+ final SSHLauncher launcher = new SSHLauncher(host , sshPort, credId);
+ launcher.setSshHostKeyVerificationStrategy(new NonVerifyingKeyVerificationStrategy());
+ DumbSlave agent = new DumbSlave(name, AGENT_WORK_DIR, launcher);
+ j.jenkins.addNode(agent);
+ return j.jenkins.getNode(agent.getNodeName());
+ }
+
+ protected Node createPermanentAgent(String name, String host, int sshPort)
+ throws Descriptor.FormException, IOException {
+ String credId = "sshCredentialsId";
+ createSshCredentials(credId);
+ final SSHLauncher launcher = new SSHLauncher(host , sshPort, credId);
+ launcher.setSshHostKeyVerificationStrategy(new NonVerifyingKeyVerificationStrategy());
+ DumbSlave agent = new DumbSlave(name, AGENT_WORK_DIR, launcher);
+ j.jenkins.addNode(agent);
+ return j.jenkins.getNode(agent.getNodeName());
+ }
+
+ private void createSshKeyCredentials(String id, String keyResourcePath, String passphrase) throws IOException {
+ String privateKey = IOUtils.toString(getClass().getResourceAsStream(keyResourcePath), StandardCharsets.UTF_8);
+ BasicSSHUserPrivateKey.DirectEntryPrivateKeySource privateKeySource = new BasicSSHUserPrivateKey.DirectEntryPrivateKeySource(
+ privateKey);
+ BasicSSHUserPrivateKey credentials = new BasicSSHUserPrivateKey(CredentialsScope.SYSTEM, id, USER, privateKeySource,
+ passphrase, "Private Key ssh credentials");
+ SystemCredentialsProvider.getInstance().getDomainCredentialsMap().put(Domain.global(),
+ Collections.singletonList(credentials));
+ }
+
+ private void createSshCredentials(String id) throws IOException {
+ StandardUsernameCredentials credentials =
+ new UsernamePasswordCredentialsImpl(CredentialsScope.SYSTEM, id, "", USER, PASSWORD);
+ SystemCredentialsProvider.getInstance().getDomainCredentialsMap().put(Domain.global(),
+ Collections.singletonList(credentials));
+ }
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentCurve25519Sha256ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentCurve25519Sha256ConnectionTest.java
new file mode 100644
index 00000000..6a1211cc
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentCurve25519Sha256ConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKexTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHKexTest.class})
+public class AgentCurve25519Sha256ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-curve25519-sha256";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentDSAConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentDSAConnectionTest.java
new file mode 100644
index 00000000..ff7de11f
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentDSAConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentDSAConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-dsa";
+ public static final String SSH_KEY_PATH = "ssh/dsakey";
+ public static final String SSH_KEY_PUB_PATH = "ssh/dsakey.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentECConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentECConnectionTest.java
new file mode 100644
index 00000000..9e6d0747
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentECConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentECConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ec";
+ public static final String SSH_KEY_PATH = "ssh/ecdsakey";
+ public static final String SSH_KEY_PUB_PATH = "ssh/ecdsakey.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp256ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp256ConnectionTest.java
new file mode 100644
index 00000000..37a2b09a
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp256ConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKexTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKexTest.class})
+public class AgentECDHSha2Nistp256ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ecdh-sha2-nistp256";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp384ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp384ConnectionTest.java
new file mode 100644
index 00000000..b6a475af
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp384ConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKexTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKexTest.class})
+public class AgentECDHSha2Nistp384ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ecdh-sha2-nistp384";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp521ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp521ConnectionTest.java
new file mode 100644
index 00000000..0f4bba9a
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentECDHSha2Nistp521ConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKexTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHKexTest.class})
+public class AgentECDHSha2Nistp521ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ecdh-sha2-nistp521";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentED25519ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentED25519ConnectionTest.java
new file mode 100644
index 00000000..c582abcb
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentED25519ConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentED25519ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ed25519";
+ public static final String SSH_KEY_PATH = "ssh/ed25519key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/ed25519key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentHostECConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentHostECConnectionTest.java
new file mode 100644
index 00000000..fbd0b8f3
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentHostECConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHHostKeyTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHHostKeyTest.class})
+public class AgentHostECConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-host-ec";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentHostEDConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentHostEDConnectionTest.java
new file mode 100644
index 00000000..8cc95030
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentHostEDConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHHostKeyTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHHostKeyTest.class})
+public class AgentHostEDConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-host-ed";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentHostRSAConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentHostRSAConnectionTest.java
new file mode 100644
index 00000000..cf7f76d2
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentHostRSAConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHHostKeyTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHHostKeyTest.class})
+public class AgentHostRSAConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-host-rsa";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA256ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA256ConnectionTest.java
new file mode 100644
index 00000000..5bfa655e
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA256ConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSA256ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa256";
+ public static final String SSH_KEY_PATH = "ssh/rsa-256-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-256-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA512ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA512ConnectionTest.java
new file mode 100644
index 00000000..012a43a3
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA512ConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSA512ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa512";
+ public static final String SSH_KEY_PATH = "ssh/rsa-512-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-512-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSAConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSAConnectionTest.java
new file mode 100644
index 00000000..7998be1a
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSAConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSAConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES128CBC_ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES128CBC_ConnectionTest.java
new file mode 100644
index 00000000..a12387f9
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES128CBC_ConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSA_AES128CBC_ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key-aes128-cbc";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, PASSWORD);
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES192CBC_ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES192CBC_ConnectionTest.java
new file mode 100644
index 00000000..ca27295f
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES192CBC_ConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSA_AES192CBC_ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key-aes192-cbc";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, PASSWORD);
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES256CBC_ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES256CBC_ConnectionTest.java
new file mode 100644
index 00000000..c000e922
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_AES256CBC_ConnectionTest.java
@@ -0,0 +1,44 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSA_AES256CBC_ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key-aes256-cbc";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, PASSWORD);
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_DESCBC_ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_DESCBC_ConnectionTest.java
new file mode 100644
index 00000000..4a09361b
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_DESCBC_ConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSA_DESCBC_ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key-des-cbc";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, PASSWORD);
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_DES_EDE3CBC_ConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_DES_EDE3CBC_ConnectionTest.java
new file mode 100644
index 00000000..dcfdea27
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentRSA_DES_EDE3CBC_ConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentRSA_DES_EDE3CBC_ConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-rsa";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key-des-ede3-cbc";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, PASSWORD);
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1404RSAConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1404RSAConnectionTest.java
new file mode 100644
index 00000000..855159f9
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1404RSAConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentUbuntu1404RSAConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ubuntu-14.04";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1604RSAConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1604RSAConnectionTest.java
new file mode 100644
index 00000000..d73777b5
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1604RSAConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentUbuntu1604RSAConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ubuntu-16.04";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1804RSAConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1804RSAConnectionTest.java
new file mode 100644
index 00000000..2c0cd94f
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu1804RSAConnectionTest.java
@@ -0,0 +1,46 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+import org.junit.Ignore;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentUbuntu1804RSAConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ubuntu-18.04";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu2004RSAConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu2004RSAConnectionTest.java
new file mode 100644
index 00000000..c08d9e48
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentUbuntu2004RSAConnectionTest.java
@@ -0,0 +1,47 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import hudson.plugins.sshslaves.categories.SSHKeyAuthenticationTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Ignore("Only for manual test.")
+@Category({ AgentSSHTest.class, SSHKeyAuthenticationTest.class})
+public class AgentUbuntu2004RSAConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-ubuntu-20.04";
+ public static final String SSH_KEY_PATH = "ssh/rsa-key";
+ public static final String SSH_KEY_PUB_PATH = "ssh/rsa-key.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT),
+ SSH_AGENT_NAME + "/" + SSH_KEY_PATH, "");
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/agents/AgentUserAndPasswordConnectionTest.java b/src/test/java/hudson/plugins/sshslaves/agents/AgentUserAndPasswordConnectionTest.java
new file mode 100644
index 00000000..de1c8877
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/agents/AgentUserAndPasswordConnectionTest.java
@@ -0,0 +1,42 @@
+package hudson.plugins.sshslaves.agents;
+
+import java.io.IOException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.builder.ImageFromDockerfile;
+import hudson.model.Descriptor;
+import hudson.model.Node;
+import hudson.plugins.sshslaves.categories.AgentSSHTest;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Connect to a remote SSH Agent
+ *
+ * @author Kuisathaverat
+ */
+@Category({ AgentSSHTest.class })
+public class AgentUserAndPasswordConnectionTest extends AgentConnectionBase {
+ public static final String SSH_AGENT_NAME = "ssh-agent-dsa";
+ public static final String SSH_KEY_PATH = "ssh/dsakey";
+ public static final String SSH_KEY_PUB_PATH = "ssh/dsakey.pub";
+
+ @Rule
+ public GenericContainer agentContainer = new GenericContainer(
+ new ImageFromDockerfile(SSH_AGENT_NAME, false)
+ .withFileFromClasspath(SSH_AUTHORIZED_KEYS, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_AUTHORIZED_KEYS)
+ .withFileFromClasspath(SSH_KEY_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PATH)
+ .withFileFromClasspath(SSH_KEY_PUB_PATH, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_KEY_PUB_PATH)
+ .withFileFromClasspath(SSH_SSHD_CONFIG, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + SSH_SSHD_CONFIG)
+ .withFileFromClasspath(DOCKERFILE, AGENTS_RESOURCES_PATH + "/" + SSH_AGENT_NAME + "/" + DOCKERFILE))
+ .withExposedPorts(22);
+
+ @Test
+ public void connectionTests() throws IOException, InterruptedException, Descriptor.FormException {
+ Node node = createPermanentAgent(SSH_AGENT_NAME, agentContainer.getHost(), agentContainer.getMappedPort(SSH_PORT));
+ waitForAgentConnected(node);
+ assertTrue(isSuccessfullyConnected(node));
+ }
+
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/categories/AgentSSHTest.java b/src/test/java/hudson/plugins/sshslaves/categories/AgentSSHTest.java
new file mode 100644
index 00000000..ea563b05
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/categories/AgentSSHTest.java
@@ -0,0 +1,10 @@
+package hudson.plugins.sshslaves.categories;
+
+/**
+ * Category for the SSH Agent tests
+ *
+ * @author Kuisathaverat
+ */
+public interface AgentSSHTest {
+ /* category marker */
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/categories/SSHHostKeyTest.java b/src/test/java/hudson/plugins/sshslaves/categories/SSHHostKeyTest.java
new file mode 100644
index 00000000..a2462472
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/categories/SSHHostKeyTest.java
@@ -0,0 +1,10 @@
+package hudson.plugins.sshslaves.categories;
+
+/**
+ * Category for the SSH Agent tests
+ *
+ * @author Kuisathaverat
+ */
+public interface SSHHostKeyTest {
+ /* category marker */
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/categories/SSHKexTest.java b/src/test/java/hudson/plugins/sshslaves/categories/SSHKexTest.java
new file mode 100644
index 00000000..de52d562
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/categories/SSHKexTest.java
@@ -0,0 +1,10 @@
+package hudson.plugins.sshslaves.categories;
+
+/**
+ * Category for the SSH Agent tests
+ *
+ * @author Kuisathaverat
+ */
+public interface SSHKexTest {
+ /* category marker */
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/categories/SSHKeyAuthenticationTest.java b/src/test/java/hudson/plugins/sshslaves/categories/SSHKeyAuthenticationTest.java
new file mode 100644
index 00000000..bea643ba
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/categories/SSHKeyAuthenticationTest.java
@@ -0,0 +1,10 @@
+package hudson.plugins.sshslaves.categories;
+
+/**
+ * Category for the SSH Agent tests
+ *
+ * @author Kuisathaverat
+ */
+public interface SSHKeyAuthenticationTest {
+ /* category marker */
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/rules/CheckIsDockerAvailable.java b/src/test/java/hudson/plugins/sshslaves/rules/CheckIsDockerAvailable.java
new file mode 100644
index 00000000..b28e25cf
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/rules/CheckIsDockerAvailable.java
@@ -0,0 +1,18 @@
+package hudson.plugins.sshslaves.rules;
+
+import org.junit.rules.ExternalResource;
+import org.testcontainers.DockerClientFactory;
+
+import static org.junit.Assume.assumeTrue;
+
+/**
+ * Rule to check if Docker is available.
+ *
+ * @author Kuisathaverat
+ */
+public class CheckIsDockerAvailable extends ExternalResource {
+ @Override
+ protected void before() {
+ assumeTrue(DockerClientFactory.instance().isDockerAvailable());
+ }
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/rules/CheckIsLinuxOrMac.java b/src/test/java/hudson/plugins/sshslaves/rules/CheckIsLinuxOrMac.java
new file mode 100644
index 00000000..6a52aa8d
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/rules/CheckIsLinuxOrMac.java
@@ -0,0 +1,17 @@
+package hudson.plugins.sshslaves.rules;
+
+import org.apache.commons.lang.SystemUtils;
+import org.junit.Assume;
+import org.junit.rules.ExternalResource;
+
+/**
+ * Rule to check the Operating system where the test run.
+ *
+ * @author Kuisathaverat
+ */
+public class CheckIsLinuxOrMac extends ExternalResource {
+ @Override
+ protected void before() throws Throwable {
+ Assume.assumeTrue(SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_LINUX);
+ }
+}
diff --git a/src/test/java/hudson/plugins/sshslaves/rules/Retry.java b/src/test/java/hudson/plugins/sshslaves/rules/Retry.java
new file mode 100644
index 00000000..e1f51c06
--- /dev/null
+++ b/src/test/java/hudson/plugins/sshslaves/rules/Retry.java
@@ -0,0 +1,42 @@
+package hudson.plugins.sshslaves.rules;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+/**
+ * https://stackoverflow.com/questions/8295100/how-to-re-run-failed-junit-tests-immediately
+ */
+public class Retry implements TestRule {
+ private int retryCount;
+
+ public Retry(int retryCount) {
+ this.retryCount = retryCount;
+ }
+
+ public Statement apply(Statement base, Description description) {
+ return statement(base, description);
+ }
+
+ private Statement statement(final Statement base, final Description description) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ Throwable caughtThrowable = null;
+
+ // implement retry logic here
+ for (int i = 0; i < retryCount; i++) {
+ try {
+ base.evaluate();
+ return;
+ } catch (Throwable t) {
+ caughtThrowable = t;
+ System.err.println(description.getDisplayName() + ": run " + (i+1) + " failed");
+ }
+ }
+ System.err.println(description.getDisplayName() + ": giving up after " + retryCount + " failures");
+ throw caughtThrowable;
+ }
+ };
+ }
+ }
diff --git a/src/test/java/hudson/plugins/sshslaves/verifiers/TrustHostKeyActionTest.java b/src/test/java/hudson/plugins/sshslaves/verifiers/TrustHostKeyActionTest.java
index 39cf6d6e..db177361 100644
--- a/src/test/java/hudson/plugins/sshslaves/verifiers/TrustHostKeyActionTest.java
+++ b/src/test/java/hudson/plugins/sshslaves/verifiers/TrustHostKeyActionTest.java
@@ -53,10 +53,10 @@
import hudson.slaves.SlaveComputer;
public class TrustHostKeyActionTest {
-
+
@Rule
public final TemporaryFolder temporaryFolder = new TemporaryFolder();
-
+
@Rule
public final JenkinsRule jenkins = new JenkinsRule();
@@ -66,7 +66,7 @@ private static int findPort() throws IOException {
return socket.getLocalPort();
}
}
-
+
@SuppressWarnings("unchecked")
@Test
public void testSubmitNotAuthorised() throws Exception {
@@ -76,7 +76,7 @@ public void testSubmitNotAuthorised() throws Exception {
new UsernamePasswordCredentialsImpl(CredentialsScope.SYSTEM, "dummyCredentialId", null, "user", "pass")
)
);
-
+
final int port = findPort();
try {
@@ -109,30 +109,30 @@ public void testSubmitNotAuthorised() throws Exception {
DumbSlave agent = new DumbSlave("test-agent", "SSH Test agent",
temporaryFolder.newFolder().getAbsolutePath(), "1", Mode.NORMAL, "",
launcher, RetentionStrategy.NOOP, Collections.emptyList());
-
+
jenkins.getInstance().addNode(agent);
SlaveComputer computer = (SlaveComputer) jenkins.getInstance().getComputer("test-agent");
try {
computer.connect(false).get();
} catch (ExecutionException ex){
- //TODO(oleg_nenashev): "Slave" check is still needed for PCT purposes, but it should be eventually cleaned up
+ //TODO(oleg_nenashev): "Slave" check is still needed for PCT purposes, but it should be eventually cleaned up
if (!ex.getMessage().startsWith("java.io.IOException: Slave failed") && !ex.getMessage().startsWith("java.io.IOException: Agent failed")) {
throw ex;
}
}
-
+
List actions = computer.getActions(TrustHostKeyAction.class);
assertEquals(computer.getLog(), 1, actions.size());
assertNull(actions.get(0).getExistingHostKey());
-
+
HtmlPage p = jenkins.createWebClient().getPage(agent, actions.get(0).getUrlName());
p.getElementByName("Yes").click();
-
+
assertTrue(actions.get(0).isComplete());
assertEquals(actions.get(0).getExistingHostKey(), actions.get(0).getHostKey());
-
-
+
+
}
private Object newSshServer() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
@@ -180,32 +180,28 @@ private Object newFactory() throws ClassNotFoundException, NoSuchMethodException
}
private Class newCommandFactoryClass() throws ClassNotFoundException {
- return Class.forName("org.apache.sshd.server.CommandFactory");
+ return Class.forName("org.apache.sshd.server.command.CommandFactory");
}
private Object newCommandFactory(Class commandFactoryClass) throws ClassNotFoundException, IllegalArgumentException {
return java.lang.reflect.Proxy.newProxyInstance(
commandFactoryClass.getClassLoader(),
new java.lang.Class[]{commandFactoryClass},
- new java.lang.reflect.InvocationHandler() {
-
- @Override
- public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws java.lang.Throwable {
+ (proxy, method, args) -> {
- if (method.getName().equals("createCommand")) {
- Class commandClass;
- try {
- commandClass = Class.forName("org.apache.sshd.server.command.UnknownCommand");
- } catch (ClassNotFoundException e) {
- commandClass = Class.forName("org.apache.sshd.server.scp.UnknownCommand");
- }
+ if (method.getName().equals("createCommand")) {
+ Class commandClass;
+ try {
+ commandClass = Class.forName("org.apache.sshd.server.command.UnknownCommand");
+ } catch (ClassNotFoundException e) {
+ commandClass = Class.forName("org.apache.sshd.server.scp.UnknownCommand");
+ }
- return commandClass.getConstructor(String.class).newInstance(args[0]);
- }
+ return commandClass.getConstructor(String.class).newInstance(args[0]);
+ }
- return null;
- }
- });
+ return null;
+ });
}
private Class newCommandAuthenticatorClass() throws ClassNotFoundException {
@@ -223,18 +219,14 @@ private Object newAuthenticator(Class passwordAuthenticatorClass) throws ClassNo
return java.lang.reflect.Proxy.newProxyInstance(
passwordAuthenticatorClass.getClassLoader(),
new java.lang.Class[]{passwordAuthenticatorClass},
- new java.lang.reflect.InvocationHandler() {
-
- @Override
- public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws java.lang.Throwable {
+ (proxy, method, args) -> {
- if (method.getName().equals("authenticate")) {
- return Boolean.TRUE;
- }
+ if (method.getName().equals("authenticate")) {
+ return Boolean.TRUE;
+ }
- return null;
- }
- });
+ return null;
+ });
}
private Object invoke(Object target, String methodName, Class[] parameterTypes, Object[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/sshd_config
new file mode 100644
index 00000000..b0980047
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-curve25519-sha256/ssh/sshd_config
@@ -0,0 +1,15 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+KexAlgorithms curve25519-sha256
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/authorized_keys
new file mode 100644
index 00000000..3da53d15
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/authorized_keys
@@ -0,0 +1,2 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBALuABB7ZLPgkdljfCza3BVTCuZ2M0QYpx3KuGd7WvSN3bgAq9luTLRpbjoyNEH2dIjk8NtMXY3Yk1MjDeN6OGhyPHHlaVtiBoA2ct62Q/17+FPObLtyXd3B2jb7MRUbW1dGRqinWQGr/wmrkyE4Q9yEes4rcEmRHXwNhP5l5+1qzAAAAFQCoR/mlasRxdgbCZCx2gM8ajSSCEQAAAIBMsluPPDcueeoePBvHnPAGV5o+2Kbd6vvUIfOtuwjtAYFtbEQQdl9wUQq57oRWDfUDeuE4kHNgsVoc5HwsRPY+mF94kC2Q86CraEnmAMXOOvEGdWAkngFJGvRmoyCSt8cVXSZTMF9IXWjArn1/ov1U/KpUEXV62k+Bx3MjYhnzswAAAIBRYcOd6Ng8p/DSTogFFBqAOSqoTvHLxtE9jYmeJISA0c3V396cc0oNHrUrJnOywX5AROjKzx8D5HkQuxQnb4n2vHFgmK4oRlfHtNu4zTWBQfS98Yv6o2Rbi0vlPoOHNnZM1DReGvQdWVinMfgxTDFGqZLmI4+KifnnHYHec9t3NQ== inifc@The-toxic-avenger-II.local
+ssh-dss AAAAB3NzaC1kc3MAAACBAIRkGmYClOfQAADnNPWAfdjVcbFgLElXCDslFbn6T8xtCaxOAHDPhmbs9ZHxydRkfe3z+8AHJWs2ZC3OjkPiv90UO4/P9xozHkiBmfJ/340FNuRzhWAjVp5E9McPtQTXxR0dbuoaEHSqaXozGZg3HIeJOH/9t10B811LH0v6ID5tAAAAFQDzrk+j/PB+MLqZAnLjmZiWIufzywAAAIApxlvENHZPB4/q5eji+v2x7VQx2jsTBeVUbeY1dyWKre/nO/YS2ZG2iamt2cgcw17wf3FZ7Kymoatv7PNnhu76Lubjaq4tB7qBA08SwXEddyQLZyWXI5hyiySyBaGpXp/ViveSuNBbzIskr+GRDY7xzI3DoPCXgxwENJKlTFEEsQAAAIEAg11TglZ+DmUu7OtIaNX56vcdFGa14DGNjoUqtnH4s/JFttqqS55aZVKeQh8b+F8tSLptjK/IBS83n76bx+/cu+Ee3WDS0M2jnTGU/twKtL++7mkiQ7AdLH6JXmqoXGVgcfTM4zos8CNDXo+k+2hZuoX3yWrSBK68TPvMzYC4XfE= inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/dsakey b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/dsakey
new file mode 100644
index 00000000..3c88095d
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/dsakey
@@ -0,0 +1,12 @@
+-----BEGIN DSA PRIVATE KEY-----
+MIIBvAIBAAKBgQCEZBpmApTn0AAA5zT1gH3Y1XGxYCxJVwg7JRW5+k/MbQmsTgBw
+z4Zm7PWR8cnUZH3t8/vAByVrNmQtzo5D4r/dFDuPz/caMx5IgZnyf9+NBTbkc4Vg
+I1aeRPTHD7UE18UdHW7qGhB0qml6MxmYNxyHiTh//bddAfNdSx9L+iA+bQIVAPOu
+T6P88H4wupkCcuOZmJYi5/PLAoGAKcZbxDR2TweP6uXo4vr9se1UMdo7EwXlVG3m
+NXcliq3v5zv2EtmRtomprdnIHMNe8H9xWeyspqGrb+zzZ4bu+i7m42quLQe6gQNP
+EsFxHXckC2cllyOYcosksgWhqV6f1Yr3krjQW8yLJK/hkQ2O8cyNw6Dwl4McBDSS
+pUxRBLECgYEAg11TglZ+DmUu7OtIaNX56vcdFGa14DGNjoUqtnH4s/JFttqqS55a
+ZVKeQh8b+F8tSLptjK/IBS83n76bx+/cu+Ee3WDS0M2jnTGU/twKtL++7mkiQ7Ad
+LH6JXmqoXGVgcfTM4zos8CNDXo+k+2hZuoX3yWrSBK68TPvMzYC4XfECFQCRkPdi
+9X5QbN1RF5bD4qgnpOdQTg==
+-----END DSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/dsakey.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/dsakey.pub
new file mode 100644
index 00000000..20d6d502
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/dsakey.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAIRkGmYClOfQAADnNPWAfdjVcbFgLElXCDslFbn6T8xtCaxOAHDPhmbs9ZHxydRkfe3z+8AHJWs2ZC3OjkPiv90UO4/P9xozHkiBmfJ/340FNuRzhWAjVp5E9McPtQTXxR0dbuoaEHSqaXozGZg3HIeJOH/9t10B811LH0v6ID5tAAAAFQDzrk+j/PB+MLqZAnLjmZiWIufzywAAAIApxlvENHZPB4/q5eji+v2x7VQx2jsTBeVUbeY1dyWKre/nO/YS2ZG2iamt2cgcw17wf3FZ7Kymoatv7PNnhu76Lubjaq4tB7qBA08SwXEddyQLZyWXI5hyiySyBaGpXp/ViveSuNBbzIskr+GRDY7xzI3DoPCXgxwENJKlTFEEsQAAAIEAg11TglZ+DmUu7OtIaNX56vcdFGa14DGNjoUqtnH4s/JFttqqS55aZVKeQh8b+F8tSLptjK/IBS83n76bx+/cu+Ee3WDS0M2jnTGU/twKtL++7mkiQ7AdLH6JXmqoXGVgcfTM4zos8CNDXo+k+2hZuoX3yWrSBK68TPvMzYC4XfE= inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/sshd_config
new file mode 100644
index 00000000..2da444aa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-dsa/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes=+ssh-dss
+HostbasedAcceptedKeyTypes=+ssh-dss
+HostKeyAlgorithms=+ssh-dss
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/authorized_keys
new file mode 100644
index 00000000..c4bd7557
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/authorized_keys
@@ -0,0 +1,2 @@
+ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAFA6uJvyVvpQ66pJjNJqQVqXJv/IqsmCassTi7hU8H0unm03Lr6Y6oiQzhLzydDIOkUOeFtdWlD0W6m1iPh9e0GZgAOm21/P/rw2K0lM6TOw9+WNOpH08jgNr7ZAi4h9s7j8BC3kAOPtOCveTd56TRMloaraRSboibuHkZHJp3em98m3g== inifc@The-toxic-avenger-II.local
+ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBACrCEb4WvC3MpRjVlRQ8t4BaQr0AlORvs7Aoj7o/BGCgkRx67eilJgi/xDa+DNEZU+fquFfcRCNQZC2DXaoE+5llgEVRq5mTb1WjjdKwSRjhPAXuVozy8Cgs4eghkPwMdmIJNTj9EVTpDHJgl+leMUY2PtTMRHkbwFEemlVH9BY7PaLNg== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/ecdsakey b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/ecdsakey
new file mode 100644
index 00000000..218b4743
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/ecdsakey
@@ -0,0 +1,7 @@
+-----BEGIN EC PRIVATE KEY-----
+MIHcAgEBBEIBeIQ4dghknd6NyyT3NLUxALQoCbtHGoBp9b5E/G5oD3ooBpndp88t
+9va2XMMItUVH7XVOt7/Wo9L/OsMdw9neZHGgBwYFK4EEACOhgYkDgYYABACrCEb4
+WvC3MpRjVlRQ8t4BaQr0AlORvs7Aoj7o/BGCgkRx67eilJgi/xDa+DNEZU+fquFf
+cRCNQZC2DXaoE+5llgEVRq5mTb1WjjdKwSRjhPAXuVozy8Cgs4eghkPwMdmIJNTj
+9EVTpDHJgl+leMUY2PtTMRHkbwFEemlVH9BY7PaLNg==
+-----END EC PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/ecdsakey.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/ecdsakey.pub
new file mode 100644
index 00000000..edfe248e
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/ecdsakey.pub
@@ -0,0 +1 @@
+ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBACrCEb4WvC3MpRjVlRQ8t4BaQr0AlORvs7Aoj7o/BGCgkRx67eilJgi/xDa+DNEZU+fquFfcRCNQZC2DXaoE+5llgEVRq5mTb1WjjdKwSRjhPAXuVozy8Cgs4eghkPwMdmIJNTj9EVTpDHJgl+leMUY2PtTMRHkbwFEemlVH9BY7PaLNg== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/sshd_config
new file mode 100644
index 00000000..ed2a3e0b
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ec/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
+HostbasedAcceptedKeyTypes ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
+HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKgIBAAKCAgEAzxYUc+vnLpK9G3FS780COAE0IblNZ+f9+JRoa8Rdb+Ug0mxj
+0Y+uUwCjCQj42QY/snUIubfcVJNkS31lzYmNwajnEjc1xHxpPVG8JtMH9GoFxcMn
+VoJkT4pkReiGFjw1J9+brLSOaBNWGEt1HNN553Ti/4qp6A3d00AI1+ghY3PIYOaI
+jDGerEpZsirpSXIfuEUtyH8DcV185JYr0OVDy+kMk9YYJef3KZ1YbtsprWBHR/7K
+HcN2KcbQ9AkZRU1Xb8b7m2tGde0+gIXiDYF4kaEocvcxTHAozlPgm3ue5++4S5q6
+CinzEVXlWu0dXHil1KvLZjdq6qG46XwCx1k9+G3RASaFxkzuMAqxZTs2Njc+Hj4N
+Xb+gqI6aNSAfVzPYTLm8dUGvSa5y/lHPKkJlQoX7OTL/sc0OEN4fwbY8Q3TSr02A
+NwOsed3IqzNj8PpuV2GBGwe3NG17x3ClvXHsCOtT7UUVzs+sOyz76J/uPlf3RiGs
+F9SYvG8ui4m9dyRGL3hB87vRmUr9tLRIk9r6T5+fb17BnMbLTlwLqQgtRnOSDISH
+1yU3pnEvmboDhyYrGc78MHCoMCuHF7PbFpGiC/rKdiurJigvksylxUExrThmIRHZ
++vCJjVTdhJdJ76Yb5f35lY/Zts8Kil0+TPXVWDrNI0cKv1W4dOCTg+paSwMCAwEA
+AQKCAgEAra1i8eXDObgvibh9Skixt66qvi3e0WosAjLVcKx7gMC1ykTFYpgSJ+K8
+2XMA4WLwQQcOjlO5IeWLlBRTMRJQJT82rHxJR8TfrmHCXv1WCpJwzO9jKpao8lyq
+xEbDThqoqgxLT4kOdhLhffaq/cYO0yOgzZjJ7qjShb2KrSkt926/eyVdF9b1sKGa
+oGaEyOhB2hWK1EBR7t3tRPj9PnFJbtbBiathDUmCbRBdfnuodJPutF7nvBaWH2tz
+C3gmDY1T65cCpdJOgdC7PqcKczFGoTx75A+U9PqL/p8yHLSNDRBrjFzz8lpEVSGo
+/Z0npso4qih6qfuIW8fOgWNUIUSjRxjbecv2FEo2jrJgQu7ijfRbNIjPicOQIudC
+3gt3NFJipvYjcP+Yw5996QVWloi114rLNqxewZ/rsNKLda6t8APsdqCJRdv4tWHh
+JcfQrSeWCR4kaziJnpfPD1PNkEMjaapFrD+3gsRPH2QctcgKC1QBqShvhnP1HbOa
+ViUw+iTw3g/+8W2rGMaBADMuoNfBe63UnfhtsLLX4/nAAf1MzjJx3HDPE7fVfyg+
+ylwNgBT9GVJZQBRgTg/wvAPS2Ps9LfD52GkpwNNdwt5ZLpGQrrLthhc9uygy8ypT
+bHIPLLSDwwj6GWFKuCp+gibBhjDLJAJ7quttfxAQme33W5GMZaECggEBAOxRlLFl
+zr8coom8HUFny17kzrNf5hSuf+G5MS/Rb1kq12hDqilDrctLb5RzQzC5iFUVzazF
+FU/yILvE92xjdvVk82IltVVRF+eUk6zhgmvgmhEp1DuGFpwoKOM4v7doO95zhrtI
+t/LtZSV7Lw51H1FDONom72m/baLiXQ9pOasbK+tW8+AU9+8D4cjq+PGBzE4vVqmi
+JG91ZvNbxjiODl9FXq615fm51w75GRpy3QQE5UGWHVNrLErxfTjprJbxBIroY2Pr
+o1W9fC3tpWOLypcNBfQQ+BRqYQT68vdp4LaAGQvoKhHybpf1v1/zx4nXW7tMI+0K
+AeXn71C7NVrOov8CggEBAOBVQDHCDNQZA78Tn7qWJlPhqYuEALxRuKKRcGAP55+M
+rmEg+UjZ4sGOiz2cwWuZDvmR2x9KGjs1Fef7/25TsNw5bT0V4TY8Jt9s5cJbgixk
+3HaGqnc2/TU3C1vwdyO0FlDTGveNxY9m5u49VHnxm1ZOavFx0yFCyQdRhTRWvVym
+Ru65BrFecT+Jo0faL7OjAvB76Lq7dPw2LpG/nHmqwOxDOFIuGqVr7fw4nTnv4kFP
+9r1EThvp7lIfnhLEavm/+9bC0uH4Nm6q/mZmPV0Qiv6qpXZC/eBlnhTx8dMqmq8S
+H8qah0qJ/jWr5qGJusl95hQCFLAEdFewlHkN0yYdy/0CggEAY/6lL2dH02A3epaJ
+voo/6Lhiqk3y2l94JzgokvZI6m8RVMIE9472tCYIYcVf8fcfs/kU3X1LZleq+CkB
+FPEFfhKoVahlEWPN/KTG1AlcGW+hYY/UiRdU6+CmZHc30FCfvKIfqZG8nGNNQE3e
+fHycstMB9HUzKwjgSGMGQ6Yfy8IklGFnsjLNMmrvGAgtLGvi2lZ3kjHUvwDrfiAg
+QQADHtcImF7JoCC92k0XDTT7Rl8X7uepIwofZNrIRNPDvt7fMDPjEn270GTsbba4
+G+Yj5ESTd1HS1zioMuZI9t3rQu3zKzGi05NErrJCt0Q885uX6inurbdlVDYO8pc0
+nWcAWwKCAQEAsTAkyChxYYVwhBfH7eRy2YZAGEZnHled8inWDMoDNO41PdqBi50t
+kZw5Nqz9yTLXtSATZx9soJ9JcjaEhmvsIcXqFnmVrPTN72NgBqeopc/0olmzgv4X
++VRE0JWaRMUVazmS7z03chDhDgO7GaZP/1do+NPi4z6Q8grdn31zjB55oEzckHP8
+FydrpHEdhFGZHMGCDRvLRvq0xcIGocLRJsvhTGfF/CrHipRc+0oR92xlgxDUcQ/Q
+gWUfwcsKg8Gz9OllD76xn6/HyLGwfjV207eNgV9gj0E0H28KhrP8AZPbMHflrGZa
+N6JTQ/w5YLTkaaFLHcwm6Kw8WXEl+dFHMQKCAQEAwF2PLHD8FzU/wayOanMlsnxt
+TaR4YhhdMW1LIcPHESM69ZhdUUMzq/Y50Mms/DlcLNkgKzn73kYKLV3oR+/p3VhN
+HBR710SpkrD1xDovLEe5S8uL+z+Q9Iaxqzgn85xHIn+BWJa+x3doAzpuOptmY7SP
+75cQqiIhk/Z4PAXBo0GXiO6qiMzrakx02Q2eB1WQ4INrLEhdkL/ZlRPL/1mX3YAb
+OZI78b2iu0Wq6PNsCKo7ptLmB963xxsxJo1e2qqKPvXoHndIrN/bo20AlGG0CNn6
+tFK62J1BWYwPIWOIHQPTq3kqBjHJgUo9dKyJE3/QoU/UIp+Kvwgd6ZVanZ7xPQ==
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/sshd_config
new file mode 100644
index 00000000..64af33e0
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp256/ssh/sshd_config
@@ -0,0 +1,15 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+KexAlgorithms ecdh-sha2-nistp256
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/sshd_config
new file mode 100644
index 00000000..31826414
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp384/ssh/sshd_config
@@ -0,0 +1,15 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+KexAlgorithms ecdh-sha2-nistp384
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKgIBAAKCAgEAzxYUc+vnLpK9G3FS780COAE0IblNZ+f9+JRoa8Rdb+Ug0mxj
+0Y+uUwCjCQj42QY/snUIubfcVJNkS31lzYmNwajnEjc1xHxpPVG8JtMH9GoFxcMn
+VoJkT4pkReiGFjw1J9+brLSOaBNWGEt1HNN553Ti/4qp6A3d00AI1+ghY3PIYOaI
+jDGerEpZsirpSXIfuEUtyH8DcV185JYr0OVDy+kMk9YYJef3KZ1YbtsprWBHR/7K
+HcN2KcbQ9AkZRU1Xb8b7m2tGde0+gIXiDYF4kaEocvcxTHAozlPgm3ue5++4S5q6
+CinzEVXlWu0dXHil1KvLZjdq6qG46XwCx1k9+G3RASaFxkzuMAqxZTs2Njc+Hj4N
+Xb+gqI6aNSAfVzPYTLm8dUGvSa5y/lHPKkJlQoX7OTL/sc0OEN4fwbY8Q3TSr02A
+NwOsed3IqzNj8PpuV2GBGwe3NG17x3ClvXHsCOtT7UUVzs+sOyz76J/uPlf3RiGs
+F9SYvG8ui4m9dyRGL3hB87vRmUr9tLRIk9r6T5+fb17BnMbLTlwLqQgtRnOSDISH
+1yU3pnEvmboDhyYrGc78MHCoMCuHF7PbFpGiC/rKdiurJigvksylxUExrThmIRHZ
++vCJjVTdhJdJ76Yb5f35lY/Zts8Kil0+TPXVWDrNI0cKv1W4dOCTg+paSwMCAwEA
+AQKCAgEAra1i8eXDObgvibh9Skixt66qvi3e0WosAjLVcKx7gMC1ykTFYpgSJ+K8
+2XMA4WLwQQcOjlO5IeWLlBRTMRJQJT82rHxJR8TfrmHCXv1WCpJwzO9jKpao8lyq
+xEbDThqoqgxLT4kOdhLhffaq/cYO0yOgzZjJ7qjShb2KrSkt926/eyVdF9b1sKGa
+oGaEyOhB2hWK1EBR7t3tRPj9PnFJbtbBiathDUmCbRBdfnuodJPutF7nvBaWH2tz
+C3gmDY1T65cCpdJOgdC7PqcKczFGoTx75A+U9PqL/p8yHLSNDRBrjFzz8lpEVSGo
+/Z0npso4qih6qfuIW8fOgWNUIUSjRxjbecv2FEo2jrJgQu7ijfRbNIjPicOQIudC
+3gt3NFJipvYjcP+Yw5996QVWloi114rLNqxewZ/rsNKLda6t8APsdqCJRdv4tWHh
+JcfQrSeWCR4kaziJnpfPD1PNkEMjaapFrD+3gsRPH2QctcgKC1QBqShvhnP1HbOa
+ViUw+iTw3g/+8W2rGMaBADMuoNfBe63UnfhtsLLX4/nAAf1MzjJx3HDPE7fVfyg+
+ylwNgBT9GVJZQBRgTg/wvAPS2Ps9LfD52GkpwNNdwt5ZLpGQrrLthhc9uygy8ypT
+bHIPLLSDwwj6GWFKuCp+gibBhjDLJAJ7quttfxAQme33W5GMZaECggEBAOxRlLFl
+zr8coom8HUFny17kzrNf5hSuf+G5MS/Rb1kq12hDqilDrctLb5RzQzC5iFUVzazF
+FU/yILvE92xjdvVk82IltVVRF+eUk6zhgmvgmhEp1DuGFpwoKOM4v7doO95zhrtI
+t/LtZSV7Lw51H1FDONom72m/baLiXQ9pOasbK+tW8+AU9+8D4cjq+PGBzE4vVqmi
+JG91ZvNbxjiODl9FXq615fm51w75GRpy3QQE5UGWHVNrLErxfTjprJbxBIroY2Pr
+o1W9fC3tpWOLypcNBfQQ+BRqYQT68vdp4LaAGQvoKhHybpf1v1/zx4nXW7tMI+0K
+AeXn71C7NVrOov8CggEBAOBVQDHCDNQZA78Tn7qWJlPhqYuEALxRuKKRcGAP55+M
+rmEg+UjZ4sGOiz2cwWuZDvmR2x9KGjs1Fef7/25TsNw5bT0V4TY8Jt9s5cJbgixk
+3HaGqnc2/TU3C1vwdyO0FlDTGveNxY9m5u49VHnxm1ZOavFx0yFCyQdRhTRWvVym
+Ru65BrFecT+Jo0faL7OjAvB76Lq7dPw2LpG/nHmqwOxDOFIuGqVr7fw4nTnv4kFP
+9r1EThvp7lIfnhLEavm/+9bC0uH4Nm6q/mZmPV0Qiv6qpXZC/eBlnhTx8dMqmq8S
+H8qah0qJ/jWr5qGJusl95hQCFLAEdFewlHkN0yYdy/0CggEAY/6lL2dH02A3epaJ
+voo/6Lhiqk3y2l94JzgokvZI6m8RVMIE9472tCYIYcVf8fcfs/kU3X1LZleq+CkB
+FPEFfhKoVahlEWPN/KTG1AlcGW+hYY/UiRdU6+CmZHc30FCfvKIfqZG8nGNNQE3e
+fHycstMB9HUzKwjgSGMGQ6Yfy8IklGFnsjLNMmrvGAgtLGvi2lZ3kjHUvwDrfiAg
+QQADHtcImF7JoCC92k0XDTT7Rl8X7uepIwofZNrIRNPDvt7fMDPjEn270GTsbba4
+G+Yj5ESTd1HS1zioMuZI9t3rQu3zKzGi05NErrJCt0Q885uX6inurbdlVDYO8pc0
+nWcAWwKCAQEAsTAkyChxYYVwhBfH7eRy2YZAGEZnHled8inWDMoDNO41PdqBi50t
+kZw5Nqz9yTLXtSATZx9soJ9JcjaEhmvsIcXqFnmVrPTN72NgBqeopc/0olmzgv4X
++VRE0JWaRMUVazmS7z03chDhDgO7GaZP/1do+NPi4z6Q8grdn31zjB55oEzckHP8
+FydrpHEdhFGZHMGCDRvLRvq0xcIGocLRJsvhTGfF/CrHipRc+0oR92xlgxDUcQ/Q
+gWUfwcsKg8Gz9OllD76xn6/HyLGwfjV207eNgV9gj0E0H28KhrP8AZPbMHflrGZa
+N6JTQ/w5YLTkaaFLHcwm6Kw8WXEl+dFHMQKCAQEAwF2PLHD8FzU/wayOanMlsnxt
+TaR4YhhdMW1LIcPHESM69ZhdUUMzq/Y50Mms/DlcLNkgKzn73kYKLV3oR+/p3VhN
+HBR710SpkrD1xDovLEe5S8uL+z+Q9Iaxqzgn85xHIn+BWJa+x3doAzpuOptmY7SP
+75cQqiIhk/Z4PAXBo0GXiO6qiMzrakx02Q2eB1WQ4INrLEhdkL/ZlRPL/1mX3YAb
+OZI78b2iu0Wq6PNsCKo7ptLmB963xxsxJo1e2qqKPvXoHndIrN/bo20AlGG0CNn6
+tFK62J1BWYwPIWOIHQPTq3kqBjHJgUo9dKyJE3/QoU/UIp+Kvwgd6ZVanZ7xPQ==
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/sshd_config
new file mode 100644
index 00000000..ed4c386f
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ecdh-sha2-nistp521/ssh/sshd_config
@@ -0,0 +1,15 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+KexAlgorithms ecdh-sha2-nistp521
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/authorized_keys
new file mode 100644
index 00000000..d27c439b
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/authorized_keys
@@ -0,0 +1,2 @@
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDqJQOoriErxxy+uvboaC6ADzZWiyAN/ZERFxt3tHW2z inifc@The-toxic-avenger-II.local
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPRPSAhS3dFyNAlnxKPoewUppNgO5rYXo1YUIlc5rz+q inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/ed25519key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/ed25519key
new file mode 100644
index 00000000..8645f826
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/ed25519key
@@ -0,0 +1,7 @@
+-----BEGIN OPENSSH PRIVATE KEY-----
+b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
+QyNTUxOQAAACD0T0gIUt3RcjQJZ8Sj6HsFKaTYDua2F6NWFCJXOa8/qgAAAJACR0HzAkdB
+8wAAAAtzc2gtZWQyNTUxOQAAACD0T0gIUt3RcjQJZ8Sj6HsFKaTYDua2F6NWFCJXOa8/qg
+AAAECIeu3SkXljb1tGkH+kEJNNK2g19QbPz/Vi9lZVU45A+/RPSAhS3dFyNAlnxKPoewUp
+pNgO5rYXo1YUIlc5rz+qAAAADWluaWZjQHdhcmhlYWQ=
+-----END OPENSSH PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/ed25519key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/ed25519key.pub
new file mode 100644
index 00000000..32f47808
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/ed25519key.pub
@@ -0,0 +1 @@
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPRPSAhS3dFyNAlnxKPoewUppNgO5rYXo1YUIlc5rz+q inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/sshd_config
new file mode 100644
index 00000000..52bf1b50
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ed25519/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes ssh-ed25519
+HostbasedAcceptedKeyTypes ssh-ed25519
+HostKeyAlgorithms ssh-ed25519
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/Dockerfile
new file mode 100644
index 00000000..df485831
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/Dockerfile
@@ -0,0 +1,46 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
+
+RUN rm /etc/ssh/ssh_host_dsa* /etc/ssh/ssh_host_ed* /etc/ssh/ssh_host_rsa*
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/sshd_config
new file mode 100644
index 00000000..3bb2319e
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ec/ssh/sshd_config
@@ -0,0 +1,13 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/Dockerfile
new file mode 100644
index 00000000..51aff637
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/Dockerfile
@@ -0,0 +1,46 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
+
+RUN rm /etc/ssh/ssh_host_dsa* /etc/ssh/ssh_host_ec* /etc/ssh/ssh_host_rsa*
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/sshd_config
new file mode 100644
index 00000000..3bb2319e
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-ed/ssh/sshd_config
@@ -0,0 +1,13 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/Dockerfile
new file mode 100644
index 00000000..0d3df278
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/Dockerfile
@@ -0,0 +1,46 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
+
+RUN rm /etc/ssh/ssh_host_dsa* /etc/ssh/ssh_host_ed* /etc/ssh/ssh_host_ec*
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/sshd_config
new file mode 100644
index 00000000..3bb2319e
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-host-rsa/ssh/sshd_config
@@ -0,0 +1,13 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes128-cbc b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes128-cbc
new file mode 100644
index 00000000..589f4782
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes128-cbc
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-128-CBC,3931899F8F20CCBDA0692CAF6BA5CE9B
+
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes192-cbc b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes192-cbc
new file mode 100644
index 00000000..694229d1
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes192-cbc
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-192-CBC,160CCC8D8DFD21740AF14F59C43F7B6E
+
+e+tmJbmIZfIf0aq8Pak6fAYxxrVvOe+4UgT3QGGAZhZXz0T++A06hGQl32cPXvcY
+BIx3GzV8FjYWh1nmrrTfWWrZlfLeg3kdFgSovhFrrxSqCH1ey26XEMdNOtJt3wZT
+lkF0VPdQ+Dpu5EjoekHc36ewYVdTuNrhJ2rGxsdHOq+tccm7UE+xSFfvY45fE9+b
+6JM2s/F9kdvG+hyD/IMlfRVb9wTtbowNUKhAOYNlto83JhuzJvZNFKNnEiD439q/
+PleAVflN4fwXTSDpwxeXrCDwG6K32LgrhOnYj7xwSfcjoPQI9xm086KpOUXhO/Ym
+EyD03OS6yv8Yk0EBXHP4y3T7ZI4hKte7Ad5dOBpK5gU7QidfHP8NVmVuKeSTpxxA
+xMfSQI0mRqSGq9aLOH3xL7vQYgmFb6FqE+v2nv+5tF0pO3swz3N4ef08B71U4m7F
+6+MosRAeZrgJLtE+Bt/VJIxczazSPyg1Ab3MdSPSmuiWEAyzd277Tp2XD1Vtwide
+Ds/V6qgiX+ri9PYZ30HlqvVjBi7v4xyRybfUsUd8zctIs1kLT/4/RHnAZzSjWQNy
+9nNYDe8oUCaHKIspqzy4RHj1wyP+hau46REDoVUom9IlSCt0KTCywbKwgc2MObgM
+qOEq4xBKdnaj20HLq4lCsfcetwxM3FhcCDq6NxWFKwuMxOIg62vCVXt87mLq5tWd
+RKJ/fF68/y03WzGkZ2FZkZi6h+HC1X+IYe5uabMg1bldhgjH/LrUTXNgRuBPPm3G
+fcNIL/Wyq+E8K6IHfq9MMZeOWA2fhE3DwormDC2w3KIP/KeRMVfnoZF2copdX4Dp
+R/UHFXD+VX/r2An8Hq3U7Aw/KCkdbllPS71XyebElTsYGMkyjtikfma/VmgJTEbn
+RjB9Fa3J/8Y7MMBd9fzOEJKDeUU1oq7sMZ8ctodMf6pGlWSh5px1YegMu3C+OcbL
+PESfZdCmV4MJFRckiJLY03A4/4UkyKu7W5lXaFZYumffCXJ1+MwB1HZQo81ABgCz
+RXUv1UD6KcjJ59rMuTZVuHWS5uJpXLIGpPKgYE/SsajhwolDv3/NifSRZZkXaT4Q
+CFoKWGO+okBMqnOSxnIuUE1HAp0+LVEG1ceTkgbkmD9hEVGKv60LAG9UHPImaMaF
+cyTuOufD/HVHwbefv1EPKU5/QOFsdhljJUIFF3INfvWMFHnA8SaFIVRY4S60TwaJ
+O5xP3k/7nvddNJfSNgjNJduWXg2K9Kim29lnwD0hMrROyJobdFUJGTXEaaY+wP2K
+9wB9uHzwcrwKo3AlzBl+f9S7mtY2/4AOo2+fz4OTG3oHxGRx4hrQxWWZ5jcOqdwd
+BxZeU7vda9hgueDuBMbszA2a6efllc3kxjf2OgMkK08SsADL/7sT+4Tp/SKQwCoZ
+4DQUQrxzRCWH69cBcHKlLMj9enTEVYkmb+P8Ev0HGTRtpwksX4JO5ypR0qrGEGXc
+b17j982/eWxkk9CmoeN8n9JGZsgzF7lVYiKA2RJZEn0eV8r0zQpRekNAH+6gM+3K
+vKbqRDWkHn71zZB5gbawZXDw5K2TEt01F93R2QW/2Kn1GLVN8ulyvaIEDc2dIcjV
+l6BdDrE8kMC816jvtFBfCIHu57KMvJpdiBJZygHwUR1/cUZ6thIo2cjE2S71R2HU
+RQUnnt39O89R99x+FnqH9D45Uz+cpNy0yVB3lojeTPEiP3TZxRTeBANgM2JtTc+N
+H4EbE1cwyuYPhrKSHz2YZJPATcErWDuIjaNhSpcC7i/0jKSoPhRrH5kRU0WtX96L
+VnN+pZMZnAJIX80Zj7JyL7ZafBAAWOKjzIS23FNGmnslIrp88XHsNdCOPc8ki7A1
+APjLb4ZuTtz2jBjDcINlSLq/LTfBYtSqxt+B14MMnoPy91daT6WDhKBO6+P7H3eA
+LKsSRSXu3Xi46LeWV1AAE3qUP0jVizVqynjZaV2dTKUlcabIgC9Zblm08Jns512J
+1quM33SlDtHSH1NKi9MgoPrlIWF2LR8Yi5q+c66C5PFRneioPsuf9SJXdfptKx2s
+k9bv/nD5g9ME7ETDX6ngcZRDdtS3fehi7AKFvINPfLgWDQBUNcf+2SbwiE8+Ij0k
+1yArWRR8/MoRkULI9aFSdIwHbOSRsriIO5VfUkG0ROIPdZgJMwh8u03yhekUaSTw
+bAhqsKqct768FDlVeJgadsfZUe+n5R/ImLq9uu9OM6FbkxKnqm5ws1PvvfomT8x3
+GYjyF19oPOHQrQKAJM3goJ3sQ9cLi9iZvAyegBxg8YDBj8i9Hg182AI6R3bbruEw
+WiN1qXfULEbF6IkilD8n8YVVlN7h+M8n9gzGBLm5kLCSPIQmuhqBrITxCoj7HvRG
+3A54L1U0jF9QrZRaXK5Zs22yx7bHFFfqoGYKXWXab4HC6GfwdIYpewvZvAD1Xz05
+31CrYNyztrmGspPxNsT/J5lHA+NfYX2iXq4WN/aGffiMxSo7MuIC9GqZRsxQndjc
+586TTQUYtDomnXqg4GjBGn0uFM4z//5f8YT4eV5teW+DQWgEzIXu5prMM9jiQkNA
+VNJgQk1RkV0l/z8DbZWxqt2MdRTvIGXJIP8AD6Vus4Hyv/iqZTd13N3hRj54LwC6
+K/kPfMkAHRIoqIn+NTJx7iKeF5gjDx6ynYz0P+vl9AlZVkQIqMpw72KMAhLQPbJg
+/766yzs+fe1UgGmKcKIiGEffONuU4fZV/a01npu2mOqREjS1rIbln83jMH5sVylW
+B4aeYyb5Bbz5VVSKs8DfWtCiwP6MvfYX87pzpWAQ6VYlmVuEWE5trTj56sbaMpPY
+O6Igmg6EMYFAcvnBQW5SCPVHZ21TEV7q2bCpfmgmC3Ro20MdzLWapCy05Go3TZs/
+1vEbiZ2HfqL5mn5DoDyrBiwCNHEQx3sUTqnc/bWc+8vASrLf5pYKvehxktBWesv+
+R/LVVfBBIEL3v8esKk5z3oR7B8oOBbjmOLAnayvyohz10GysRbqMdr5zhY016v8Y
+yQJKokGvJLiWd7oBeVlpKCZ9ZbtcunYlyocf3OcOM+hgyMNIicrtLVuSy/PEGPYR
+fTNXNiQyGd8345uvCXXVT1NFxoG2zD2WdcPo7zKxlCPeRJtDFY2mANnPPl9ajRyE
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes256-cbc b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes256-cbc
new file mode 100644
index 00000000..24de7e0a
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-aes256-cbc
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,4B27F143A3534B0FD1271F1431962727
+
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-des-cbc b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-des-cbc
new file mode 100644
index 00000000..1bbc58a7
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-des-cbc
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-CBC,41228C5CF14D6ECA
+
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-des-ede3-cbc b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-des-ede3-cbc
new file mode 100644
index 00000000..7baac617
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key-des-ede3-cbc
@@ -0,0 +1,54 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,D5A0E38769AB0274
+
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/sshd_config
new file mode 100644
index 00000000..c0abd87a
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes ssh-rsa
+HostbasedAcceptedKeyTypes ssh-rsa
+HostKeyAlgorithms ssh-rsa
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/authorized_keys
new file mode 100644
index 00000000..d6af5292
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/authorized_keys
@@ -0,0 +1,2 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDW3NDkkJ6P+xWQJxikh6uT+M0havQHM0u0GG7JfyhxSrw2ZUaDOye/Qx5vtV722OJ8RZM+Pqx+R2ykqFu0uGp64dn4Zdgn1tCzcjHBZzT2AD4bu0Z6NnIxEx4I/BR/bIELwbQ0XEgzowO17sDhkROkG4MxQ0Bq6AXv/+3HXJlQ+DgU8ntzQLzqxBNOo324jMj5BCM4ohOR/MaMwjdVLwtGmXKf7oMwmvKJcmvSNY3XzszOmKJY92JCrOOvWAPfZJo51p5Pvt02Xb88alWfcdcrNoqh7+rxmLwe2fYAw195NyKD3mBB66Q/N2XolYAoKvYhSKE0cWwfb196l/y1zXDZsr43104gMY1njuA8ii7Uib28iIKsZI1MkFanXj/H1JZgMxUgLy6337UxvJU+J3lsM/SpdOmrLmS/dj0c6o1SYKj5KQdlESSyEG+2/uQVXgD/9lrXctBtmLe+hM6mOwPlA8JZ0/WM7ExAcidS40L0Ikos5U6o7NbHMc8ymMQwq+/FRg14FOYDssJOaF/ll8krWHir4RvghwONA2QFh4tsPhiWqS43l4H2HGHbqYuMUXjJ561MmLfLfbe8efuUldd61o1a3raWePpdtakVx7JsqYrfxB5m3YzhYQYipHfVp+TvvHDD/L7NYx5btsLj2eRRjRzHTsyEUo9vDEaVM7NQgQ== inifc@The-toxic-avenger-II.local
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCdzYCUgsh5WCZzASTan1+H72eFmtpGEd3qlLSkpm6fWGGO5N7gPmMnmt5XGhrXj3ce5kWRD2KEsdHob9QBbcdlR0zSy5OU7cRfzzZYeLjb0M+aWwLln6fI50moBIUalQRH729mgiFLADMi1doDj+6xUg1Z6L98qVEAi2QQC67qqnLgmeixdRi4MDX/2gM5W4ewmNKx4atbJbyf9GbJCyuukUCOcGzYOlSWWcY9CK/Bd7euL1zShUiL81bNKSI+TVKKJGgHwa6VNg7+IeEypPFHl01TgaWMoRutAd2YDF4c31Njfx+R5QuZWQlijet+xOB1oABHymLwGaun7ZF3JYBJaWkjsTLL8J6hfPho+4SCBTHNDM4UL/egoqx1D3VVTjzPTnTTIR6MR/m9yfA5cgN8RG7eyaLoEh8JLWwrg6qH/OklinQ5JP+fsIAtXGauj4gD8JwJjjvPrzHDEZYPKH4BJWJZY3Ga2c1vJKP0t5cu9cG4T/XvL6D/2Oac7IR/9n8ahG0Nd1jKHIrLJ6OVaGvyWkoaTfzL/w7ogBqd05yQipSKVfJ6zsmN7OT4XB5tFIix4TPimeH4f91BIM4f1F/8Vd6mhZtMdABfeUKCqZIOqxFrFD/fwmTDfMZ+WewGIcSxQ0vlZHlEZJUfu6drlBGJl2FuJhEzkd0L/+wTrkxkjw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/rsa-256-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/rsa-256-key
new file mode 100644
index 00000000..cd5cbf77
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/rsa-256-key
@@ -0,0 +1,49 @@
+-----BEGIN OPENSSH PRIVATE KEY-----
+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
+-----END OPENSSH PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/rsa-256-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/rsa-256-key.pub
new file mode 100644
index 00000000..d85eb6de
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/rsa-256-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCdzYCUgsh5WCZzASTan1+H72eFmtpGEd3qlLSkpm6fWGGO5N7gPmMnmt5XGhrXj3ce5kWRD2KEsdHob9QBbcdlR0zSy5OU7cRfzzZYeLjb0M+aWwLln6fI50moBIUalQRH729mgiFLADMi1doDj+6xUg1Z6L98qVEAi2QQC67qqnLgmeixdRi4MDX/2gM5W4ewmNKx4atbJbyf9GbJCyuukUCOcGzYOlSWWcY9CK/Bd7euL1zShUiL81bNKSI+TVKKJGgHwa6VNg7+IeEypPFHl01TgaWMoRutAd2YDF4c31Njfx+R5QuZWQlijet+xOB1oABHymLwGaun7ZF3JYBJaWkjsTLL8J6hfPho+4SCBTHNDM4UL/egoqx1D3VVTjzPTnTTIR6MR/m9yfA5cgN8RG7eyaLoEh8JLWwrg6qH/OklinQ5JP+fsIAtXGauj4gD8JwJjjvPrzHDEZYPKH4BJWJZY3Ga2c1vJKP0t5cu9cG4T/XvL6D/2Oac7IR/9n8ahG0Nd1jKHIrLJ6OVaGvyWkoaTfzL/w7ogBqd05yQipSKVfJ6zsmN7OT4XB5tFIix4TPimeH4f91BIM4f1F/8Vd6mhZtMdABfeUKCqZIOqxFrFD/fwmTDfMZ+WewGIcSxQ0vlZHlEZJUfu6drlBGJl2FuJhEzkd0L/+wTrkxkjw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/sshd_config
new file mode 100644
index 00000000..a792fc2e
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa256/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes rsa-sha2-256
+HostbasedAcceptedKeyTypes rsa-sha2-256
+HostKeyAlgorithms rsa-sha2-256
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/authorized_keys
new file mode 100644
index 00000000..802ef736
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/authorized_keys
@@ -0,0 +1,2 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCyEAy6D/jHzFdnm7Zq3WgomqoU3HbZbvA2zNCSr+qHVTeN80c7u+KEt9On9zlUjofqZFHhdvl6nlLlgHzbnwzQWb429RSLcRNkDsrUycy5E0uzmJwTERisVIaaE2iSEDpgnMgvScj/BlFbEB+/veVNpjrlbr46sAkbobUj3+p2RXRbanYiDFakUK2zZ/KbaAeXLqCOJ6NYE2JZSaWeEscE22kXVet/OvhRWh7SCLqdaN/b0ZOiHm8CmxEjkTHS4Jd2//a6TduV8xDh0BXMgjivMjNknTgHD+7n50ompIVKMvVwQlFhOsMmw40VC3crg/uW8YtsyoS4SNhU/bDXlb+X3aNgJoD6xtGMKRLlIm+v9bqC8fuAIYRQvcSbmdE4S7g4DEtdRyyuEqXvU4U8lv9LcuRvbbTZRIcrd2eXPGYFWz75ditvU3EhW/faRUURnPqsMwAlQUhd1bsCOqNIULBJQ8I9OVRs5o6UsHfLjfpB4y+1Jvm67lDBju5egtQGSt5Io4gpSI5GmNrKTv8sVBaFEOKDgBKfD5USamGqcO0bSwGi0QySK3pfIO0N6vBL45GyWtg6pQrePpwouQRuiGqa5Q7rwGAzcCg8Z2oDZTaLTtkwZ+4tPK4MqCcn9qnCU5ur2/IaV3h2acqw+jwxSilRTs8bbfDplnwp9ADFricvEw== inifc@The-toxic-avenger-II.local
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCeVpuoshw+u+jPPsKjAaE/fxP+Q8rV6TRQLO2iIFNGlDcDFbb/IiIVk9H4Xfqbqk9PzqZCCtwvTTbxKVagQFIr69yEIdaJ0OmSqycdYP4VXT2cYdR9aX0Z6/g7DBy818VBdYGlNGDVtXmtuus34oA9RZRMvBGe/FJb92g+cIT99QHOgxVs23zOHSosr+eogdXNXpWsSp2jstV8itnffDbrfKaYekcF1xLz7zLD2elIm71DlOrUEtWeRjsWTckLT6+pZg79jiE8HVF2YCYBRcnfeOsHsPFOew2C2nEQeS15rbRy7puo/PdQSa7Qz4V7ZnKT/LjfReAudxMGLlUCuKlC5GgboabveZZopNmxNWB++l+JRacAdHBaQk8ZF0XQ92rxAr6exmkbkgyAg+maJ5UCqh3asrshSB7NXVnPKTFm6qZCQpI54ZPlGXtnURLwLXNqRb/Gvlb41C68xr4QvmbACgdo7VD4zzK+ohz4WJyXM6pcBYWtwTFb0NHAUSneN9d029FP5/zgoLrWfvD+m3l9Ot+XyPniH/LL4BhWb3MAq4O9MzEKd9AUnsRH1n1NF94YwMnxqAMTnGFe8D0w1R5O4CCFhmEHybTabTyadKLyQViHUfH+Afun0mfqKJtVrqpOedYy21rEEiPRLQ3yUbiqQ/HfhPgoj0Jr3+uiOW40+w== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/rsa-512-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/rsa-512-key
new file mode 100644
index 00000000..f65c23ba
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/rsa-512-key
@@ -0,0 +1,49 @@
+-----BEGIN OPENSSH PRIVATE KEY-----
+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
+-----END OPENSSH PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/rsa-512-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/rsa-512-key.pub
new file mode 100644
index 00000000..8c88869b
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/rsa-512-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCeVpuoshw+u+jPPsKjAaE/fxP+Q8rV6TRQLO2iIFNGlDcDFbb/IiIVk9H4Xfqbqk9PzqZCCtwvTTbxKVagQFIr69yEIdaJ0OmSqycdYP4VXT2cYdR9aX0Z6/g7DBy818VBdYGlNGDVtXmtuus34oA9RZRMvBGe/FJb92g+cIT99QHOgxVs23zOHSosr+eogdXNXpWsSp2jstV8itnffDbrfKaYekcF1xLz7zLD2elIm71DlOrUEtWeRjsWTckLT6+pZg79jiE8HVF2YCYBRcnfeOsHsPFOew2C2nEQeS15rbRy7puo/PdQSa7Qz4V7ZnKT/LjfReAudxMGLlUCuKlC5GgboabveZZopNmxNWB++l+JRacAdHBaQk8ZF0XQ92rxAr6exmkbkgyAg+maJ5UCqh3asrshSB7NXVnPKTFm6qZCQpI54ZPlGXtnURLwLXNqRb/Gvlb41C68xr4QvmbACgdo7VD4zzK+ohz4WJyXM6pcBYWtwTFb0NHAUSneN9d029FP5/zgoLrWfvD+m3l9Ot+XyPniH/LL4BhWb3MAq4O9MzEKd9AUnsRH1n1NF94YwMnxqAMTnGFe8D0w1R5O4CCFhmEHybTabTyadKLyQViHUfH+Afun0mfqKJtVrqpOedYy21rEEiPRLQ3yUbiqQ/HfhPgoj0Jr3+uiOW40+w== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/sshd_config
new file mode 100644
index 00000000..e6efa866
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-rsa512/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes rsa-sha2-512
+HostbasedAcceptedKeyTypes rsa-sha2-512
+HostKeyAlgorithms rsa-sha2-512
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/Dockerfile
new file mode 100644
index 00000000..b321a4b9
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/Dockerfile
@@ -0,0 +1,42 @@
+FROM ubuntu:14.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/sshd_config
new file mode 100644
index 00000000..3bb2319e
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-14.04/ssh/sshd_config
@@ -0,0 +1,13 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/Dockerfile
new file mode 100644
index 00000000..0af98161
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/Dockerfile
@@ -0,0 +1,42 @@
+FROM ubuntu:16.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/sshd_config
new file mode 100644
index 00000000..c0abd87a
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-16.04/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes ssh-rsa
+HostbasedAcceptedKeyTypes ssh-rsa
+HostKeyAlgorithms ssh-rsa
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/Dockerfile
new file mode 100644
index 00000000..9260ed51
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/Dockerfile
@@ -0,0 +1,42 @@
+FROM ubuntu:18.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/sshd_config
new file mode 100644
index 00000000..c0abd87a
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-18.04/ssh/sshd_config
@@ -0,0 +1,16 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+PubkeyAcceptedKeyTypes ssh-rsa
+HostbasedAcceptedKeyTypes ssh-rsa
+HostKeyAlgorithms ssh-rsa
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/Dockerfile b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/Dockerfile
new file mode 100644
index 00000000..7812a059
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/Dockerfile
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+USER root
+
+ENV TZ=Etc/UTC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update -y -qq \
+ && apt-get install -y -qq \
+ --no-install-recommends \
+ openssh-server \
+ software-properties-common \
+ git \
+ make
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+ && apt-get update -y -qq \
+ && apt-get install -y -qq \
+ openjdk-11-jdk \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN useradd --password password --shell /bin/bash --uid 1000 jenkins \
+ && mkdir /home/jenkins \
+ && chown -R jenkins:jenkins /home/jenkins
+
+COPY ssh /home/jenkins/.ssh
+RUN chown -R jenkins:jenkins /home/jenkins/ \
+ && chmod 700 /home/jenkins/.ssh \
+ && chmod 600 /home/jenkins/.ssh/*
+COPY ssh /root/.ssh
+RUN chown -R root:root /root/ \
+ && chmod 700 /root/.ssh \
+ && chmod 600 /root/.ssh/*
+RUN ssh-keygen -A
+COPY ssh/sshd_config /etc/ssh/sshd_config
+
+RUN mkdir -p /var/run/sshd
+
+RUN echo "password\npassword" | passwd root \
+ && echo "password\npassword" | passwd jenkins
+
+EXPOSE 22
+ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/jre/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin
+RUN echo "PATH=${PATH}" >> /etc/environment
+ENTRYPOINT []
+CMD [ "/bin/sh", "-c", "/usr/sbin/sshd -e -D -p 22"]
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/authorized_keys b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/authorized_keys
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/rsa-key b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/rsa-key
new file mode 100644
index 00000000..afe5dc41
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/rsa-key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/rsa-key.pub b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/rsa-key.pub
new file mode 100644
index 00000000..a5a1fbfa
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/rsa-key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPFhRz6+cukr0bcVLvzQI4ATQhuU1n5/34lGhrxF1v5SDSbGPRj65TAKMJCPjZBj+ydQi5t9xUk2RLfWXNiY3BqOcSNzXEfGk9Ubwm0wf0agXFwydWgmRPimRF6IYWPDUn35ustI5oE1YYS3Uc03nndOL/iqnoDd3TQAjX6CFjc8hg5oiMMZ6sSlmyKulJch+4RS3IfwNxXXzklivQ5UPL6QyT1hgl5/cpnVhu2ymtYEdH/sodw3YpxtD0CRlFTVdvxvuba0Z17T6AheINgXiRoShy9zFMcCjOU+Cbe57n77hLmroKKfMRVeVa7R1ceKXUq8tmN2rqobjpfALHWT34bdEBJoXGTO4wCrFlOzY2Nz4ePg1dv6Cojpo1IB9XM9hMubx1Qa9JrnL+Uc8qQmVChfs5Mv+xzQ4Q3h/BtjxDdNKvTYA3A6x53cirM2Pw+m5XYYEbB7c0bXvHcKW9cewI61PtRRXOz6w7LPvon+4+V/dGIawX1Ji8by6Lib13JEYveEHzu9GZSv20tEiT2vpPn59vXsGcxstOXAupCC1Gc5IMhIfXJTemcS+ZugOHJisZzvwwcKgwK4cXs9sWkaIL+sp2K6smKC+SzKXFQTGtOGYhEdn68ImNVN2El0nvphvl/fmVj9m2zwqKXT5M9dVYOs0jRwq/Vbh04JOD6lpLAw== inifc@warhead
diff --git a/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/sshd_config b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/sshd_config
new file mode 100644
index 00000000..3b4fc7e7
--- /dev/null
+++ b/src/test/resources/hudson/plugins/sshslaves/agents/ssh-agent-ubuntu-20.04/ssh/sshd_config
@@ -0,0 +1,17 @@
+ChallengeResponseAuthentication no
+LogLevel DEBUG1
+UsePAM yes
+X11Forwarding yes
+PrintMotd yes
+AcceptEnv LANG LC_*
+PermitRootLogin no
+PasswordAuthentication yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes
+ClientAliveInterval 600
+ClientAliveCountMax 4
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+#PubkeyAcceptedKeyTypes ssh-rsa
+#HostbasedAcceptedKeyTypes ssh-rsa
+#HostKeyAlgorithms ssh-rsa