使用Grizzly和HttpsURLConnection进行WebService的Java SSL

时间:2015-10-30 12:14:26

标签: java web-services ssl jersey grizzly

我正在使用JerseyGrizzly撰写网络服务。我想使用SSL运行它。我创建了server.jksclient.jks,就像描述here

一样

运行网络服务:

public static HttpServer startServer() {
    final ResourceConfig rc = new ResourceConfig().packages("com.mypackage");

    SSLContextConfigurator sslContextConfigurator = new SSLContextConfigurator();
    sslContextConfigurator.setKeyStoreFile("server.jks");
    sslContextConfigurator.setKeyStorePass("changeit");

    SSLEngineConfigurator sslEngineConfigurator = new SSLEngineConfigurator(sslContextConfigurator);

    return GrizzlyHttpServerFactory.createHttpServer(URI.create(getURI().toString()), rc, true,
            sslEngineConfigurator);
}

private static URI getURI() {
    URI uri;

    // Running on localhost
    uri = UriBuilder.fromUri("https://" + "localhost/" + ConstApp.APP_PATH).port(ConstApp.PORT)
                .build();

    return uri;
}

因此,使用localhostserver.jks端口443上运行Web服务。

现在我想检查并测试网络服务。

Java HTTPClient类:

    String https_url = "https://localhost:443/myapp";
    URL url;
    try {

        url = new URL(https_url);
        HttpsURLConnection sslCon = (HttpsURLConnection) url.openConnection();


        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

        FileInputStream stream = new FileInputStream("client.jks");
        keyStore.load(stream, "changeit".toCharArray());


        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(keyStore);
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(null, tmf.getTrustManagers(), null);
        SSLSocketFactory sslSocketFactory = ctx.getSocketFactory();

        sslCon.setSSLSocketFactory(sslSocketFactory);
        sslCon.setRequestMethod("GET");

        // add request header
        sslCon.setRequestProperty("User-Agent", "Mozilla/5.0");

        int responseCode = sslCon.getResponseCode();
        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(new InputStreamReader(sslCon.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        // print result
        System.out.println(response.toString());

    } catch (Exception e) {
        e.printStackTrace();
    }

在异常中运行HTTPClient结果:

javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:196)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1513)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
at httpClient.HTTPClient.testIt(HTTPClient.java:158)
at httpClient.HTTPClient.main(HTTPClient.java:36)

有人可以帮助我,告诉我我做错了什么吗?

0 个答案:

没有答案