2 Stimmen

Akzeptieren eines selbstsignierten Zertifikats in Java

Ich versuche, ein selbstsigniertes Zertifikat mit JBoss zu verwenden und im Code zu vertrauen. Aber ich bekomme javax.net.ssl.SSLPeerUnverifiedException:. Hier sind die Dinge, die ich versucht habe,

Ein Keystore erstellt

Ein Keystore erstellt

Ein Trust Store erstellen

Bildbeschreibung hier eingeben

SSL in JBoss AS 7.1.1 konfigurieren

Den JBoss gestartet. Jetzt kann ich die Seite im Chrome erreichen, indem ich auf die Schaltfläche 'Trotzdem fortfahren' klicke. Bildbeschreibung hier eingeben

Aber wenn ich versuche, vom Code aus zuzugreifen, erhalte ich eine Ausnahme.

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at com.test.utility.TestHttps.main(TestHttps.java:61)

Hier ist mein Code,

public class TestHttps {

  private static TrustManager[] getTrustManagers() throws IOException, GeneralSecurityException {

    String trustStorePassword = "password";

    String alg = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmFact = TrustManagerFactory.getInstance(alg);

    FileInputStream fis = new FileInputStream("C:\\work\\certs\\trust");
    KeyStore ks = KeyStore.getInstance("JKS");
    ks.load(fis, trustStorePassword.toCharArray());
    fis.close();

    tmFact.init(ks);

    TrustManager[] tms = tmFact.getTrustManagers();
    return tms;
  }

  public static void main(String[] args) throws Exception {

    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, getTrustManagers(), null);

    SSLSocketFactory ssf = new SSLSocketFactory(context);

    HttpClient base = new DefaultHttpClient();
    ClientConnectionManager ccm = base.getConnectionManager();
    SchemeRegistry registry = ccm.getSchemeRegistry();
    registry.register(new Scheme("https", 8443, ssf));

    try {

      DefaultHttpClient httpClient = new DefaultHttpClient(ccm, base.getParams());
      HttpGet getRequest = new HttpGet("https://localhost:8443/cafe/");

      HttpResponse response = httpClient.execute(getRequest);

      if (response.getStatusLine().getStatusCode() != 200) {
        throw new RuntimeException("Fehler: HTTP-Fehlercode : "
            + response.getStatusLine().getStatusCode());
      }

      BufferedReader br = new BufferedReader(new InputStreamReader(
          (response.getEntity().getContent())));
      String output;
      while ((output = br.readLine()) != null) {
        System.out.println(output);
      }
      httpClient.getConnectionManager().shutdown();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Bitte lassen Sie mich wissen, was ich falsch mache. Vielen Dank im Voraus.

3voto

jaks Punkte 4187

Ich habe das Problem gefunden, indem ich die Systemeigenschaft gesetzt habe

System.setProperty("javax.net.debug", "SSL,handshake,trustmanager");

Es scheint, dass das Problem mit der Jboss SSL-Konfiguration ist,

protocol="TLSv1" entfernt. Und das Zertifikat in den JRE-Keystore importiert als

  1. die Seite im Browser aufgerufen
  2. das Zertifikat exportiert
  3. in den JRE-Keystore importiert als

keytool -import -alias localhost -file C:\ssl\test.cer -keystore %JAVA_HOME%\jre\lib\security\cacerts"

Danach funktioniert der folgende Code einwandfrei.

String path = "https://localhost:8443/cafe/";

URL url = new URL(path);
URLConnection conn = url.openConnection();

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String output;
while ((output = br.readLine()) != null) {
  System.out.println(output);
}
br.close();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X