HTTPS-Verbindung mit Java zum selbstsignierten Zertifikatsserver

Es ist ein Nischeninhalt, aber ich bin wirklich begeistert.

Was du machen willst

Neu erstellte "WEB-Server" und "Java-Client-Anwendung". Hier möchte ich die HTTPS-Verbindung von der Java-Client-Anwendung zum WEB-Server testen.

Die Mauer muss man überwinden

Angenommener Leser

Angenommen, Sie wissen Folgendes: Ich werde nicht besonders erklären.

Versionsinformation

Arbeitsablauf

1. Ausstellung des Serverzertifikats

1.1. Installieren Sie openSSL

[Hier] Laden Sie das Installationsprogramm von [] herunter und installieren Sie es. Es scheint besser, das zu verwenden, das der Anzahl der Bits des Zielservers entspricht. Jede normale / leichte Version ist akzeptabel. [Hier]: http://slproweb.com/products/Win32OpenSSL.html

1.2 Verzeichnis- / Dateivorbereitung

Der Einfachheit halber erstellen wir ein Zertifikat mit den Standardeinstellungen von openSSL. Erstellen Sie daher ein festes Verzeichnis / eine feste Datei. Erstellen Sie Folgendes.

1.2.1. Verzeichnis

1.2.2. Datei

1.3 Variable Vorbereitung

Die optionalen Elemente sind unten zusammengefasst. Sie können nach Bedarf frei entscheiden, aber es gibt Einschränkungen, die gleich sein müssen, daher werde ich hier näher darauf eingehen. (Ein kleiner süchtig machender Punkt)

Variablenname: Beschreibung * Aus Gründen der Übersichtlichkeit in '' eingeschlossen, aber nicht erforderlich. 'cakey.pem': Der Dateiname des privaten Schlüssels der Zertifizierungsstelle. 'cacert.pem': Der Dateiname des öffentlichen Schlüssels der Zertifizierungsstelle. 'capassword': Passwort der Zertifizierungsstelle. 'ST': Regionsname. __ Bitte beachten Sie, dass Sie nur unterschreiben können, wenn die Authentifizierungsstelle und der Server identisch sind! __ __ 'caname': Der Name der Zertifizierungsstelle. __ Bitte beachten Sie, dass Sie nur unterschreiben können, wenn die Authentifizierungsstelle 'caname'und der Servername des Servers' unterschiedlich sind! __ 'sarvername': Der Name des WEB-Servers. __ Bitte beachten Sie, dass Sie nur unterschreiben können, wenn die Authentifizierungsstelle 'caname'und der Servername des Servers' unterschiedlich sind! __ 'CN': Der Domänenname des Servers, für den Sie ein Zertifikat erstellen möchten. "localhost" und IP-Adresse sind ebenfalls akzeptabel. '.server_keystore': Name des WEB-Server-Keystores. 'serverpassword': WEB-Server-Keystore-Passwort 'server.crt': WEB-Serverzertifikat 'server.x509': WEB-Serverzertifikat (X509-Format) 'server.p12': Name der Datei zum Austausch persönlicher Informationen

1.4. Schaffung einer privaten Zertifizierungsstelle

Erstellen Sie ein privates / öffentliches Schlüsselpaar für die Zertifizierungsstelle. Der Standard ist X509 (wie unten)

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 []:

Importieren Sie das erstellte Zertifizierungsstellenzertifikat als Java "Trusted Root Certification Authority". (Passwort ist "ändere es")

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

1.5. Erstellen eines Serverzertifikats

Erstellen Sie ein Serverschlüsselpaar. (Der Verschlüsselungsschlüssel-Algorithmus ist RSA)

keytool -genkey -keyalg RSA -alias 'servername' -keystore server/'.server_keystore'
Bitte geben Sie das Keystore-Passwort ein:'serverpassword'
Bitte geben Sie Ihr neues Passwort erneut ein:'serverpassword'
Wie lautet Ihr Vor- und Nachname?
  [Unknown]:  'CN'
Wie lautet der Name der Organisationseinheit?
  [Unknown]:
Wie lautet der Name der Organisation?
  [Unknown]:  'servername'
Wie heißt die Stadt oder Region?
  [Unknown]:
Wie lautet der Staat oder der Name des Staates?
  [Unknown]:  'ST'
Wie lautet der aus zwei Buchstaben bestehende Ländercode für dieses Gerät?
  [Unknown]:
CN=CN, OU=Unknown, O=servername, L=Unknown, ST=ST, C=Bist du sicher, dass du Unbekannt willst?
  [Nein]:Ja

<servername>Bitte geben Sie Ihr Schlüsselpasswort ein
        (Drücken Sie RETURN, wenn es mit dem Keystore-Passwort übereinstimmt):

Erstellen Sie eine Zertifikatsanforderung (Certificate Request, CSR).

keytool -certreq -alias servername -keystore server/.server_keystore -file server/server.csr
Bitte geben Sie das Keystore-Passwort ein:'serverpassword'

Signieren Sie das Serverzertifikat von der Zertifikatanforderung mit der (erstellten) Zertifizierungsstelle.

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                                                                 

Wenn am Ende der folgende Fehler auftritt und ein 0-Byte-Serverzertifikat erstellt wird, liegt ein Fehler vor. (Suchtpunkt)

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

Es ist eine Einschränkung, dass sich die Zertifizierungsstelle und der Server im selben Bereich befinden müssen, aber manchmal tritt der Fehler sogar im selben Bereich auf __ wie oben beschrieben. Fügen Sie in diesem Fall "-policy policy_anything" hinzu und führen Sie es erneut aus.

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

Erstellen Sie das Zertifikat im X509-Format.

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

In den Schlüsselspeicher importieren. Importieren Sie zunächst das Zertifikat der Zertifizierungsstelle

keytool -import -file ca/'cacert.pem' -alias 'caname' -keystore server/'.server_keystore'
Bitte geben Sie das Keystore-Passwort ein:'serverpassword'
Inhaber: CN=CN, O=caname, ST=ST, C=Unknown
Der Emittent: CN=CN, O=caname, ST=ST, C=Unknown
Ordnungsnummer: 9310226b2ad5ebe7
Gültigkeitsbeginn: Fri Apr 28 20:17:20 JST 2017 Enddatum: Sun May 28 20:17:20 JST 2017
Zertifikat Fingerabdruck:
         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
Name des Signaturalgorithmus: SHA256withRSA
Ausführung: 3

Erweiterung:

#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
]
]

Vertrauen Sie diesem Zertifikat?[Nein]:Ja
Zertifikat zum Keystore hinzugefügt

Importieren Sie als Nächstes das Zertifikat des WEB-Servers

keytool -import -file server/'server.x509' -alias 'servername' -keystore server/'.server_keystore'
Bitte geben Sie das Keystore-Passwort ein:'serverpassword'
Zertifikat zum Keystore hinzugefügt

Erstellen Sie ein Zertifikat im PKCS # 12-Format aus dem Keystore.

keytool -importkeystore -srckeystore server/'.server_keystore' -destkeystore server/'server.p12' -deststoretype PKCS12 -srcalias 'servername'
Bitte geben Sie das Passwort des Ausgabeschlüsselspeichers ein:'serverpassword'
Bitte geben Sie Ihr neues Passwort erneut ein:'serverpassword'
Bitte geben Sie das Passwort für den Quell-Keystore ein:'serverpassword'

2. Legen Sie das Zertifikat auf dem Anwendungsserver fest

2.1 Was zu verwenden ist

2.2 Änderungen

application.yml


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

3. Lassen Sie die Java-Client-App dem Zertifikat vertrauen

3.1. Was zu verwenden ist

3.2 Was ist zu tun?

Legen Sie im Java VM-Argument Folgendes fest.

-Djavax.net.ssl.trustStore=(Beliebiges Verzeichnis)/server/cacerts -Djavax.net.ssl.keyStore=(Beliebiges Verzeichnis)/server/'server.p12' -Djavax.net.ssl.keyStorePassword='serverpassword'

Sie sollten nun in der Lage sein, HTTPS von Ihrer Java-Client-App an Ihren WEB-Server zu kommunizieren.

Am Ende

Es war eine lange Zeit, aber das Verfahren zum Erstellen eines Serverzertifikats ist allgemein. Die Methode zum Festlegen der von Java vertrauenswürdigen Informationen der Stammauthentifizierungsbehörde ist etwas unregelmäßig, und ich denke, dass dies zum Zeitpunkt der Entwicklung nur eine begrenzte Arbeit sein wird. Es ist eine einfache Aufgabe, die mit einem Browser nur wenige Klicks erfordert. .. Wenn möglich, ist es meiner Meinung nach einfacher, während der Entwicklung ein legitimes Zertifikat anstelle eines selbstsignierten Zertifikats zu erstellen.

Recommended Posts

HTTPS-Verbindung mit Java zum selbstsignierten Zertifikatsserver
[Vorlage] MySQL-Verbindung mit Java
Java zum Spielen mit Function
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Überprüfen Sie die https-Verbindung mit Java
Eingabe in die Java-Konsole
[Java] Ändern Sie die Verarbeitung entsprechend der Situation mit dem Strategiemuster
Stellen Sie sicher, dass Sie das Java compareTo-Ergebnis mit 0 vergleichen
Gibt an, ob die Serverseite zum Zeitpunkt der Systemwiederherstellung mit Kotlin oder Java erstellt werden soll
Erstellen Sie einen einfachen Webserver mit der Java-Standardbibliothek com.sun.net.httpserver
Java mit Ramen lernen [Teil 1]
[java8] Um die Stream-API zu verstehen
[Java] Mit Arrays.asList () zu beachtende Punkte
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Wagen Sie es, Kaggle mit Java herauszufordern (1)
Herstellen einer Verbindung zu einer Datenbank mit Java (Teil 1) Möglicherweise die grundlegende Methode
Folgen Sie dem Link mit Selen (Java)
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
HTTPS-Verbindung mit tls1.2 in Java 6
Stellen Sie mit dem iPhone eine Verbindung zum Rails-Server her
Serververarbeitung mit Java (Einführung Teil.1)
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Der Weg von JavaScript nach Java
Java, Arrays für Anfänger
So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt
[Java] So rufen Sie die von HTML auf der Serverseite übergebenen Parameter ab
So überprüfen Sie, bevor Sie mit Spring Integration eine Nachricht an den Server senden
So kompilieren Sie Java mit VsCode & Ant
Java-Referenz zum Verständnis in der Abbildung
Java SE8 Silber ~ Der Weg zum Pass ~
Kick ShellScript auf dem Server von Java
Über das Verfahren, damit Java funktioniert
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
[Java] Verbindung mit lokaler Datenbank (IntelliJ + SpringBoot)
[Java] So stellen Sie die Datums- und Uhrzeit auf 00:00:00 ein
[Java] So erhalten Sie das aktuelle Verzeichnis
[Verarbeitung × Java] Verwendung der Klasse
So erhalten Sie das Datum mit Java
Ausgabe des Buches "Einführung in Java"
[Verarbeitung × Java] Verwendung der Funktion
Ich ging zum Java Women's Club # 1
[Java] Färben Sie die Standardausgabe an das Terminal
[Java] Verwendung der Calendar-Klasse
Einfach mit regulären Java-Ausdrücken zu stolpern
Versuchen Sie es mit der Wii-Fernbedienung in Java
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
Versuchen Sie, mit JDK6 (Java) + JDBC OCI-Treiber (Typ 2) eine Verbindung zur autonomen Datenbank herzustellen.
So stellen Sie ein mit Java erstelltes System (Wicket-Spring-Boot) auf dem Campus-Server bereit
Initialisieren Sie das Ruby-Array mit 0 für Java, dh setzen Sie den Standardwert auf 0
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen