Connexion HTTPS avec Java au serveur de certificats auto-signé

C'est un contenu de niche, mais je suis vraiment dedans.

Chose que tu veux faire

"Serveur WEB" et "Application client Java" nouvellement créés. Ici, je voudrais tester la connexion HTTPS de l'application client Java au serveur WEB.

Le mur que tu dois surmonter

Lecteur supposé

Supposons que vous sachiez ce qui suit: Je n'expliquerai pas en particulier.

information sur la version

Procédure de travail

1. Délivrance du certificat de serveur

1.1. Installez openSSL

[Ici] Téléchargez le programme d'installation depuis [] et installez-le. Il semble préférable d'utiliser celui qui correspond au nombre de bits du serveur cible. La version normale / légère est acceptable. [Ici]: http://slproweb.com/products/Win32OpenSSL.html

1.2. Préparation des répertoires / fichiers

Pour plus de simplicité, nous allons créer un certificat avec les paramètres par défaut de openSSL, donc créer un répertoire / fichier fixe. Créez ce qui suit.

1.2.1. Annuaire

1.2.2. Fichier

1.3. Préparation des variables

Les éléments facultatifs sont résumés ci-dessous. Vous pouvez décider librement si nécessaire, mais il y a des restrictions qui doivent être les mêmes, donc je vais clarifier ici. (Un petit point addictif)

Nom de la variable: Description * Enfermé dans '' pour plus de clarté, mais pas réellement requis. 'cakey.pem': nom de fichier de clé privée de l'autorité de certification. 'cacert.pem': nom de fichier de clé publique de l'autorité de certification. 'capassword': mot de passe de l'autorité de certification. «ST»: nom de la région. __ Veuillez noter que vous ne pouvez signer que si l'autorité d'authentification et le serveur sont identiques! __ 'caname': le nom de l'autorité de certification. __ Veuillez noter que vous ne pouvez signer que si l'autorité d'authentification «caname» et le «servername» du serveur sont différents! __ 'sarvername': Le nom du serveur WEB. __ Veuillez noter que vous ne pouvez signer que si l'autorité d'authentification «caname» et le «servername» du serveur sont différents! __ «CN»: le nom de domaine du serveur qui crée le certificat. "localhost" et l'adresse IP sont également acceptables. '.server_keystore': nom du fichier de clés du serveur WEB. 'serverpassword': mot de passe du fichier de clés du serveur WEB 'server.crt': certificat de serveur WEB 'server.x509': certificat de serveur WEB (format X509) 'server.p12': nom du fichier d'échange d'informations personnelles

1.4. Création d'une autorité de certification privée

Créez une paire de clés privée / publique pour l'autorité de certification. La norme est X509 (même ci-dessous)

openssl req -keyout ca/'cakey.pem' -out ca/'cacert.pem' -new -x509
writing new private key to 'ca/cakey.pem'
Enter PEM pass phrase:'capassword'
Verifying - Enter PEM pass phrase:'capassword'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:'ST'
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:'caname'
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:'CN'
Email Address []:

Importez le certificat d'autorité de certification créé en tant qu '«autorité de certification racine de confiance» Java. (Le mot de passe est "changez-le")

keytool -import -file ca/'cacert.pem' -trustcacerts -alias 'caname' -keystore server/cacerts

1.5. Création d'un certificat de serveur

Créez une paire de clés de serveur. (L'algorithme de clé de chiffrement est RSA)

keytool -genkey -keyalg RSA -alias 'servername' -keystore server/'.server_keystore'
Veuillez saisir le mot de passe du fichier de clés:'serverpassword'
Veuillez saisir à nouveau votre nouveau mot de passe:'serverpassword'
Quel est votre nom et prénom?
  [Unknown]:  'CN'
Quel est le nom de l'unité organisationnelle?
  [Unknown]:
Quel est le nom de l'organisation?
  [Unknown]:  'servername'
Quel est le nom de la ville ou de la région?
  [Unknown]:
Quel est l'état ou le nom de l'état?
  [Unknown]:  'ST'
Quel est le code du pays à deux lettres pour cet appareil?
  [Unknown]:
CN=CN, OU=Unknown, O=servername, L=Unknown, ST=ST, C=Voulez-vous vraiment Inconnu?
  [Non]:Oui

<servername>Veuillez saisir votre mot de passe clé
        (Appuyez sur RETURN s'il est identique au mot de passe du fichier de clés):

Créez une demande de certificat (CSR).

keytool -certreq -alias servername -keystore server/.server_keystore -file server/server.csr
Veuillez saisir le mot de passe du fichier de clés:'serverpassword'

Signez le certificat de serveur à partir de la demande de certificat à l'aide de l'autorité de certification (créée).

openssl ca -keyfile ca/'cakey.pem' -cert ca/'cacert.pem' -in server/server.csr -out server/'server.crt'
Using configuration from C:/OpenSSL-Win64/bin/openssl.cfg
Enter pass phrase for ca/cakey.pem:'capassword'                         
Check that the request matches the signature                                   
Signature ok                                      
Certificate Details:
        Serial Number: 1 (0x1)
        Validity                                                                  
            Not Before: May 17 02:20:49 2017 GMT                                  
            Not After : May 17 02:20:49 2018 GMT                                  
        Subject:                                                                  
            countryName               = Unknown                                   
            stateOrProvinceName       = ST                                     
            localityName              = Unknown                                   
            organizationName          = servername                                
            organizationalUnitName    = Unknown                                   
            commonName                = CN                                
        X509v3 extensions:                                                        
            X509v3 Basic Constraints:                                             
                CA:FALSE                                                          
            Netscape Comment:                                                     
                OpenSSL Generated Certificate                                     
            X509v3 Subject Key Identifier:                                        
                EE:1E:F6:4B:55:BF:59:4D:B9:A0:20:F7:CE:E9:C8:F0:B3:65:05:02       
            X509v3 Authority Key Identifier:                                      
                keyid:BC:57:86:E6:B0:E0:BE:CA:2D:47:6F:93:13:DE:0B:85:01:7B:DA:67 
                                                                                  
Certificate is to be certified until May 17 02:20:49 2018 GMT (365 days)          
Sign the certificate? [y/n]:y                                                     
                                                                                  
                                                                                  
1 out of 1 certificate requests certified, commit? [y/n]y                         
Write out database with 1 new entries                                             
Data Base Updated                                                                 

Ici, si l'erreur suivante apparaît à la fin et qu'un certificat de serveur de 0 octet est créé, il s'agit d'un échec. (Point addictif)

The stateOrProvinceName field needed to be the same in the
CA certificate (ST) and the request (ST)

C'est une restriction que l'autorité de certification et le serveur doivent être dans la même zone, mais parfois l'erreur se produit même dans la même zone __ comme décrit ci-dessus. Dans ce cas, ajoutez "-policy policy_anything" et réexécutez.

openssl ca -keyfile ca/'cakey.pem' -cert ca/'cacert.pem' -in server/server.csr -out server/'server.crt' -policy policy_anything

Créez le certificat au format X509.

openssl x509 -in server/'server.crt' -out server/'server.x509'

Importez dans le magasin de clés. Tout d'abord, importez le certificat de l'autorité de certification

keytool -import -file ca/'cacert.pem' -alias 'caname' -keystore server/'.server_keystore'
Veuillez saisir le mot de passe du fichier de clés:'serverpassword'
propriétaire: CN=CN, O=caname, ST=ST, C=Unknown
Émetteur: CN=CN, O=caname, ST=ST, C=Unknown
Numéro de série: 9310226b2ad5ebe7
Date de début de validité: Fri Apr 28 20:17:20 JST 2017 date de fin: Sun May 28 20:17:20 JST 2017
Empreinte digitale du certificat:
         MD5:  48:CA:F9:A9:85:88:44:5A:56:F3:9C:3E:16:D6:14:E1
         SHA1: 0F:F1:74:E3:C8:C9:0D:7D:3B:43:E0:7D:1A:10:D5:19:5B:72:8D:69
         SHA256: D6:C4:E0:78:BA:16:AF:A8:9C:23:51:18:31:E0:38:FC:57:2F:29:9C:BB:B8:3B:F4:83:85:D2:14:98:7D:2C:64
Nom de l'algorithme de signature: SHA256withRSA
version: 3

Expansion:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: BC 57 86 E6 B0 E0 BE CA   2D 47 6F 93 13 DE 0B 85  .W......-Go.....
0010: 01 7B DA 67                                        ...g
]
]

#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BC 57 86 E6 B0 E0 BE CA   2D 47 6F 93 13 DE 0B 85  .W......-Go.....
0010: 01 7B DA 67                                        ...g
]
]

Faites-vous confiance à ce certificat?[Non]:Oui
Certificat ajouté au keystore

Ensuite, importez le certificat du serveur WEB

keytool -import -file server/'server.x509' -alias 'servername' -keystore server/'.server_keystore'
Veuillez saisir le mot de passe du fichier de clés:'serverpassword'
Certificat ajouté au keystore

Créez un certificat au format PKCS # 12 à partir du fichier de clés.

keytool -importkeystore -srckeystore server/'.server_keystore' -destkeystore server/'server.p12' -deststoretype PKCS12 -srcalias 'servername'
Veuillez saisir le mot de passe du magasin de clés de sortie:'serverpassword'
Veuillez saisir à nouveau votre nouveau mot de passe:'serverpassword'
Veuillez saisir le mot de passe du fichier de clés source:'serverpassword'

2. Définissez le certificat sur le serveur d'applications

2.1. Quoi utiliser

2.2. Modifications

application.yml


server:
  ssl:
    key-store: 'server.p12'
    key-store-password: 'serverpassword'
    keyStoreType: PKCS12
    keyAlias: tomcat

3.Faire en sorte que l'application cliente Java approuve le certificat

3.1. Quoi utiliser

3.2. Que faire

Définissez ce qui suit dans l'argument Java VM.

-Djavax.net.ssl.trustStore=(Répertoire arbitraire)/server/cacerts -Djavax.net.ssl.keyStore=(Répertoire arbitraire)/server/'server.p12' -Djavax.net.ssl.keyStorePassword='serverpassword'

Vous devriez maintenant être en mesure de communiquer HTTPS depuis votre application client Java vers votre serveur WEB.

À la fin

C'était long, mais la procédure de création d'un certificat de serveur est générale. La méthode de réglage des informations d'autorité d'authentification racine approuvées par Java est un peu irrégulière, et je pense que ce sera un travail limité au moment du développement. C'est une tâche simple qui ne nécessite que quelques clics avec un navigateur. .. Si possible, je pense qu'il est plus facile de créer un certificat légitime au lieu d'un certificat auto-signé pendant le développement.

Recommended Posts

Connexion HTTPS avec Java au serveur de certificats auto-signé
[Template] Connexion MySQL avec Java
Java pour jouer avec Function
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Vérifiez la connexion https avec Java
Entrée dans la console Java
[Java] Modifier le traitement en fonction de la situation avec le modèle de stratégie
Assurez-vous de comparer le résultat Java compareTo avec 0
Que ce soit pour faire du côté serveur au moment de la reconstruction du système avec Kotlin ou Java
Créez un serveur Web simple avec la bibliothèque standard Java com.sun.net.httpserver
Java pour apprendre avec les ramen [Partie 1]
[java8] Pour comprendre l'API Stream
[Java] Points à noter avec Arrays.asList ()
Je veux revenir à l'écran précédent avec kotlin et java!
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
Osez défier Kaggle avec Java (1)
Connexion à une base de données avec Java (partie 1) Peut-être la méthode de base
Suivez le lien avec Selenium (Java)
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
Connexion HTTPS utilisant tls1.2 dans Java 6
Connectez-vous au serveur Rails avec iPhone
Traitement serveur avec Java (Introduction partie 1)
[Java] Je veux effectuer distinctement avec la clé dans l'objet
La route de JavaScript à Java
Java, des tableaux pour débuter avec les débutants
Comment interagir avec un serveur qui ne plante pas l'application
[Java] Comment récupérer les paramètres passés du html côté serveur
Comment vérifier avant d'envoyer un message au serveur avec Spring Integration
Comment compiler Java avec VsCode & Ant
Référence Java à comprendre dans la figure
Java SE8 Silver ~ La route à franchir ~
Kick ShellScript sur le serveur depuis Java
À propos de la procédure pour que Java fonctionne
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
[Java] Comment utiliser la méthode toString ()
Etudier comment utiliser le constructeur (java)
[Traitement × Java] Comment utiliser la boucle
[Java] Connexion avec la base de données locale (IntelliJ + SpringBoot)
[Java] Comment régler la date sur 00:00:00
[Java] Comment obtenir le répertoire actuel
[Traitement × Java] Comment utiliser la classe
Comment obtenir la date avec Java
Sortie du livre "Introduction à Java"
[Traitement × Java] Comment utiliser la fonction
Je suis allé au Java Women's Club # 1
[Java] Colorez la sortie standard vers le terminal
[Java] Comment utiliser la classe Calendar
Facile à parcourir avec les expressions régulières Java
Essayez d'utiliser la télécommande Wii en Java
[Java] Obtenez la date avec la classe LocalDateTime
Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
Essayez de vous connecter à la base de données autonome avec JDK6 (Java) + pilote JDBC OCI (type 2).
Comment déployer un système réalisé avec Java (démarrage Wicket-Spring) sur le serveur du campus
Initialiser le tableau Ruby avec 0 comme Java, c'est-à-dire définir la valeur par défaut sur 0
[Java] J'ai essayé de me connecter en utilisant le pool de connexion avec Servlet (tomcat) & MySQL & Java