自签名证书例外主机名验证失败

时间:2015-03-26 18:21:02

标签: android ssl httpurlconnection self-signed

我正在尝试使用httpsurlconnection发送数据。我将.pem证书导入android密钥库并创建了ssl上下文。现在一切正常,除非我从Android通过服务器发送一些数据时说主机名未经验证。

 HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
AssetManager assetManager = MainActivity.ctx.getAssets();
InputStream requestXML = assetManager.open("requestdump");         
String requestString = convertStreamToString(requestXML);
java.net.URL url = new URL("https://nn.nnn.nnn.nnn:xxxx");
HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection();
urlConnection.setSSLSocketFactory(getSSLSocketFactory());
urlConnection.setReadTimeout(10000);
urlConnection.setConnectTimeout(15000);
urlConnection.setRequestMethod("POST");
urlConnection.setHostnameVerifier(hostnameVerifier );
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
byte[] outputInBytes = requestString.getBytes("UTF-8");       
OutputStream os = urlConnection.getOutputStream();
os.write( outputInBytes );
os.close();             
InputStream in = urlConnection.getInputStream();

此代码正在ssl启用服务器上运行并发送数据。我试过这段代码:

HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
urlConnection.setHostnameVerifier(hostnameVerifier );

但我不想使用这种方法。

如果没有这种方法,我的主机名未经验证。请问有人建议如何使用自签名证书在服务器上发送数据而不使用ALLOW_ALL_HOSTNAME_VERIFIE。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

修复证书,使其主机名正确无误。这意味着重新开始使用新的密钥对。

答案 1 :(得分:0)

您可能在Android和Windows上获得了不同的证书,因为您的Android应用程序不支持SNI (Server Name Indication)。您在Android上获得的证书适用于不同的主机。查看Android SSL - SNI support了解详情。