Android自签名握手错误

时间:2015-03-23 08:48:51

标签: android ssl https

我正在尝试使用自签名证书在HTTPS服务器上执行POST HTTP请求。我的POST是多部分,允许发送文件(图片或其他任何东西)。

我仍然收到以下错误:

Error:javax.net.ssl.SSLHandshakeException: Handshake failed:Handshake failed

这是我的源代码:

URL url = new URL(PROTOCOL + "://" + host + "/file");
URI uri = new URI(PROTOCOL, null, url.getHost(), url.getPort(), URLEncoder.encode(url.getPath(), "UTF-8").replace("+", "%20").replace("%2F", "/"), url.getQuery(), null);
String authorizationHeader = Hawk.generateAuthorizationHeader(url, "POST", (int) (System.currentTimeMillis() / 1000), Hawk.generateNonce(), url.getPort());

HttpClient client = getHttpClient();

HttpPost httpPost = new HttpPost(uri);
httpPost.setHeader("Authorization", authorizationHeader);

MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

java.io.File file = new java.io.File(fullLocalFilePath);
entityBuilder.addBinaryBody(fullLocalFilePath, file);

HttpEntity entity = entityBuilder.build();
httpPost.setEntity(entity);

HttpResponse response = client.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
httpEntity.consumeContent();

1 个答案:

答案 0 :(得分:0)

之前我遇到过这样的事情,所以这是我的猜测。问题是证书使用的域名与我目前使用的域名不同。在OpenSSL中,域名是Common Name,它在创建证书时会询问您,或者如果将其作为参数执行,则为CN。其值应与您尝试访问的服务器的域相同。

你可以试试这个: 对于Windows,请转到%systemroot%\system32\drivers\etc,以管理员身份修改hosts。添加类似此<your IP> mysampledomain.net的行,然后在创建SSL密钥/证书时,将mysampledomain.net作为域名的值,即Common Name在OpenSSL参数中。对于linux,过程是相同的,只是hosts文件位于/etc/hosts

尝试调用您的代码,看看是否仍然遇到相同的错误。