Faire une connexion HTTPS à l'aide de l'URL.openConnection()
Je suis en train de faire une connexion HTTPS pour une serveur qui a un certificat à échéance en avril 2013 et utilise GlobalSign que le certificat racine.
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
//urlConnection.setSSLSocketFactory(sslSocketFactory);
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
//Send the POST data
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(postParamString.toString().getBytes("UTF8"));
//Read the reply
InputStream in = urlConnection.getInputStream();
Comme il se trouve, cela jette javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
quand getOutputStream()
est appelé.
Ce même site et le certificat sont valides dans le stock HTC navigateur web et les navigateurs de bureau. Lorsque j'utilise le même code pour l'accès Google il fonctionne (mais alors se plaint d'une erreur 404). Divers postes sur StackOverflow n'implique pas qu'il devait tout simplement "travail" et d'autres disent à mettre en place votre propre magasin de clés (ou de désactiver tous les HTTPS validation!!!) Je suppose que la différence de comportement est en baisse de racine différente de la clé de magasins en cours d'utilisation (quelqu'un Peut confirmer?).
J'ai essayé aujourd'hui la création d'un magasin de clés à l'aide de château gonflable, mais je ne peux pas obtenir ce pour charger sur mon appareil.
Après l'exportation du certificat à partir de Firefox, j'ai créer un magasin de clés à l'aide de:
keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore
C'est alors chargé et utilisé dans l'application à l'aide:
InputStream stream = context.getResources().openRawResource(R.raw.keystore);
//BKS seems to be the default but we want to be explicit
KeyStore ks = KeyStore.getInstance("BKS");
ks.load(stream, "www.onlinescoutmanager.co.uk".toCharArray());
stream.close();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SSLContext context2 = SSLContext.getInstance("TLS");
context2.init(null, new TrustManager[] { defaultTrustManager }, null);
sslSocketFactory = context2.getSocketFactory();
C'est à défaut avec java.io.IOException: Wrong version of key store.
quand keystore.Load()
est appelé.
J'ai assuré que je suis de passage -storetype BKS
, utilisé un <=7 caractères du mot de passe du fichier de clés, a ajouté le CA certs de la clé de stockage, et à l'aide de deux Château Gonflable version 1.45 et 1,47 pour créer le magasin de clés avec aucun changement dans le message d'erreur signalé.
Mon environnement Eclipse Juno 4.2.1 avec le JRE 1.7u9b5 en cours d'exécution sur Windows 8. L'appareil que je suis en essais sur un HTC sensation courir stock Android 2.3. L'application dispose d'un minimum version du SDK de 7 et un objectif de 15.
Si quelqu'un peut expliquer comment créer un valide BKS touche store sur Windows 8 comment puis-je obtenir Java à utiliser la même clé de stockage comme le navigateur(ou système?) que serait appréciée.
Vous pouvez télécharger le tout le projet qu'il l'était au moment de la rédaction, et la généré keystore si nécessaire.
J'ai eu pour réponse un peu, je devrais connaître les règles et la façon de "poser un décent question" :p
lorsque vous créez le fichier de clés, si vous avez -trustedcacerts dans les options de sorte qu'il permettra de valider le cert à l'aide de la confiance des certs? (neve travaillé avec BKS deviner sur la base de java similitudes)
toutes mes excuses, faute de frappe. Devrait -trustcacerts. J'espère que cela fonctionne, si non je vais le laisser à des personnes qui ont effectivement utilisé BKS
J'ai essayé d'ajouter de confiance et de deux CA certs au-dessus d'elle pour le fichier de clés aussi, mais avec le même résultat :|.
OriginalL'auteur Deanna | 2013-01-01
Vous devez vous connecter pour publier un commentaire.
Château gonflable 1.47 est à l'aide de différentes version d'en-tête. Pouvez-vous essayer 1.46 version, il devrait fonctionner.
Hmmm, je n'ai pas essayer avec la version 1.45 mais je peux dire que votre projet avec succès les charges de magasin de clés créé par 1,46 version.
Elle est ici : dl.dropbox.com/u/26734922/keystore
Merci, en utilisant 1.46 correction du problème de version. J'ai rédigé une solution complète/l'explication ci-dessous.
OriginalL'auteur Akdeniz
Grâce à diverses personnes pour leurs conseils sur ce, il y a plusieurs choses qui doivent être tous corrects pour que cela fonctionne.
Si le site en HTTPS certificat est signé par un certificat racine de confiance, alors il sera de travailler à l'extérieur de la boîte, sans personnalisé
SSLSocketFactory
.Les certificats racine de confiance PEUT être différent de celui utilisé par un navigateur afin de ne pas supposer que si cela fonctionne dans le navigateur web d'Android ensuite, il sera dans votre application.
Si ce n'est pas un certificat racine de confiance et vous obtenez des exceptions comme le
javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
, alors vous avez besoin pour créer et charger un magasin de clés ci-dessous.La clé de stockage doit être généré en utilisant le Château Gonflable fournisseur (Un) en spécifiant
-storetype bks
sur lekeytool
ligne de commande.Si le Château Gonflable n'est pas installé correctement, ceci ne fonctionnera pas avec diverses exceptions, notamment
java.security.KeyStoreException: BKS not found
.Si la clé de stockage n'est pas créé avec le Château Gonflable fournisseur, alors vous pouvez obtenir la
java.io.IOException: Wrong version of key store.
exception, à l'origine de la confusion avec le cas suivant.Vous devez utiliser une version appropriée (Un, Deux, Trois) du Château Gonflable fournisseur. Dans la plupart des cas, ce qui semble être la version 1.46.
Cela peut être mis dans votre JRE
lib/ext/
dossier et le nom de la classe ajoutée àlib/security/java.security
, ou directement spécifiées sur la ligne de commande pourkeytool
.Si c'est une version incompatible (ou type de magasin), vous obtiendrez des exceptions, le long de la lignes de
java.io.IOException: Wrong version of key store.
de nouveau.Vous devez inclure tous les intermédiaires et le certificat racine. Si un seul manque, vous obtiendrez un
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
exception.La chaîne de certificat DOIT être en ordre pour eux d'être validé correctement. Si ils ne sont pas vous aurez
javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: IssuerName(CN=XYZ) does not match SubjectName(CN=ABC) of signing certificate.
ou encore, un génériquejavax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Je n'ai pas trouvé un moyen de les commander dans le magasin de clés donc eu recours à le faire dans le code au moment de l'exécution.
Certaines personnes ont suggéré que à l'aide d'un mot de passe du fichier de clés de plus de 7 caractères sera aussi la cause de la panne, mais ce n'est pas ce que j'ai trouvé.
Je pense que cela couvre tous les écueils que j'ai trouvé, mais n'hésitez pas à élargir et d'ajouter linsk à des questions connexes.
OriginalL'auteur Deanna