Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中编写tcp代理(用于http、smtp或类似服务)可以在非ssl的情况下工作,但不会';不工作ssl_Java_Ssl_Proxy - Fatal编程技术网

在java中编写tcp代理(用于http、smtp或类似服务)可以在非ssl的情况下工作,但不会';不工作ssl

在java中编写tcp代理(用于http、smtp或类似服务)可以在非ssl的情况下工作,但不会';不工作ssl,java,ssl,proxy,Java,Ssl,Proxy,我正在尝试使用java为http和smtp等简单服务编写代理。 到目前为止,我得到了这个: 主类{ public static final int listenPort=465,//要侦听的端口 remotePort=465;//要连接的端口 公共静态最终字符串remoteH=”“;//此处为我的邮件服务器主机名 公共静态void main(字符串[]args){ ExecutorService tm=Executors.newCachedThreadPool(); 试一试{ ServerSoc

我正在尝试使用java为http和smtp等简单服务编写代理。 到目前为止,我得到了这个:

主类{
public static final int listenPort=465,//要侦听的端口
remotePort=465;//要连接的端口
公共静态最终字符串remoteH=”“;//此处为我的邮件服务器主机名
公共静态void main(字符串[]args){
ExecutorService tm=Executors.newCachedThreadPool();
试一试{
ServerSocket ss=新的ServerSocket(listenPort);
while(true){
试一试{
socketclient=ss.accept();
tm.提交(新代理员工(客户));
}捕获(例外e){
系统输出打印项次(“错误”+e);
}
}
}捕获(例外e){
系统输出打印项次(“错误”+e);
}
}
}
类ProxyWorker实现可运行{
Socket客户端、服务器;
OutputStream serverOut=null,clientOut=null;
InputStream serverIn=null,clientIn=null;
私有静态SSLSocketFactory SSLSocketFactory;
/**
*返回接受所有服务器证书的SSL工厂实例。
*短袜=
*(SSLSocket)getSocketFactory.createSocket(主机,443);
*@返回特定于SSL的套接字工厂。
**/
公共静态最终SSLSocketFactory getSocketFactory(){
如果(sslSocketFactory==null){
试一试{
TrustManager[]tm=new-TrustManager[]{new-TrustManager()};
SSLContext context=SSLContext.getInstance(“SSL”);
init(newkeymanager[0],tm,newsecurerandom());
sslSocketFactory=(sslSocketFactory)context.getSocketFactory();
}捕获(密钥管理异常e){
System.err.println(“不支持SSL算法:”+e.getMessage());
}捕获(无算法异常){
System.err.println(“设置初始密钥管理时出现异常”);
}
}
返回sslSocketFactory;
}
ProxyWorker(套接字c){
客户=c;
试一试{
试一试{
server=(SSLSocket)getSocketFactory().createSocket(Main.remoteH,Main.remotePort);
((SSLSocket)服务器);
serverOut=server.getOutputStream();
serverIn=server.getInputStream();
}捕获(例外e){
System.err.println(“SSL失败!\n”+e.toString());
服务器=新套接字(Main.remoteH,Main.remotePort);
serverOut=server.getOutputStream();
serverIn=server.getInputStream();
}
clientOut=client.getOutputStream();
clientIn=client.getInputStream();
}捕获(例外e){
System.out.println(“错误\n”+e.toString());
系统出口(0);
}
}
公开募捐{
System.out.println(“监听跑步者激活”);
试一试{
字节[]b=新字节[0];
BufferedOutputStream bos=新的BufferedOutputStream(System.out);
while(true){
int clientrady=clientIn.available();
而(clientrady>0){
b=新字节[clientrady];
clientIn.read(b,0,clientrady);
serverOut.write(b);
书面报告(b);
bos.flush();
clientrady=clientIn.available();
}
睡眠(100);
int serverReady=serverIn.available();
而(服务器就绪>0){
b=新字节[serverReady];
读取(b,0,serverReady);
clientOut.write(b);
书面报告(b);
bos.flush();
serverReady=serverIn.available();
}
if(server.isClosed()| | client.isClosed()){
打破
}
}
}捕获(NullPointerException e){
System.err.println(“NPE:\n”+e.getMessage());
System.err.println(例如toString());
e、 printStackTrace();
}捕获(例外e){
系统输出打印ln(e);
}最后{
试一试{
server.close();
client.close();
}捕获(IOEX异常){
System.out.println(“无法关闭套接字”);
}
}
System.out.println(“线程正在退出”);
}
}
n、 b.naive trust manager接受所有证书,因为我的邮件服务器使用的是自签名证书,这仅用于个人/我自己的教育用途,所以我根本不担心安全问题

它似乎对非ssl连接有效~ ok-我已经测试了esmtp,它可以创建连接并交换问候语和其他内容,但我的服务器不支持通过非ssl连接进行身份验证,因此我无法测试任何消息的发送

我还测试了非ssl http连接-它可以处理ok-尽管我认为线程不太喜欢处理图像,因为只有一些images可以通过

我怀疑我在那里做了一些不太好的代码,但目前我正试图让它在ssl上工作,以便我能够理解它

在ssl模式下使用它时,我已经计算出ProxyWorker线程会进入while true循环,但会继续循环。因此,对于esmtp,当它等待问候语时,我根本没有得到任何输出,当使用http时,我看到来自firefox的get请求,但同样没有来自服务器的任何内容


任何我认为错误/推荐阅读的指针/事物都会被赏识

< p>如果你写的是完全透明的代理,你根本不需要考虑SSL。正义公司