用Java模拟https登录,总是javax.net.ssl.SSLHandshakeException,求高手指导

qq_28567403 2015-11-10 10:12:47
最近在研究httpconnection,发现网络上大多数都是http,但是对于敏感的东西还是https页面。想用J2SE来模拟https登录。简单的看了一下https,有了一个大概的了解,开售动手用Java来模拟https登录,于是就用了平时叫外卖的网站(饿了么)的登录页面来测试。代码如下

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;


public class Test {
public static void main(String[] args){
try {
URL url = new URL("https://account.ele.me/login");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.");
conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
conn.setDoInput(true);
conn.setDoOutput(true);
//OutputStream outstream = conn.getOutputStream();
//outstream.write(param.getBytes());
//outstream.flush();
//outstream.close();
InputStream instream = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(instream,"utf-8"));
StringBuffer buffer = new StringBuffer();
String line = "";
while((line = reader.readLine()) != null){
buffer.append(line);
System.out.println(line);
}
String sessionId = "";
String cookieVal = "";
String key = null;
for(int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++){
if(key.equalsIgnoreCase("set-cookie")){
cookieVal = conn.getHeaderField(i);
System.out.println(cookieVal);
cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
sessionId = sessionId + cookieVal + ";";
System.out.println(sessionId);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

现在程序总是报
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching account.ele.me found.
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:418)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1041)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at Test.main(Test.java:27)
Caused by: java.security.cert.CertificateException: No subject alternative DNS name matching account.ele.me found.
at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:193)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:77)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:264)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:250)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1014)
... 12 more
错误,问高手我这问题出在什么地方,有什么方法可以解决,还有我对https只有概念性理解,对java的模拟登录了解不是很多,高手们是否可以详细的告诉我模拟登陆的具体过程,网上全部是大段的代码,解释很少,让我很难理解内部在搞什么。
...全文
3598 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony4geek 2015-11-10
  • 打赏
  • 举报
回复
你的异常不知道是不是ssl引起的,有的网站不需要证书验证。你这个网站不知道需要不?如果需要的话得加入证书验证。 参考1 参考2 参考3
qq_28567403 2015-11-10
  • 打赏
  • 举报
回复
引用 1 楼 rui888 的回复:
你的SSL 证书代码里面没加?
怎么加? 证书怎么从web上获取?
tony4geek 2015-11-10
  • 打赏
  • 举报
回复
你的SSL 证书代码里面没加?
humanity 2015-11-10
  • 打赏
  • 举报
回复
把服务器的 SSL 证书的根证书导入到你的 keystore 中(对于绝大多数商用网站来说,这个步骤是不需要的,因为如果需要你这做这个步骤就表示它的颁发机构是全新的,或者说是不可信的)。 在启动 JVM 进程时可以在命令行用 -D 参数把 ssl truststore 参数加上去,也可以在代码中加载 trust store。 一般除了银行这类的金融类的网站多数是不用验证你的客户端 SSL 证书的,(像支付宝,网银就需要客户端证书),但我们访问一个邮箱或QQ之类的登录就算是 SSL 协议的也不需要客户端出示证书,因些不需要 keystore,只需要在 trust store 中包括将要访问的服务器的证书或它的根证书机构的证书即可。 在建立连接时会自动按 DN 名字去搜索证书条目,一般来说 DN 就是域名或 IP。我们从证书的信息中就能看到,如果对不上就无法建立连接。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧