我正在尝试连接到SSL服务器,这需要我对自己进行身份验证.为了在Apache MINA上使用SSL,我需要一个合适的JKS文件.但是,我只获得了一个.PEM文件.
我如何从PEM文件创建JKS文件?
我的客户端 - 服务器应用程序在客户端和服务器端都与Apache MINA一起使用.通过UDP发送数据工作正常,但在一分钟服务器关闭连接(或MINA的方式 - "会话")后停止应答.
奇怪的是,连接始终处于活动状态.客户端每1000ms发送一次数据,服务器使用相同的数据回复它.我发现了一个MINA的机制来销毁非活动会话ExpiringMap,它有一个会话的生存时间的默认值,public static final int DEFAULT_TIME_TO_LIVE = 60;但我还没有找到一种方法如何更改它或更好,更新会话的生存时间.
Imho生存时间应该自动更新每个传入的数据包,但我找不到为什么不是我的服务器做的事情.我是否应该明确表示我不希望它破坏会话或什么?
我的代码与MINA的教程非常相似:
服务器
IoAcceptor acceptor = new NioDatagramAcceptor();
try {
acceptor.setHandler( new UDPHandler() );
acceptor.bind( new InetSocketAddress(RelayConfig.getInstance().getUdpPort()) );
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, IDLE_PERIOD );
System.out.println("RELAY ["+RelayConfig.getInstance().getId()+"]: initialized!");
} catch (IOException e) {
System.out.println("RELAY ["+RelayConfig.getInstance().getId()+"]: failed: "+e.getLocalizedMessage());
//e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
客户
NioDatagramConnector connector = new NioDatagramConnector();
connector.getSessionConfig().setUseReadOperation(true);
handler = new UDPHandler();
connector.setHandler(handler);
connector.getSessionConfig().setReadBufferSize(2048);
// try to connect to server!
try {
System.out.println("Connecting to " …Run Code Online (Sandbox Code Playgroud) 我目前正在构建一个小型的Apache-Mina Server应用程序.我正在使用Maven来构建它.当我尝试运行jar时,我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/mina/filter/codec/ProtocolCodecFactory
Caused by: java.lang.ClassNotFoundException: org.apache.mina.filter.codec.Protoc olCodecFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: de.fr1zle.gpsserver.GpsServer. Program will exit.
Run Code Online (Sandbox Code Playgroud)
在日食中运行不是问题.
这就是生成的MANIFEST的样子:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: fr1zle
Build-Jdk: 1.6.0_23
Main-Class: de.fr1zle.gpsserver.GpsServer
Class-Path: commons-lang-2.1.jar plexus-utils-1.1.jar junit-4.8.2.jar
log4j-1.2.14.jar slf4j-jdk14-1.5.11.jar slf4j-api-1.5.11.jar antlr-2.
7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate-commons
-annotations-3.2.0.Final.jar hibernate-jpa-2.0-api-1.0.0.Final.jar jt
a-1.1.jar hibernate-annotations-3.5.6-Final.jar hibernate-core-3.5.6-
Final.jar mysql-connector-java-5.1.15.jar mina-core-2.0.3.jar
Run Code Online (Sandbox Code Playgroud)
这是我的pom.xml(的一部分):
<groupId>de.fr1zle.gpsserver</groupId>
<artifactId>GPSServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>GPSServer</name>
<packaging>jar</packaging>
<description>Tracks …Run Code Online (Sandbox Code Playgroud) 我正在尝试验证客户端从其私钥生成的签名并发送到服务器.
我能在图书馆找到唯一合适的认证者就是PublickeyAuthenticator.如果这是错误的类,请纠正我.
我目前有:
this.sshServer.setPublickeyAuthenticator(new PublickeyAuthenticator() {
@Override
public boolean authenticate(String username, PublicKey key, ServerSession session) {
if (username.equals("client")) {
//if signature == valid??
return true;
}
}
});
Run Code Online (Sandbox Code Playgroud)
有谁知道mina是否支持签名验证,如果支持,如何实施?
我的理解是,我首先必须将用户公钥分配/添加到服务器.如果客户端提供了id_rsa.pub文件,我该如何将此文件作为公钥添加到服务器?
我正在使用此示例,取自Java SFTP Server Library?:
public void setupSftpServer(){
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPort(22);
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));
List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
userAuthFactories.add(new UserAuthNone.Factory());
sshd.setUserAuthFactories(userAuthFactories);
sshd.setCommandFactory(new ScpCommandFactory());
List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>();
namedFactoryList.add(new SftpSubsystem.Factory());
sshd.setSubsystemFactories(namedFactoryList);
try {
sshd.start();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
但我需要为SFTP服务器设置用户登录和pw.我怎样才能做到这一点?谢谢
我使用Apache Mina Sshd API在java中启动本地SFTP服务器.在SFTP客户端我使用Jcraft jsch API创建我的SFTP 客户端.我成功启动了服务器.问题是我想写一些单元测试用例到检查客户端是否可以将某些文件放入服务器的根目录.目前我的SFTP服务器没有任何根目录.所以我想知道是否有任何方法来设置服务器的根目录.
例如:C:\ sftp 如何将此路径设置为我的服务器根目录.然后,客户端每次与服务器连接时都可以读取和写入文件.谢谢.
public class SftpServerStarter {
private SshServer sshd;
private final static Logger logger = LoggerFactory.getLogger(SftpServerStarter.class);
public void start(){
sshd = SshServer.setUpDefaultServer();
sshd.setPort(22);
sshd.setHost("localhost");
sshd.setPasswordAuthenticator(new MyPasswordAuthenticator());
sshd.setPublickeyAuthenticator(new MyPublickeyAuthenticator());
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
sshd.setSubsystemFactories(Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
sshd.setCommandFactory(new ScpCommandFactory());
try {
logger.info("Starting ...");
sshd.start();
logger.info("Started");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.info("Can not Start Server");
}
}
}Run Code Online (Sandbox Code Playgroud)
我写了一个简单的测试项目,它打开端口9123一段时间后退出:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Date;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class TimeServer
{
private static final int PORT = 9123;
public static void main( String[] args ) throws IOException
{
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
acceptor.setHandler( new TimeServerHandler() );
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); …Run Code Online (Sandbox Code Playgroud) 我正在尝试连接到需要私钥身份验证并希望使用 Mina 的 SFTP 服务器。查看文档,我可以看到如何使用密码身份验证而不是私钥身份验证来执行身份验证。我没有看到任何示例代码来演示如何使用 mina 执行私钥身份验证。
目前该库是否可行,如果可以,您能否提供有关如何加载密钥并执行连接的示例代码?
这是我想要使用 SSHTools 执行的操作的示例,以供参考。
private static void authenticate(Ssh2Client ssh2, String host, Integer port, String username, InputStream privateKey) {
Ssh2PublicKeyAuthentication auth = createKeyAuthentication(privateKey);
try {
int result = ssh2.authenticate(auth);
if (result != SshAuthentication.COMPLETE) {
throw new AuthenticationIncomplete(host, port, username, result);
}
} catch (SshException ex) {
throw new UnableToAuthenticate(host, port, username, ex);
}
}
private static Ssh2PublicKeyAuthentication createKeyAuthentication(InputStream privateKey) {
try {
SshPrivateKeyFile privateKeyFile = SshPrivateKeyFileFactory.parse(StreamUtil.readIntoByteArray(privateKey));
SshKeyPair keyPair = privateKeyFile.toKeyPair("");
Ssh2PublicKeyAuthentication auth = new …Run Code Online (Sandbox Code Playgroud) 谁能告诉我如何从连接的客户端获取IP地址?
到目前为止我发现了
session.getRemoteAddress().toString()
Run Code Online (Sandbox Code Playgroud)
并返回类似的东西
/192.168.1.100:49879
这个可以吗?我可以做一些只能返回192.168.1.100的东西吗?
当我使用套接字时,我使用的是:
socket.getInetAddress().getHostAddress();
Run Code Online (Sandbox Code Playgroud)
在apache mina中使用IoSession有类似的东西吗?