Tôi có một máy chủ REST được tạo bằng Grizzly sử dụng HTTPS và hoạt động tuyệt vời với Firefox. Dưới đây là các mã:Sử dụng HTTPS với REST trong 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();
Bây giờ, tôi cố gắng để đạt được nó trong Java:
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);
}
Và nhận được:
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)
Từ ví dụ mà tôi đã tìm thấy trên trang web, nó có vẻ như tôi sẽ cần phải thiết lập một Truststore sau đó thiết lập một số loại TrustManager. Điều này có vẻ như rất nhiều mã và thiết lập làm việc cho dự án nhỏ đơn giản của tôi. Có một cách dễ dàng hơn để chỉ nói .. Tôi tin tưởng cert này và trỏ đến một tập tin .cert?
Rất đẹp, nhưng ... Tôi có thể đặt trustStore và trustStorePassword trong mã thay vì đối số cho VM không? – User1
Có - trước khi có bất kỳ cuộc gọi nào đến các phương thức yêu cầu SSL, hãy sử dụng System.setProperty ("javax.net.ssl.trustStore", ") và thực hiện tương tự cho javax.net.ssl. trustStorePassword. –
delfuego
Một phần buồn là tên tệp không chính xác cho một ngoại lệ rất mơ hồ: "java.security.InvalidAlgorithmParameterException: tham số trustAnchors phải không trống" – User1