Kiedy tworzę Restservices w java przy użyciu GET, POST itp., to proszę o ich użycie http protocol. jak tylko używam https, pojawia się błąd.

Na przykład: http://localhost:8080/demorest/webapi/aliens działa poprawnie.

Ale kiedy zapytam o to samo za pomocą https

https://localhost:8080/demorest/webapi/aliens

Otrzymuję błąd site can not provide secured connection

Jakie modyfikacje są wymagane, aby były zgodne z https.

0
user9892866 1 kwiecień 2020, 20:25

5 odpowiedzi

Najlepsza odpowiedź

Jak wspomniałeś, nie znasz jeszcze interfejsów API, tutaj znajdziesz szczegółową odpowiedź.

Odpowiedź opiera się na założeniu, że używasz serwera Tomcat. Istnieje 4-etapowe podejście, aby aplikacja działała na https, czerwony poniżej

  1. Uzyskaj certyfikat SSL lub wygeneruj certyfikat SSL z podpisem własnym
  2. Włącz HTTPS w aplikacji
  3. Przekieruj HTTP na HTTPS
  4. Roześlij certyfikat SSL do klientów.

Jeśli nie masz jeszcze certyfikatu ssl, wygeneruj go samodzielnie za pomocą narzędzia keytool. Keytool to narzędzie do zarządzania certyfikatami dostarczane wraz z pakietem JDK, więc jeśli masz zainstalowany pakiet JDK, powinieneś mieć już dostępne keytool.

Otwórzmy nasz monit Terminala i napisz następujące polecenie, aby utworzyć magazyn kluczy JKS:

keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650 -storepass password

Aby utworzyć magazyn kluczy PKCS12, a powinniśmy, polecenie jest następujące:

keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 -storepass password

Przyjrzyjmy się bliżej poleceniu, które właśnie uruchomiliśmy:

genkeypair: generates a key pair;
alias: the alias name for the item we are generating;
keyalg: the cryptographic algorithm to generate the key pair;
keysize: the size of the key. We have used 2048 bits, but 4096 would be a better choice for production;
storetype: the type of keystore;
keystore: the name of the keystore;
validity: validity number of days;
storepass: a password for the keystore.

Podczas uruchamiania poprzedniego polecenia zostaniemy poproszeni o wprowadzenie pewnych informacji, ale możemy je wszystkie pominąć (wystarczy nacisnąć klawisz Return, aby pominąć opcję). Na pytanie, czy informacje są poprawne, powinniśmy wpisać tak. Na koniec klikamy powrót, aby użyć hasła magazynu kluczy również jako hasła klucza.

What is your first and last name? 
    [Unknown]:  What is the name of your organizational unit? 
    [Unknown]:  What is the name of your organization? 
    [Unknown]:  What is the name of your City or Locality? 
    [Unknown]:  What is the name of your State or Province? 
    [Unknown]:  What is the two-letter country code for this unit? 
    [Unknown]:  Is CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? 
    [no]: yes 

Enter key password for <tomcat> 
    (RETURN if same as keystore password):

Weryfikacja zawartości magazynu kluczy Aby sprawdzić zawartość magazynu kluczy w formacie JKS, możemy ponownie użyć narzędzia keytool:

keytool -list -v -keystore keystore.jks

Aby przetestować zawartość magazynu kluczy w formacie PKCS12:

keytool -list -v -storetype pkcs12 -keystore keystore.p12

Przekonwertuj magazyn kluczy JKS na PKCS12

Jeśli mamy już magazyn kluczy JKS, mamy możliwość migracji go do PKCS12; keytool ma do tego wygodne polecenie:

keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype pkcs12

2.) Aby włączyć protokół HTTPS w projekcie

Jeśli masz plik application.properties

server.port=8443

server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=password
server.ssl.key-alias=tomcat

security.require-ssl=true

Jeśli masz plik application.yml

server:
  ssl:
    key-store: classpath:keystore.p12
    key-store-password: password
    key-store-type: pkcs12
    key-alias: tomcat
    key-password: password
  port: 8443

Aby to osiągnąć w aplikacji, musimy rozszerzyć klasę WebSecurityConfigurerAdapter, ponieważ właściwość security.require-ssl została wycofana.

Jeśli masz starszą wersję, możesz pominąć poniższy kod.

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .requiresChannel()
            .anyRequest()
            .requiresSecure();
    }
}

3.) Przekieruj http na https

Teraz, gdy włączyliśmy HTTPS w naszej aplikacji Spring Boot i zablokowaliśmy wszelkie żądania HTTP, chcemy przekierować cały ruch do HTTPS.

Wiosna umożliwia zdefiniowanie tylko jednego złącza sieciowego w application.properties (or application.yml). Ponieważ używaliśmy go do HTTPS, musimy programowo ustawić łącznik HTTP dla naszego serwera WWW Tomcat.

@Configuration
public class ServerConfig {

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(getHttpConnector());
        return tomcat;
    }

    private Connector getHttpConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

4.) Rozpowszechnianie certyfikatu SSL wśród klientów W przypadku korzystania z samopodpisanego certyfikatu SSL nasza przeglądarka nie będzie ufać naszej aplikacji i ostrzeże użytkownika, że nie jest ona bezpieczna. Tak samo będzie z każdym innym klientem.

Możliwe jest wzbudzenie zaufania klienta do naszej aplikacji poprzez dostarczenie jej naszego certyfikatu.

Wyodrębnij certyfikat SSL z magazynu kluczy Przechowaliśmy nasz certyfikat w magazynie kluczy, więc musimy go wyodrębnić. Ponownie, keytool wspiera nas bardzo dobrze:

keytool -export -keystore keystore.jks -alias tomcat -file myCertificate.crt

Spraw, by przeglądarka ufała certyfikatowi SSL Korzystając z magazynu kluczy w formacie PKCS12 będącym standardem branżowym, powinniśmy móc używać go bezpośrednio, bez wyodrębniania certyfikatu.

Proponuję zapoznać się z oficjalnym przewodnikiem dotyczącym importowania pliku PKCS12 do konkretnego klienta.

W przypadku wdrażania aplikacji na hoście lokalnym może być konieczne wykonanie kolejnego kroku w naszej przeglądarce: włączenie niezabezpieczonych połączeń z localhost.

W przeglądarce Chrome możemy wpisać następujący adres URL w pasku wyszukiwania: chrome://flags/#allow-insecure-localhost i aktywować opcję względną.

Importuj certyfikat SSL do magazynu kluczy JRE Aby środowisko JRE zaufało naszemu certyfikatowi, musimy zaimportować go do cacerts: magazynu zaufania JRE odpowiedzialnego za przechowywanie wszystkich zaufanych certyfikatów.

Po pierwsze, musimy znać drogę do naszego domu JDK. Szybkim sposobem na znalezienie go, jeśli używamy Eclipse lub STS jako naszego IDE, jest przejście do Preferencje> Java> Zainstalowane środowiska JRE. Jeśli używasz IntelliJ IDEA, możemy uzyskać dostęp do tych informacji, przechodząc do Project Structure> SDKs i spojrzeć na wartość pola JDK home path.

Następnie, z naszego wiersza poleceń terminala, wstawmy następujące polecenie (może być konieczne uruchomienie go z uprawnieniami administratora, poprzedzając go przedrostkiem sudo):

keytool -importcert -file myCertificate.crt -alias tomcat -keystore $ JDK_HOME / jre / lib / security / cacerts

Możesz polecić projekt na github tutaj

2
Kunal Vohra 9 kwiecień 2020, 04:58

Krok 1: Możesz utworzyć magazyn kluczy za pomocą java keytool;

Polecenie : keytool -genkey -alias {dowolna-nazwa} -keyalg RSA -keystore {ścieżka do magazynu kluczy}

Krok 2: Możesz przejść do pliku konfiguracyjnego serwera, takiego jak conf / server.xml dla Tomcat i odkomentować ustawienie 8443, a następnie dodać na końcu przed zamknięciem tagu;

KeystoreFile = "{ścieżka do magazynu kluczy}" keystorePass = "{Hasło ustawione podczas tworzenia magazynu kluczy}" / & gt;

Krok 3: teraz zrestartuj serwer i kliknij „https: // localhost: 8443 / demorest / webapi / aliens ”.

Miłego kodowania!

0
Shaheryar 8 kwiecień 2020, 18:44

Byłoby pomocne, gdybyś mógł podać serwer, z którego korzystasz, również zawsze byłoby miło, gdyby wersja java, frameworki (jeśli istnieją) i ich wersja, aw tym przypadku oczywiście serwer i wersja serwera.

W linku wymienionym tutaj w DZone można znaleźć przykład, jak aby skonfigurować https lokalnie z serwerem tomcat w aplikacji java, w przeciwnym razie możesz spróbować z bardziej ogólnym artykułem, nie specyficznym dla java tutaj na freecodecamp

0
Nithin 8 kwiecień 2020, 13:04
  1. Najpierw sprawdź protokół https przy użyciu tego samego portu co 8080? w większości przypadków http (8080) i https (8443 lub 443) używają różnych portów.
  2. Jeśli port jest poprawny, zaimportuj certyfikat. https://stackoverflow.com/a/27928213/5662508
0
Nagaraju Chitimilla 6 kwiecień 2020, 08:29

Zależy to od tego, że pozostałe usługi mogą działać na Tomcat lub Spring Boot, więc przeczytaj ich dokumentację, możesz również użyć innej usługi https, takiej jak nginx, która przekazuje wszystkie lub części żądań z https do http.

0
JohannesB 5 kwiecień 2020, 15:01