J'ai une application android qui se connecte à un service Web SSL que nous hébergeons. Le serveur Web est apache et possède sa propre autorité de certification que nous avons créée et un certificat SSL auto-signé. J'ai importé notre certificat d'autorité de certification sur la tablette Android dans la section Certificats approuvés de l'utilisateur dans la section Sécurité.Android SSL HTTP Request utilisant le certificat auto-signé et CA
J'ai testé l'accès au serveur Web et peut confirmer que le certificat de service Web affiche comme valide (capture d'écran ci-dessous)
Voici le certificat dans les paramètres de sécurité:
Maintenant, lorsque j'essaie d'accéder au service Web dans mon application, l'exception "No Peer Certificate" est déclenchée.
Ceci est la mise en œuvre de SSL simplifiée:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// allows network on main thread (temp hack)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
SchemeRegistry schemeRegistry = new SchemeRegistry();
//schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
schemeRegistry.register(new Scheme("https", newSSLSocketFactory(), 443));
HttpParams params = new BasicHttpParams();
SingleClientConnManager mgr = new SingleClientConnManager(params, schemeRegistry);
HttpClient client = new DefaultHttpClient(mgr, params);
HttpPost httpRequest = new HttpPost("https://our-web-service.com");
try {
client.execute(httpRequest);
} catch (Exception e) {
e.printStackTrace(); //
}
}
/*
* Standard SSL CA Store Setup //
*/
private SSLSocketFactory newSSLSocketFactory() {
KeyStore trusted;
try {
trusted = KeyStore.getInstance("AndroidCAStore");
trusted.load(null, null);
Enumeration<String> aliases = trusted.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
X509Certificate cert = (X509Certificate) trusted.getCertificate(alias);
Log.d("", "Alias="+alias);
Log.d("", "Subject DN: " + cert.getSubjectDN().getName());
Log.d("", "Issuer DN: " + cert.getIssuerDN().getName());
}
SSLSocketFactory sf = new SSLSocketFactory(trusted);
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
return sf;
} catch (Exception e) {
// TODO Auto-generated catch block
throw new AssertionError(e);
}
}
}
La boucle while juste recrache les certificats et je peux voir mon propre CA dans les journaux. Mais je reçois toujours l'exception "No Peer Certificate".
10-17 18: 29: 01,234: I/System.out (4006): Aucun certificat pairs
Dois-je charger manuellement mon certificat de CA en quelque sorte dans cette mise en œuvre?
Avez-vous essayé de charger manuellement votre certificat CA dans cette mise en œuvre? – BON
Vous pouvez obtenir un certificat SSL gratuit et approuvé pour votre domaine à partir de http://www.startssl.com/ (je les utilise pour certaines applications). Vous n'avez donc pas besoin d'ajouter votre autorité de certification dans chaque appareil. qui veut utiliser votre application. –