2017-01-04 1 views
5

Je suis en train de faire une demande http en utilisant la méthode de toURL() groovy dans Grails:Ignorer les erreurs SSL avec la méthode toURL de groovy

def holidayApiUrl = "https://holidayapi.com/v1/holidays?key=${apiKey}&year=2016&country=US" 

def holidayJson = JSON.parse(holidayApiUrl.toURL().text) 

Vous pouvez obtenir les clés api de holidayapi.com pour reproduire cette erreur.

Au-dessus de la demande donne

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Je cherchais des moyens d'ignorer les erreurs de ssl complètement en utilisant cette méthode groovy. Mais pas capable de l'obtenir.

D'autres messages SO suggèrent des choses comme this mais groovy's toURL n'utilise pas SSLContext. Alors est-il possible d'ignorer les erreurs ssl en utilisant toURL()?

EDIT:

Tous ceux qui veulent tester ci-dessus fragment de code peut inscrire gratuitement pour holidaypi.com et obtenir la clé api. L'url ci-dessus (Remplacé par la touche api) lorsqu'il est frappé dans le navigateur donne le bon JSON. Mais le code ci-dessus donne l'erreur SSL lorsqu'il est exécuté dans groovy.

Répondre

0

Pour le traitement de JSON avec Groovy, une meilleure approche qui fonctionne pour moi sans problème est d'utiliser la classe groovy.json.JsonSlurper. Une version modifiée de votre code à l'aide JsonSlurper devrait fonctionner:

import groovy.json.* 

def holidayApiUrl = "https://holidayapi.com/v1/holidays?key=${apiKey}&year=2016&country=US".toURL() 

//Returns an instance of a Map 
def holidayJson = new JsonSlurper().parse(holidayApiUrl) 

//Make it pretty and print 
println JsonOutput.prettyPrint(JsonOutput.toJson(holidayJson)) 
+0

Est-ce vous êtes sûr que cela fonctionne? Pour moi, cela me donne toujours l'erreur de poignée de main SSL. Je vous recommande d'obtenir une clé api (gratuit pour obtenir) de holidayapi.com et tester ce code. – rahulserver

+0

J'ai reçu une clé, ça a marché pour moi. – pczeus

1

Juste avant d'appeler

def holidayJson = new JsonSlurper().parse(holidayApiUrl) 

Essayez de faire ce qui suit (ce qui crée et enregistre TrustManager alternative):

import javax.net.ssl.SSLContext; 
import javax.net.ssl.X509TrustManager; 
import javax.net.ssl.HttpsURLConnection; 

class TrustManager implements X509TrustManager { 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } 
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { } 
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { } 
} 

TrustManager[] trustAllCerts = new TrustManager[1] 
trustAllCerts[0] = new TrustManager() 
SSLContext sc = SSLContext.getInstance("SSL"); 
sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
+0

Cela fonctionne plutôt bien - merci pour cette solution +1. Un peu plus court 'sslContext.init (null, (TrustManager []) [nouveau TrustManager()], new java.security.SecureRandom())' – Trinimon