我正在尝试使用自签名证书在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();
答案 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
。
尝试调用您的代码,看看是否仍然遇到相同的错误。