[JAVA] HTTPS avec Spring Boot et Let's Encrypt

introduction

Créez une application Web compatible HTTPS avec Spring Boot. Le serveur d'applications utilise Tomcat, qui est automatiquement intégré dans l'application Spring Boot. Le certificat de serveur utilise Let's Encrypt pour créer un certificat formel approuvé sur Internet.

Pour utiliser HTTPS, votre serveur doit pouvoir accéder à partir d'Internet, vous avez donc besoin d'un nom de domaine (FQDN). Dans mon cas, le serveur utilisé pour le test utilise le DDNS suivant.

MyDNS.JP privé https://www.mydns.jp/

Environnement de développement

Open JDK 14.0.1 (※) Spring Boot 4 4.6.2.RELEASE Développement PC Windows 10 Pro 1909 Image de machine serveur AWS EC2 Amazon Linux AMI 2018.03.0

Créer un certificat de serveur

Créez un certificat de serveur pour créer un serveur via HTTPS. Tout d'abord, créez un serveur Web à l'aide d'EC2 à partir d'AWS.

Créer un serveur EC2

  1. Connectez-vous à l'AWS Console et sélectionnez EC2 dans Services.
  2. Créez une instance. L'image de la machine Amazon doit être "Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type". Les spécifications minimales sont OK.
  3. N'oubliez pas de télécharger la paire de clés lorsque vous créez le serveur.

Connectez-vous au serveur avec Tera Term. Le nom d'utilisateur est ec2-user et aucun mot de passe n'est requis. En tant que clé RSA, spécifiez le fichier de clé téléchargé à l'étape 3. qiita0605_1.PNG

Après vous être connecté, mettons à jour le package.

sudo yum -y update

Installez Apache HTTP Server.

sudo yum -y install httpd mod_ssl
sudo service httpd start

Rendez le dossier racine d'Apache accessible à ec2-user.

sudo chown ec2-user /var/www/html/

Installation d'OpenJDK

Tout d'abord, allez sur le site OpenJDK sur votre PC et téléchargez .tar.gz pour Linux.

qiita0605_9.PNG

Téléchargez le fichier openjdk-14.0.1_linux-x64_bin.tar.gz téléchargé sur votre serveur. Vous pouvez le télécharger en le faisant glisser et en le déposant dans Tera Term.

Décompressez-le.

tar zxvf openjdk-14.0.1_linux-x64_bin.tar.gz

Créez /etc/profile.d/env.sh pour transmettre le PATH à OpenJDK.

# /etc/profile.d/env.sh
export PATH=/home/ec2-user/jdk-14.0.1/bin:$PATH

Veuillez vous reconnecter au serveur pour que le paramètre PATH s'applique.

Enregistrement DDNS

Téléchargez l'adresse du serveur sur DDNS. Dans le cas de MyDNS, vous pouvez télécharger en accédant au site avec wget. Vous devez vous inscrire pour un compte gratuit. Pour plus de détails, veuillez consulter Site MyDNS.

wget -O - 'http://mydns123456:[email protected]/login.html'

Paramètres de la liste d'accès

Les paramètres de groupe de sécurité définis par défaut dans EC2 n'autorisent que SSH. Autorisons HTTP / HTTPS.

Sélectionnez l'instance que vous avez créée dans le volet Instances et cliquez sur le lien Groupe de sécurité (tel que launch-wizard-1). Sélectionnez Modifier la règle entrante, cliquez sur Ajouter une règle et autorisez HTTP et HTTPS de n'importe où. qiita0605_2.PNG

Installez l'outil Let's Encrypt

Installez git et socat.

sudo yum -y install git socat

Installez le shell automatisé acme.sh de Let's Encrypt.

git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install

Créer un certificat

Créez un certificat avec la commande suivante. (Le nom de domaine est faux)

./acme.sh --issue -d my.domain.jp -w /var/www/html

qiita0605_3.PNG

Emballez le certificat généré au format pkcs12.

openssl pkcs12 -export -in ~/.acme.sh/my.domain.jp/my.domain.jp.cer -inkey ~/.acme.sh/my.domain.jp/my.domain.jp.key -out ~/my.domain.jp.p12

Vous serez invité à entrer le mot de passe, alors définissez le mot de passe. Assurez-vous d'enregistrer ce mot de passe car vous en aurez besoin dans vos paramètres Spring Boot.

/home/ec2-user/my.domain.jp.p12 aurait dû être créé, alors téléchargez-le. Je pense qu'il est facile d'utiliser la fonction SCP de Tera Term.

  1. Sélectionnez "Fichier" - "SSH SCP" dans Tera Term
  2. Entrez mon.domaine.jp.p12 dans De: en bas.
  3. Remplacer par: en bas, quelque chose de facile à comprendre, comme le bureau de l'utilisateur.
  4. Cliquez sur "Recevoir"

Avec ce qui précède, le fichier PKCS12 du certificat par Let's Encrypt a été créé.

Créer une application Spring Boot

Créez une application Web avec Spring Boot. Ici, le but est d'expliquer la conversion HTTPS, le site lui-même sera donc très simple.

Créer un projet

Démarrez Spring Tool Suite et sélectionnez "Fichier" - "Nouveau" - "Projet Spring Starter". qiita0605_4.PNG

Les dépendances peuvent être simplement "Spring Web".

qiita0605_5.PNG

Créez une page d'exemple.

Créez src / main / resources / static / index.html.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTTPS Sample</title>
</head>
<body>
<h1>Let's Encrypt!</h1>
</body>
</html>

Activer HTTPS

Décrivez le contenu suivant dans src / main / resources / application.properties.

server.port=443
server.ssl.key-store=my.domain.jp.p12
server.ssl.key-store-password=MyPassword
server.ssl.keyStoreType=PKCS12

Copiez le fichier my.domain.jp.p12 téléchargé depuis le serveur dans le dossier racine de votre projet.

qiita0605_6.PNG

Contrôle du fonctionnement local

Lancez l'application Spring Boot. Commencez par "Exécuter" -> "Exécuter en tant que" -> "Spring Boot App". Étant donné que le certificat a le FQDN défini dans DDNS, cet avertissement sera affiché lors de l'accès avec localhost. Si vous ignorez l'avertissement et le forcez, la page sera affichée, mais ici il suffit de voir cet avertissement.

qiita0605_7.PNG

Télécharger sur le serveur

Pour exécuter le site sur le serveur AWS, vous devez télécharger le programme créé par Spring Boot en tant que fichier jar.

Dans Spring Tool Suite, exécutez "Exécuter" -> "Exécuter en tant que" -> "Maven install".

«SampleHTTPS-0.0.1-SNAPSHOT.jar» sera créé dans le dossier «cible».

qiita0605_8.PNG

Cliquez avec le bouton droit sur le fichier → "Afficher dans" → "Explorateur système" pour ouvrir l'Explorateur, puis faites-le glisser et déposez-le dans le Tera Term.

Vous avez également besoin de ** my.domain.jp.p12 ** dans le dossier du projet (un niveau au-dessus de la cible), alors faites-le glisser et déposez-le dans Tera Term de la même manière pour le télécharger.

Lancer sur le serveur

Si Apache est en cours d'exécution sur le serveur, il s'arrêtera car le port entre en conflit avec l'application créée par Spring Boot.

sudo service httpd stop
sudo chkconfig httpd off

Démarrez le programme java. Cependant, le port 443 ne peut pas être lié par ec2-user, alors faites-le avant de l'exécuter.

sudo su
java -jar SampleHTTPS-0.0.1-SNAPSHOT.jar

qiita0605_11.PNG

Si vous pouvez le démarrer, affichons le site. La page affichée n'est que du texte, mais vous pouvez voir que la marque de verrouillage est affichée et que HTTPS est activé. Si vous regardez le certificat, vous pouvez voir que le certificat a été émis par Let's Encrypt.

qiita0605_12.PNG

qiita0605_10.PNG

Ça fait longtemps, mais c'est tout.

Site référencé

Activer SSL (HTTPS) dans Spring boot

Let's Encrypt Official https://letsencrypt.org/ja/docs/client-options/ Depuis github de acme.sh https://github.com/acmesh-official/acme.sh

Recommended Posts

HTTPS avec Spring Boot et Let's Encrypt
Télécharger avec Spring Boot
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Changer d'environnement avec Spring Boot application.properties et l'annotation @Profile
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Connectez Spring Boot et Angular en toute sécurité avec OpenAPI Generator
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Faisons une API simple avec EC2 + RDS + Spring boot ①
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules
Créez une application avec Spring Boot 2
Liaison de base de données avec doma2 (Spring boot)
Elastic Beanstalk (Java) + Spring Boot + https
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Fonction de profil Spring et application Spring Boot.
Google Cloud Platform avec Spring Boot 2.0.0
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot
À partir de Spring Boot 0. Utilisez Spring CLI
J'ai essayé Flyway avec Spring Boot
Crypter avec Java et décrypter avec C #
La coopération des messages a commencé avec Spring Boot
Développement facile d'applications Web avec STS et Spring Boot. Dans 10 minutes.
Créons une application Web de gestion de livres avec Spring Boot part3
Créons une application Web de gestion de livres avec Spring Boot part2
Comparez Hello, world! Avec Spring Boot avec Java, Kotlin et Groovy
Image de l'application Spring Boot à l'aide de jib-maven-plugin et lancez-la avec Docker
[Débutant] Essayez d'écrire l'API REST pour l'application Todo avec Spring Boot
Traitement lors du démarrage d'une application avec Spring Boot
Spring avec Kotorin --2 RestController et Data Class
Hello World avec Eclipse + Spring Boot + Maven
Envoyez des notifications régulières avec LineNotify + Spring Boot
Essayons WebSocket avec Java et javascript!