HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat

Fohnbit

Top Contributor
Hallo,

ich muss eine HTTP Get/Post Kommunikation auf ein IP Gerät ausführen.
Laut Datenblatt signiert das Gerät ein eigenes RSA Zertifikat, das der Client annehmen muss.

Ich kenn das wenn man eine Webseite mit dem Browser aufruft und man muss das Zertifikat bestätigen.

Folgende TLS v1.2 "Ciphers" werden von der Gegenseite unterstützt:
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384

Alternativ:
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384

Hat jemand ein Beispiel wie ich eine HTTP Get auf so ein Gerät absetze?
Laut Beschreibung kann im HTTP Header gesetzt werden, dass die Verbindung offen bleibt, da alle 2 Sekunden Daten abgerufen werden und das Handshake sonst immer neu ausgehandelt wird.

Herzlichen Dank!
 
Ok, damit habe ich mal den Abruf der Seite geschafft:

Java:
import java.net.MalformedURLException;
import java.net.URL;
import java.security.cert.Certificate;
import java.io.*;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;

public class RestTls{
   
   public static void main(String[] args)
   {
        new RestTls().testIt();
   }
   
   private void testIt(){

      String https_url = "https://test.mosquitto.org:8081";
      URL url;
      try {

         url = new URL(https_url);
         HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
        
           
         //dumpl all cert info
         print_https_cert(con);
           
         //dump all the content
         print_content(con);
           
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }

   }
   
   private void print_https_cert(HttpsURLConnection con){
    
    if(con!=null){
           
      try {
               
    System.out.println("Response Code : " + con.getResponseCode());
    System.out.println("Cipher Suite : " + con.getCipherSuite());
    System.out.println("\n");
               
    Certificate[] certs = con.getServerCertificates();
    for(Certificate cert : certs){
       System.out.println("Cert Type : " + cert.getType());
       System.out.println("Cert Hash Code : " + cert.hashCode());
       System.out.println("Cert Public Key Algorithm : "
                                    + cert.getPublicKey().getAlgorithm());
       System.out.println("Cert Public Key Format : "
                                    + cert.getPublicKey().getFormat());
       System.out.println("\n");
    }
               
    } catch (SSLPeerUnverifiedException e) {
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    }

     }
   
   }
   
   private void print_content(HttpsURLConnection con){
    if(con!=null){
           
    try {
       
       System.out.println("****** Content of the URL ********");           
       BufferedReader br =
        new BufferedReader(
            new InputStreamReader(con.getInputStream()));
               
       String input;
               
       while ((input = br.readLine()) != null){
          System.out.println(input);
       }
       br.close();
               
    } catch (IOException e) {
       e.printStackTrace();
    }
           
       }
       
   }
   
}

Jedoch muste ich vor das Zertifikat in den Ordner mittels keytool.exe kopieren und in Eclipse angeben:
-Djavax.net.ssl.trustStore="C:\Program Files (x86)\Java\jre1.8.0_66\lib\security\cacerts" -Djavax.net.ssl.trustStorePassword=changeit

Ich muss aber das Speichern der Zertifikate, sofern noch nicht geschehen, selber machen.

Oder kann ich aus dem Code heraus das Zertifikat abspeichern oder Temporär halten?

Danke!
 

Zurück
Oben