Как вы упомянули, вы новичок в API, вот подробный ответ для вас.
Ответ основан на предположении, что вы используете сервер Tomcat. Существует 4 шага, чтобы приложение работало по протоколу https, красный ниже
- Получить сертификат SSL или Создать самозаверяющий сертификат SSL
- Включить HTTPS в приложении
- Перенаправить HTTP на HTTPS
- Раздайте 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 здесь