文档章节

JAVA 调用SSH单向认证服务

 黑暗浪子
发布于 2017/03/13 12:10
字数 451
阅读 185
收藏 0

最近项目上需要使用java调用一个https的服务(单向认证),但是在使用过程中遇到一些问题,在此记录!

测试代码如下:


import java.io.InputStream;
import java.net.URL;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class OneWayAccessWithHttps {
	
	public static class TrustAnyVerifier implements HostnameVerifier {
			public  boolean verify(String hostname, SSLSession session) {
				return true;
			}
	}
	/**
     * 初始化访问
     * 
     * @throws Exception
     */
    public static void initAccess()throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}
                public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) { }
                public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) { }
            }
        };
        SSLContext sc = SSLContext.getInstance("TLSv1.2");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new TrustAnyVerifier());
    }
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		initAccess();
        String address = "https://abc.def.org/";
        URL url = new URL(address);
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        InputStream input = conn.getInputStream();
        input.read();
        input.close();
        System.out.println(conn.getResponseCode());
	}

}

JDK1.7环境下,通过手动编译,并执行,出现如下错误:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:953)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
	at com.zyz.ceshi.OneWayAccessWithHttps.main(OneWayAccessWithHttps.java:45)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
	at sun.security.ssl.InputRecord.read(InputRecord.java:482)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
	... 8 more

在查找问题原因是,发现有网友说这个是JDK版本的问题,我因此尝试了6,7,8三个版本的JDK,均抛出同样的异常,后来,google了一下,找到了根本的原因,与其说是JDK版本的问题,不如说是TLS的版本问题,我通过wireshark进行抓包(抓浏览器正常访问地址),同时抓取我代码执行时的数据包,发现了版本差异,浏览器正常访问时,版本为TLSv1.2,因此,我将代码中TLSv1设置为了TLSv1.2,此时居然成功了。

PS:wireshark抓包是,使用如下方式进行过滤:

ssl and (ip.dst == xx.xx.xx.xx or ip.src == xx.xx.xx.xx)

 

© 著作权归作者所有

粉丝 0
博文 1
码字总数 451
作品 0
海淀
私信 提问
Ganymed SSH-2 java实现远程连接服务器并执行命令的方法(Windows和Linux)

java实现连接远程服务器并执行命令的基本原理 一、所需jar包 需要借助Ganymed SSH的jar包: ganymed-ssh2-build210.jar 下载地址: http://www.ganymed.ethz.ch/ssh2/ API详情: http://www.ga...

YuanyuanL
2013/12/20
11.4K
4
【项目管理】软件项目经理须知的 Java 8 安全知识

【译者按】作为软件研发项目的项目经理,只懂项目管理知识是不够的,需要对软件技术本身有基本的了解。Java 是一种主流的系统开发语言,其安全设计对于构建安全的信息系统有至关重要的意义。...

军雷
2017/06/08
0
0
Hadoop集群(第5期副刊)_JDK和SSH无密码配置

1、Linux配置java环境变量 1.1 原文出处 地址:http://blog.csdn.net/jiedushi/article/details/6672894 1.2 解压安装jdk   在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,执行命...

Carl_
2015/06/25
10
0
sencha touch应用如何绕过tomcat j_security_check访问javaweb的服务

sencha touch应用通过Ajax请求java web应用的资源,在同一个会话内,如果没有登录java web应用,sencha touch应用无法访问所需的资源。 java web应用的安全机制通过j_security_check的方式保...

WangPerry
2014/04/09
655
0
hadoop2.2.0伪分布式搭建

第一步:安装jdk 我的linux版本是centos7,使用最简单的安装方式,这里首先说一下,由于系统会预装openjdk版本等其他各种版本,首先要做的是清除这些版本,然后iu安装oracle的jdk版本 1.1 查...

施耀邦
2015/06/23
148
0

没有更多内容

加载失败,请刷新页面

加载更多

PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
15分钟前
5
0
wildfly(JBoss AS)应用服务器快速入门

什么是wildfly JBoss AS 从8版本起名为wildfly。Wildfly是一个开源的基于JavaEE的轻量级应用服务器。可以在任何商业应用中免费使用。 WildFly是一个灵活的、轻量的、强大管理能力的应用程序服...

程序新视界
39分钟前
2
0
Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾。 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/column/details/21930...

Java技术江湖
42分钟前
6
0
怎么用for循环打出爱心

先上效果图: 这是用*组成的爱心,下面讲讲思路: 首先这个图形可以拆分成三部分:第一部分是上面三行的两个梯形,第二部分是中间三行的长方形,第三部分是最下面的倒三角形。 其实图形拆分好...

INEVITABLE
48分钟前
4
0
用HttpUrlConnection伪造成HttpClient

https://www.jianshu.com/p/27ad06cc39d2

shzwork
53分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部