我的网站在我的桌面上使用SSL工作得很好(chrome)我在地址栏附近有一个绿色锁定说"身份验证"
但是使用移动移动浏览器(Chrome/Safari)我看到以下消息 - "此网站的身份尚未经过验证",并且锁定(地址栏附近的镀铬处)上有一个红色的x标记任何想法为什么它发生?
有很多关于这个问题的帖子(javax.net.ssl.SSLPeerUnverifiedException:没有对等证书),但我找不到任何适合我的问题.
许多帖子(像这样,这个)通过允许接受所有证书来"解决"这一点,但是,当然,除了测试之外,这不是一个好的解决方案.
其他人似乎很本地化,不适合我.我真的希望有人有一些我缺乏的见解.
所以,我的问题是:我正在一台只能通过本地网络访问的服务器上进行测试,通过HTTPS连接.我需要通过浏览器拨打电话工作正常.没有抱怨证书,如果你检查证书,这一切看起来都不错.
当我试用我的Android设备时,我明白了 javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
这是调用它的代码:
StringBuilder builder = new StringBuilder();
builder.append( /* stuff goes here*/ );
httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();
// Execute HTTP Post Request. Response body returned as a string
HttpClient httpClient = MyActivity.getHttpClient();
HttpGet httpGet = new HttpGet(builder.toString());
String jsonResponse = httpClient.execute(httpGet, responseHandler); //Line causing the Exception
Run Code Online (Sandbox Code Playgroud)
我的代码MyActivity.getHttpClient():
protected synchronized static HttpClient getHttpClient(){
if (httpClient != null)
return httpClient;
HttpParams httpParameters = new BasicHttpParams(); …Run Code Online (Sandbox Code Playgroud) 我有一个网站,我正在为一个RESTful服务启用ssl.我们已在RapidSSL注册,安装了证书,并通过了RapidSSL检查程序.我可以使用各种浏览器访问该网站,包括Android浏览器(内置,Firefox和Opera),没有任何问题,没有警告.
但是,当我尝试使用我的Android应用程序访问它时,我得到以下异常:
08-11 20:04:05.586 363 381 E HttpProvider: Error executing request: No peer certificate
08-11 20:04:05.586 363 381 E HttpProvider: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:259)
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
08-11 20:04:05.586 363 381 E HttpProvider: …Run Code Online (Sandbox Code Playgroud) 我有这个方法:
public static String getReportMetadata (String reportId, String sessionId, String url) throws Exception{
Map<String, Object> jsonValues = new HashMap<String, Object>();
jsonValues.put("reportID", reportId);
jsonValues.put("sessionID", sessionId);
JSONObject json = new JSONObject(jsonValues);
DefaultHttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url + GET_REPORT_METADATA_ACTION);
AbstractHttpEntity entity = new ByteArrayEntity(json.toString().getBytes("UTF8"));
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(entity);
HttpResponse response = client.execute(post);
return getContent(response);
}
Run Code Online (Sandbox Code Playgroud)
执行HTTPPost请求当然我AsyncTask用来从服务器获取数据.
我的问题:有人
可以用一个简单的方法向我解释我需要执行哪些步骤来将此连接类型更改为安全连接(也就是使用HTTPS).仅从android的角度来看(意思是客户端应用程序).
更新: 正如建议我尝试只更改链接并添加https而不是http,但它不会返回答案.据我所知,我需要获取并存储自签名证书才能连接到服务器端
UPDATE2: 适用于我的解决方案:
EasySSLSocketFactory:
public class EasySSLSocketFactory implements SocketFactory, LayeredSocketFactory {
private SSLContext …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中使用https发送请求,遵循此源答案.现在他们中的一些apache方法已被弃用.任何人都可以帮我解决一个新的方法吗?