Ich habe einen REST-Server in Grizzly, der HTTPS verwendet und wunderbar mit Firefox funktioniert. Hier ist der Code:Verwendung von HTTPS mit REST in Java
//Build a new Servlet Adapter.
ServletAdapter adapter=new ServletAdapter();
adapter.addInitParameter("com.sun.jersey.config.property.packages", "My.services");
adapter.addInitParameter(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, SecurityFilter.class.getName());
adapter.setContextPath("/");
adapter.setServletInstance(new ServletContainer());
//Configure SSL (See instructions at the top of this file on how these files are generated.)
SSLConfig ssl=new SSLConfig();
String keystoreFile=Main.class.getResource("resources/keystore_server.jks").toURI().getPath();
System.out.printf("Using keystore at: %s.",keystoreFile);
ssl.setKeyStoreFile(keystoreFile);
ssl.setKeyStorePass("asdfgh");
//Build the web server.
GrizzlyWebServer webServer=new GrizzlyWebServer(getPort(9999),".",true);
//Add the servlet.
webServer.addGrizzlyAdapter(adapter, new String[]{"/"});
//Set SSL
webServer.setSSLConfig(ssl);
//Start it up.
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\n",
"https://localhost:9999/"));
webServer.start();
Jetzt versuche ich es in Java zu erreichen:
SSLContext ctx=null;
try {
ctx = SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
ClientConfig config=new DefaultClientConfig();
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(null,ctx));
WebResource service=Client.create(new DefaultClientConfig()).resource("https://localhost:9999/");
//Attempt to view the user's page.
try{
service
.path("user/"+username)
.get(String.class);
}
Und erhalten:
com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:128)
at com.sun.jersey.api.client.Client.handle(Client.java:453)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:557)
at com.sun.jersey.api.client.WebResource.get(WebResource.java:179)
Aus den Beispielen, die ich im Internet gefunden habe, es Es scheint, als müsste ich einen Truststore einrichten und dann eine Art TrustManager einrichten. Das scheint eine Menge Code und Setup-Arbeit für mein einfaches kleines Projekt zu sein. Gibt es einen einfacheren Weg, um einfach zu sagen .. Ich vertraue diesem Zertifikat und zeigen auf eine .cert-Datei?
Sehr schön, aber ... Kann ich die trustStore und trustStorePassword im Code statt Argumente an die VM setzen? – User1
Ja - vor allen Aufrufen von SSL-erfordernden Methoden verwenden Sie System.setProperty ("javax.net.ssl.trustStore", ") und machen dasselbe für javax.net.ssl. trustStorePassword. –
delfuego
Ein trauriger Teil ist, dass ein falscher Dateiname eine sehr vage Ausnahme gibt: "java.security.InvalidAlgorithmParameterException: Der Parameter trustAnchors muss nicht leer sein" – User1