You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by co...@apache.org on 2019/07/04 10:18:15 UTC
[camel] branch camel-2.x updated: Remove custom Identity classes
for RSA/DSA signing from camel-ftp + improve security testing in general
This is an automated email from the ASF dual-hosted git repository.
coheigea pushed a commit to branch camel-2.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-2.x by this push:
new 57b446f Remove custom Identity classes for RSA/DSA signing from camel-ftp + improve security testing in general
57b446f is described below
commit 57b446faa6ac740a4a6b41c98f3d759dfcd46de3
Author: Colm O hEigeartaigh <co...@apache.org>
AuthorDate: Thu Jul 4 10:33:11 2019 +0100
Remove custom Identity classes for RSA/DSA signing from camel-ftp + improve security testing in general
---
.../component/file/remote/DSAKeyPairIdentity.java | 227 ---------------------
.../component/file/remote/RSAKeyPairIdentity.java | 145 -------------
.../component/file/remote/SftpOperations.java | 24 +--
...sumeTest.java => SftpECKeyFileConsumeTest.java} | 16 +-
.../file/remote/sftp/SftpKeyFileConsumeTest.java | 8 +
.../remote/sftp/SftpKeyPairDSAConsumeTest.java | 29 ++-
.../remote/sftp/SftpKeyPairRSAConsumeTest.java | 29 ++-
.../file/remote/sftp/SftpServerTestSupport.java | 7 +-
components/camel-ftp/src/test/resources/ec.pem | 7 +
9 files changed, 84 insertions(+), 408 deletions(-)
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/DSAKeyPairIdentity.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/DSAKeyPairIdentity.java
deleted file mode 100644
index 82f7312..0000000
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/DSAKeyPairIdentity.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.file.remote;
-
-import java.nio.ByteBuffer;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.interfaces.DSAParams;
-import java.security.interfaces.DSAPublicKey;
-
-import com.jcraft.jsch.Identity;
-import com.jcraft.jsch.JSchException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DSAKeyPairIdentity implements Identity {
- private static final String ALGORITHM_TYPE = "ssh-dss";
- private final Logger log = LoggerFactory.getLogger(getClass());
- private KeyPair keyPair;
- private String name;
-
- public DSAKeyPairIdentity(String name, KeyPair keyPair) {
- this.name = name;
- this.keyPair = keyPair;
- }
-
- @Override
- public boolean setPassphrase(byte[] passphrase) throws JSchException {
- return true;
- }
-
- @Override
- public byte[] getPublicKeyBlob() {
- DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic();
- byte[] sshDss = ALGORITHM_TYPE.getBytes();
-
- DSAParams dsaParams = publicKey.getParams();
- byte[] pArray = dsaParams.getP().toByteArray();
- byte[] qArray = dsaParams.getQ().toByteArray();
- byte[] gArray = dsaParams.getG().toByteArray();
- byte[] yArray = publicKey.getY().toByteArray();
-
- byte[] result = new byte[sshDss.length + 4 + pArray.length + 4 + qArray.length + 4 + gArray.length + 4 + yArray.length + 4];
- int index = 0;
-
- byte[] intAsByteArray = ByteBuffer.allocate(4).putInt(sshDss.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(sshDss, 0, result, index, sshDss.length);
- index += sshDss.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(pArray.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(pArray, 0, result, index, pArray.length);
- index += pArray.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(qArray.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(qArray, 0, result, index, qArray.length);
- index += qArray.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(gArray.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(gArray, 0, result, index, gArray.length);
- index += gArray.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(yArray.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(yArray, 0, result, index, yArray.length);
-
- return result;
- }
-
- @Override
- public byte[] getSignature(byte[] data) {
- try {
- PrivateKey prvKey = keyPair.getPrivate();
- Signature sig;
- sig = Signature.getInstance("SHA1withDSA");
- sig.initSign(prvKey);
- sig.update(data);
- byte[] sshDss = ALGORITHM_TYPE.getBytes();
- byte[] signature = sig.sign();
-
- signature = convertDERToP1363(signature);
-
- byte[] result = new byte[sshDss.length + 4 + signature.length + 4];
- int index = 0;
-
- byte[] intAsByteArray = ByteBuffer.allocate(4).putInt(sshDss.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(sshDss, 0, result, index, sshDss.length);
- index += sshDss.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(signature.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(signature, 0, result, index, signature.length);
-
- return result;
- } catch (NoSuchAlgorithmException e) {
- log.error("Cannot sign", e);
- } catch (InvalidKeyException e) {
- log.error("Cannot sign", e);
- } catch (SignatureException e) {
- log.error("Cannot sign", e);
- }
- return null;
- }
-
- /**
- * "The signature on m is (r, s). Message m and (r, s) should be sent to the
- * verifier. We need to observe that both r and s are 20 bytes, since a
- * modular reduction is being performed (steps 2 and 5) using q, a 160 bit
- * value. This will gain significance later when we begin verifying messages
- * between Crypto++ and C# (which use the IEEE P1363 signature format) and
- * Java (which uses a DER encoding of a signature)." [taken from <a href=
- * "http://www.codeproject.com/Articles/25590/Cryptographic-Interoperability-Digital-Signatures"
- * >Cryptographic Interoperability Digital Signatures</a>]
- *
- * @param sig
- * signature in DER format
- * @return signature in P1363 format; SEQUENCE ::= { r INTEGER, s INTEGER }
- */
- private byte[] convertDERToP1363(byte[] sig) {
- int index = 3;
- int len = sig[index++] & 0xff;
-
- byte[] r = new byte[len];
- System.arraycopy(sig, index, r, 0, r.length);
- index = index + len + 1;
-
- len = sig[index++] & 0xff;
- byte[] s = new byte[len];
- System.arraycopy(sig, index, s, 0, s.length);
-
- byte[] p1363Signature = new byte[40];
- if (r.length > 21 || (r.length == 21 && r[0] != 0)) {
- // Reject - signature verification failed
- } else if (r.length == 21) {
- // r[0] = 0
- // r[1]'s high bit *should* be set
- System.arraycopy(r, 1, p1363Signature, 0, 20);
- } else if (r.length == 20) {
- // r[0]'s high bit *should not* be set
- System.arraycopy(r, 0, p1363Signature, 0, 20);
- } else {
- // fewer than 20 bytes
- len = r.length;
- int off = 20 - len;
- System.arraycopy(r, 0, p1363Signature, off, len);
- }
-
- if (s.length > 21 || (s.length == 21 && s[0] != 0)) {
- // Reject - signature verification failed
- p1363Signature = new byte[0];
- } else if (s.length == 21) {
- // s[0] = 0
- // s[1]'s high bit *should* be set
- System.arraycopy(s, 1, p1363Signature, 20, 20);
- } else if (s.length == 20) {
- // s[0]'s high bit *should not* be set
- System.arraycopy(s, 0, p1363Signature, 20, 20);
- } else {
- // fewer than 20 bytes
- len = s.length;
- int off = 40 - len;
- System.arraycopy(s, 0, p1363Signature, off, len);
- }
-
- return p1363Signature;
- }
-
- @Override
- public boolean decrypt() {
- return true;
- }
-
- @Override
- public String getAlgName() {
- return ALGORITHM_TYPE;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public boolean isEncrypted() {
- return false;
- }
-
- @Override
- public void clear() {
- }
-}
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RSAKeyPairIdentity.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RSAKeyPairIdentity.java
deleted file mode 100644
index 25b1fd6..0000000
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RSAKeyPairIdentity.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.file.remote;
-
-import java.nio.ByteBuffer;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.interfaces.RSAPublicKey;
-
-import com.jcraft.jsch.Identity;
-import com.jcraft.jsch.JSchException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-
-public class RSAKeyPairIdentity implements Identity {
- private static final String ALGORITHM_TYPE = "ssh-rsa";
- private final Logger log = LoggerFactory.getLogger(getClass());
-
- private KeyPair keyPair;
- private String name;
-
- public RSAKeyPairIdentity(String name, KeyPair keyPair) {
- this.name = name;
- this.keyPair = keyPair;
- }
-
- @Override
- public boolean setPassphrase(byte[] passphrase) throws JSchException {
- return true;
- }
-
- @Override
- public byte[] getPublicKeyBlob() {
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- byte[] sshRsa = ALGORITHM_TYPE.getBytes();
- byte[] eArray = publicKey.getPublicExponent().toByteArray();
- byte[] nArray = publicKey.getModulus().toByteArray();
-
- byte[] result = new byte[sshRsa.length + 4 + eArray.length + 4 + nArray.length + 4];
- int index = 0;
-
- byte[] intAsByteArray = ByteBuffer.allocate(4).putInt(sshRsa.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(sshRsa, 0, result, index, sshRsa.length);
- index += sshRsa.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(eArray.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(eArray, 0, result, index, eArray.length);
- index += eArray.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(nArray.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(nArray, 0, result, index, nArray.length);
-
- return result;
- }
-
- @Override
- public byte[] getSignature(byte[] data) {
- PrivateKey prvKey = keyPair.getPrivate();
- Signature sig;
- try {
- sig = Signature.getInstance("SHA1withRSA");
- sig.initSign(prvKey);
- sig.update(data);
- byte[] sshRsa = ALGORITHM_TYPE.getBytes();
- byte[] signature = sig.sign();
- byte[] result = new byte[sshRsa.length + 4 + signature.length + 4];
- int index = 0;
-
- byte[] intAsByteArray = ByteBuffer.allocate(4).putInt(sshRsa.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(sshRsa, 0, result, index, sshRsa.length);
- index += sshRsa.length;
-
- intAsByteArray = ByteBuffer.allocate(4).putInt(signature.length).array();
- System.arraycopy(intAsByteArray, 0, result, index, 4);
- index += 4;
-
- System.arraycopy(signature, 0, result, index, signature.length);
-
- return result;
- } catch (NoSuchAlgorithmException e) {
- log.error("Cannot sign", e);
- } catch (InvalidKeyException e) {
- log.error("Cannot sign", e);
- } catch (SignatureException e) {
- log.error("Cannot sign", e);
- }
- return null;
- }
-
- @Override
- public boolean decrypt() {
- return true;
- }
-
- @Override
- public String getAlgName() {
- return ALGORITHM_TYPE;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public boolean isEncrypted() {
- return false;
- }
-
- @Override
- public void clear() {
- }
-}
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
index ecdc583..3974aff 100644
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
+++ b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
@@ -27,12 +27,10 @@ import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
+import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
-import java.security.interfaces.DSAPrivateKey;
-import java.security.interfaces.DSAPublicKey;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
import java.util.ArrayList;
+import java.util.Base64;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
@@ -249,16 +247,16 @@ public class SftpOperations implements RemoteFileOperations<SftpRemoteFile> {
if (sftpConfig.getKeyPair() != null) {
LOG.debug("Using private key information from key pair");
KeyPair keyPair = sftpConfig.getKeyPair();
- if (keyPair.getPrivate() != null && keyPair.getPublic() != null) {
- if (keyPair.getPrivate() instanceof RSAPrivateKey && keyPair.getPublic() instanceof RSAPublicKey) {
- jsch.addIdentity(new RSAKeyPairIdentity("ID", keyPair), null);
- } else if (keyPair.getPrivate() instanceof DSAPrivateKey && keyPair.getPublic() instanceof DSAPublicKey) {
- jsch.addIdentity(new DSAKeyPairIdentity("ID", keyPair), null);
- } else {
- LOG.warn("Only RSA and DSA key pairs are supported");
- }
+ if (keyPair.getPrivate() != null) {
+ // Encode the private key in PEM format for JSCH
+ StringBuilder sb = new StringBuilder(256);
+ sb.append("-----BEGIN PRIVATE KEY-----").append("\n");
+ sb.append(Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded())).append("\n");
+ sb.append("-----END PRIVATE KEY-----").append("\n");
+
+ jsch.addIdentity("ID", sb.toString().getBytes(StandardCharsets.UTF_8), null, null);
} else {
- LOG.warn("PrivateKey and PublicKey in the KeyPair must be filled");
+ LOG.warn("PrivateKey in the KeyPair must be filled");
}
}
diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyFileConsumeTest.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpECKeyFileConsumeTest.java
similarity index 80%
copy from components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyFileConsumeTest.java
copy to components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpECKeyFileConsumeTest.java
index eeaff7c..cb4ab0c 100644
--- a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyFileConsumeTest.java
+++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpECKeyFileConsumeTest.java
@@ -1,4 +1,4 @@
-/**
+/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
@@ -16,12 +16,15 @@
*/
package org.apache.camel.component.file.remote.sftp;
+import java.security.interfaces.ECPublicKey;
+
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
import org.junit.Test;
-public class SftpKeyFileConsumeTest extends SftpServerTestSupport {
+public class SftpECKeyFileConsumeTest extends SftpServerTestSupport {
@Test
public void testSftpSimpleConsume() throws Exception {
@@ -39,18 +42,23 @@ public class SftpKeyFileConsumeTest extends SftpServerTestSupport {
mock.expectedHeaderReceived(Exchange.FILE_NAME, "hello.txt");
mock.expectedBodiesReceived(expected);
- context.startRoute("foo");
+ context.getRouteController().startRoute("foo");
assertMockEndpointsSatisfied();
}
@Override
+ protected PublickeyAuthenticator getPublickeyAuthenticator() {
+ return (username, key, session) -> key instanceof ECPublicKey;
+ }
+
+ @Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("sftp://localhost:" + getPort() + "/" + FTP_ROOT_DIR
- + "?username=admin&knownHostsFile=./src/test/resources/known_hosts&privateKeyFile=./src/test/resources/id_rsa&privateKeyPassphrase=secret&delay=10s&disconnect=true")
+ + "?username=admin&knownHostsFile=./src/test/resources/known_hosts&privateKeyFile=./src/test/resources/ec.pem&delay=10s&disconnect=true")
.routeId("foo").noAutoStartup()
.to("mock:result");
}
diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyFileConsumeTest.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyFileConsumeTest.java
index eeaff7c..3e8e63b 100644
--- a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyFileConsumeTest.java
+++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyFileConsumeTest.java
@@ -16,9 +16,12 @@
*/
package org.apache.camel.component.file.remote.sftp;
+import java.security.interfaces.RSAPublicKey;
+
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
import org.junit.Test;
public class SftpKeyFileConsumeTest extends SftpServerTestSupport {
@@ -45,6 +48,11 @@ public class SftpKeyFileConsumeTest extends SftpServerTestSupport {
}
@Override
+ protected PublickeyAuthenticator getPublickeyAuthenticator() {
+ return (username, key, session) -> key instanceof RSAPublicKey;
+ }
+
+ @Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairDSAConsumeTest.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairDSAConsumeTest.java
index 860a935..5686374 100644
--- a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairDSAConsumeTest.java
+++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairDSAConsumeTest.java
@@ -29,10 +29,21 @@ import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.util.IOHelper;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
+import org.junit.BeforeClass;
import org.junit.Test;
public class SftpKeyPairDSAConsumeTest extends SftpServerTestSupport {
+ private static KeyPair keyPair;
+
+ @BeforeClass
+ public static void createKeys() throws Exception {
+ KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
+ keyGen.initialize(1024);
+ keyPair = keyGen.generateKeyPair();
+ }
+
@Test
public void testSftpSimpleConsume() throws Exception {
if (!canTest()) {
@@ -63,16 +74,16 @@ public class SftpKeyPairDSAConsumeTest extends SftpServerTestSupport {
}
@Override
- protected JndiRegistry createRegistry() throws Exception {
- JndiRegistry registry = super.createRegistry();
-
- KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
- keyGen.initialize(1024);
- KeyPair pair = keyGen.generateKeyPair();
- registry.bind("keyPair", pair);
- registry.bind("knownHosts", getBytesFromFile("./src/test/resources/known_hosts"));
+ protected PublickeyAuthenticator getPublickeyAuthenticator() {
+ return (username, key, session) -> key.equals(keyPair.getPublic());
+ }
- return registry;
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("keyPair", keyPair);
+ jndi.bind("knownHosts", getBytesFromFile("./src/test/resources/known_hosts"));
+ return jndi;
}
@Override
diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairRSAConsumeTest.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairRSAConsumeTest.java
index 4ecd089..92a69f0 100644
--- a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairRSAConsumeTest.java
+++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpKeyPairRSAConsumeTest.java
@@ -29,10 +29,21 @@ import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.util.IOHelper;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
+import org.junit.BeforeClass;
import org.junit.Test;
public class SftpKeyPairRSAConsumeTest extends SftpServerTestSupport {
+ private static KeyPair keyPair;
+
+ @BeforeClass
+ public static void createKeys() throws Exception {
+ KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
+ keyGen.initialize(2048);
+ keyPair = keyGen.generateKeyPair();
+ }
+
@Test
public void testSftpSimpleConsume() throws Exception {
if (!canTest()) {
@@ -63,16 +74,16 @@ public class SftpKeyPairRSAConsumeTest extends SftpServerTestSupport {
}
@Override
- protected JndiRegistry createRegistry() throws Exception {
- JndiRegistry registry = super.createRegistry();
-
- KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
- keyGen.initialize(2048);
- KeyPair pair = keyGen.generateKeyPair();
- registry.bind("keyPair", pair);
- registry.bind("knownHosts", getBytesFromFile("./src/test/resources/known_hosts"));
+ protected PublickeyAuthenticator getPublickeyAuthenticator() {
+ return (username, key, session) -> key.equals(keyPair.getPublic());
+ }
- return registry;
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("keyPair", keyPair);
+ jndi.bind("knownHosts", getBytesFromFile("./src/test/resources/known_hosts"));
+ return jndi;
}
@Override
diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java
index 51380bf..0e50218 100644
--- a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java
+++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/SftpServerTestSupport.java
@@ -31,6 +31,7 @@ import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory;
import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
import org.apache.sshd.common.session.helpers.AbstractSession;
import org.apache.sshd.server.SshServer;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
import org.apache.sshd.server.scp.ScpCommandFactory;
import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory;
import org.junit.After;
@@ -78,7 +79,7 @@ public class SftpServerTestSupport extends BaseServerTestSupport {
sshd.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory()));
sshd.setCommandFactory(new ScpCommandFactory());
sshd.setPasswordAuthenticator((username, password, session) -> true);
- sshd.setPublickeyAuthenticator((username, password, session) -> true);
+ sshd.setPublickeyAuthenticator(getPublickeyAuthenticator());
if (rootDirMode) {
sshd.setFileSystemFactory(new VirtualFileSystemFactory(FileSystems.getDefault().getPath(System.getProperty("user.dir") + "/target/res")));
}
@@ -99,6 +100,10 @@ public class SftpServerTestSupport extends BaseServerTestSupport {
}
}
+ protected PublickeyAuthenticator getPublickeyAuthenticator() {
+ return (username, key, session) -> true;
+ }
+
@Override
@After
public void tearDown() throws Exception {
diff --git a/components/camel-ftp/src/test/resources/ec.pem b/components/camel-ftp/src/test/resources/ec.pem
new file mode 100644
index 0000000..5cfea18
--- /dev/null
+++ b/components/camel-ftp/src/test/resources/ec.pem
@@ -0,0 +1,7 @@
+-----BEGIN EC PRIVATE KEY-----
+MIHcAgEBBEIB5Twq2mxiOAieZslZlOkOG1Pi4PEmAWJ78+bRLAV7Q4F5Nd4u0bAd
+zGIEMFARoeVb/2C8ZFjNhL8xgOUPWJqY316gBwYFK4EEACOhgYkDgYYABADMulfT
+EOAzU9gsMEfrOuTJj9J8c4SNaAeeUb6uDHYfKPnYvfMJrBcGlnRePjJjeWpGHOyk
+qB8NYpCFk/TPgYFGpQGpz51EZngsQwpEEQXw/jzBHZsVOdrTADYu09Cy/AMLu3wA
+naQ5rWm41G3eC8mfZ1Q0BQ7Fc0K103mxlayEM605jw==
+-----END EC PRIVATE KEY-----