Остальные API в java с использованием https - PullRequest
0 голосов
/ 01 апреля 2020

, когда я создаю Restservices в java, используя GET, POST et c, тогда я запрашиваю их, используя http protocol. как только я использую https, выдается ошибка.

, например: http://localhost:8080/demorest/webapi/aliens работает правильно.

, но когда я запрашиваю то же самое, используя https

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

Я получаю сообщение об ошибке site can not provide secured connection

, какие изменения необходимы для обеспечения их совместимости с https.

Ответы [ 5 ]

1 голос
/ 09 апреля 2020

Как вы упомянули, вы новичок в API, вот подробный ответ для вас.

Ответ основан на предположении, что вы используете сервер Tomcat. Существует 4 шага, чтобы приложение работало по протоколу https, красный ниже

  1. Получить сертификат SSL или Создать самозаверяющий сертификат SSL
  2. Включить HTTPS в приложении
  3. Перенаправить HTTP на HTTPS
  4. Раздайте SSL-сертификат клиентам.

Если у вас еще нет ssl-сертификата, создайте себя с помощью keytool. Keytool - это утилита управления сертификатами, поставляемая вместе с JDK, поэтому, если у вас установлен JDK, у вас уже должен быть доступен keytool.

Давайте откроем приглашение терминала и напишем следующую команду для создания хранилища ключей JKS:

keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650 -storepass пароль

Чтобы создать хранилище ключей PKCS12, и мы должны сделать следующее:

keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 -storepass пароль

Давайте подробнее рассмотрим команду, которую мы только что выполнили:

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.

При запуске предыдущей команды, нам будет предложено ввести некоторую информацию, но мы можем пропустить все (просто нажмите Return, чтобы пропустить опцию). Когда вас спросят, верна ли информация, мы должны напечатать yes. Наконец, мы нажимаем клавишу возврата, чтобы также использовать пароль хранилища ключей в качестве пароля.

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):

Проверка содержимого хранилища ключей Чтобы проверить содержимое хранилища ключей в формате JKS, мы можем снова использовать keytool:

keytool -list -v -keystore keystore.jks

Чтобы проверить содержимое хранилища ключей в формате PKCS12:

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

Преобразовать хранилище ключей JKS в PKCS12

Если у нас уже есть хранилище ключей JKS, у нас есть возможность перенести его в PKCS12; Для этого в keytool есть удобная команда:

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

2.) Чтобы включить https в вашем project

Если у вас есть файл 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

Если у вас есть файл 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

Чтобы достичь в приложении, нам нужно расширить WebSecurityConfigurerAdapter class, поскольку свойство security.require-ssl устарело.

Если вы используете более старую версию, то можете пропустить указанный ниже код.

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

3.) Перенаправить http на https

Теперь, когда мы включили HTTPS в нашем приложении Spring Boot и заблокировали любой HTTP-запрос, мы хотим перенаправить весь трафик c на HTTPS.

Spring позволяет определить только один сетевой соединитель в application.properties (or application.yml). Поскольку мы использовали его для HTTPS, нам необходимо программно установить коннектор HTTP для нашего веб-сервера 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.) Распространение SSL-сертификата среди клиентов При использовании самозаверяющего SSL-сертификата наш браузер не будет доверять нашему приложению и предупредит пользователя, что он не защищен. И это будет то же самое с любым другим клиентом.

Можно заставить клиента доверять нашему приложению, предоставив ему наш сертификат.

Извлечь SSL-сертификат из хранилища ключей, которое мы сохранили наш сертификат в хранилище ключей, поэтому нам нужно его извлечь. Опять же, keytool очень хорошо поддерживает нас:

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

Сделать браузер доверенным сертификату SSL, когда используя хранилище ключей в стандартном формате PKCS12, мы должны иметь возможность использовать его напрямую, не извлекая сертификат.

Я предлагаю вам ознакомиться с официальным руководством о том, как импортировать файл PKCS12 в указанные вами c клиент.

При развертывании приложения на локальном хосте нам может потребоваться сделать еще один шаг из нашего браузера: включить небезопасные соединения с помощью localhost.

В Chrome мы можем написать следующий URL в поиске bar: chrome://flags/#allow-insecure-localhost и активируйте соответствующую опцию.

Импорт SSL-сертификата в хранилище ключей JRE Чтобы JRE доверял нашему сертификату, нам нужно импортировать его в cacerts: хранилище JRE-доверия, отвечающее за хранение всех сертификаты, которым можно доверять.

Во-первых, нам нужно знать путь к нашему дому JDK. Быстрый способ найти его, если мы используем Eclipse или STS в качестве нашей IDE, - это перейдите в Предпочтения> Java> Установленные JRE. Если вы используете IntelliJ IDEA, мы можем получить доступ к этой информации, перейдя в Project Structure> SDKs и посмотрев значение поля home path JDK.

Затем, из нашего приглашения Terminal, вставим следующую команду (мы могли бы необходимо запустить его с правами администратора, добавив префикс sudo):

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

Вы можете ссылаться на проект на github здесь

1 голос
/ 08 апреля 2020

Шаг 1: Вы можете создать хранилище ключей, используя java keytool;

Команда : keytool -genkey -alias {any-name} -keyalg RSA -keystore {путь для хранения хранилища ключей}

Шаг 2: Вы можете go в файл конфигурации вашего сервера, например conf / server. xml для Tomcat и раскомментировать параметр 8443 и затем добавьте следующее в конце перед закрытием тега:

keystoreFile = "{путь к хранилищу ключей}" keystorePass = "{Пароль, который вы задали при создании хранилища ключей}" />

Шаг 3: Теперь перезапустите сервер и нажмите «https://localhost: 8443 / demorest / webapi / aliens ».

Удачного кодирования!

1 голос
/ 06 апреля 2020
  1. Сначала проверьте протокол https, используя тот же порт, что и 8080? в большинстве случаев http (8080) и https (8443 или 443) используют разные порты.
  2. Если порт указан правильно, импортируйте сертификат. { ссылка }
1 голос
/ 08 апреля 2020

Было бы полезно, если бы вы могли указать используемый вами сервер, также было бы неплохо, если бы версия java, платформы (если есть) и их версия, а в данном случае, конечно же, версия сервера и сервера .

В упомянутой ссылке здесь, на DZone , вы можете найти пример локальной настройки https с сервером tomcat в приложении java, иначе вы также можете попробовать более универсальная c статья не указана c до java здесь на freecodecamp

1 голос
/ 05 апреля 2020

Зависит от того, что ваши остальные службы могут работать на Tomcat или Spring Boot, поэтому следует прочитать их документацию, вы также можете использовать другую службу https, например nginx, которая передает все или часть запросов от https до http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...