Generieren SSL-Zertifikat mithilfe von keytool in jdk
Keystore-Dateien die ich verwendet habe in meiner web-Anwendung abgelaufen Letzte Woche. Generiert ich es vor langer Zeit. So begann ich generieren neues Zertifikat mithilfe von keytool. Ich habe dieses Zertifikat zu verbinden transaction server und web-server. Ich wollte selbst signiertes Zertifikat für diese Anwendung. Ich generieren Sie mit dem folgenden Befehl zum generieren self-signed key for transaction server.
keytool -genkey -keystore keys/SvrKeyStore -keyalg rsa -validity 365 -alias Svr -storepass 123456 -keypass abcdefg -dname "CN=One1, OU=Development1, O=One, L=Bamba, S=Western Prov1, C=S1"
folgenden commnad zu generieren keystore für die web-Anwendung
keytool -genkey -keystore keys/ClientKeyStore -keyalg rsa -validity 365 -alias Web -storepass 123456 -keypass abcdefg -dname "CN=One, OU=Development, O=One, L=Bamba, S=Western Prov, C=SL"
Benutzte ich folgenden code in die Transaktion-server die socket-Verbindung
String KEYSTORE = Config.KEYSTORE_FILE;//SvrKeyStore keystore file
char[] KEYSTOREPW = "123456".toCharArray();
char[] KEYPW = "abcdefg".toCharArray();
com.sun.net.ssl.TrustManagerFactory tmf;
boolean requireClientAuthentication;
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.
Provider());
java.security.KeyStore keystore = java.security.KeyStore.getInstance(
"JKS");
keystore.load(new FileInputStream(KEYSTORE), KEYSTOREPW);
com.sun.net.ssl.KeyManagerFactory kmf = com.sun.net.ssl.
KeyManagerFactory.getInstance("SunX509");
kmf.init(keystore, KEYPW);
com.sun.net.ssl.SSLContext sslc = com.sun.net.ssl.SSLContext.
getInstance("SSLv3");
tmf = com.sun.net.ssl.TrustManagerFactory.getInstance("sunx509");
tmf.init(keystore);
sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLServerSocketFactory ssf = sslc.getServerSocketFactory();
SSLServerSocket ssocket = (SSLServerSocket) ssf.createServerSocket(port);
ssocket.setNeedClientAuth(true);
Aber es gibt folgende Ausnahme, wenn ich es in meiner Anwendung, und versuchen, eine Verbindung zum Transaktions-server durch web-server
javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHands
hakeException: java.security.cert.CertificateException: Untrusted Server Certifi
cate Chain
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.jav
a:1172)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:
65)
at net.schubart.fixme.internal.MessageInput.readExactly(MessageInput.jav
a:166)
at net.schubart.fixme.internal.MessageInput.readMessage(MessageInput.jav
a:78)
at cc.aot.itsWeb.ClientWriterThread.run(ClientWriterThread.java:241)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateEx
ception: Untrusted Server Certificate Chain
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1
520)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:182)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:176)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Clien
tHandshaker.java:975)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHa
ndshaker.java:123)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:5
11)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.jav
a:449)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.j
ava:817)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SS
LSocketImpl.java:1029)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.
java:621)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.ja
va:59)
at java.io.OutputStream.write(OutputStream.java:58)
Bitte kann einer mir sagen, wo ist das problem
InformationsquelleAutor nath | 2010-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, vermeiden Sie die Verwendung der
com.sun.net.ssl
Pakete und Klassen direkt. Die Architektur der JSSE ist so gebaut, dass Sie verwenden können, die Fabriken und die Anbieter angeben später. Verwendenjavax.net.ssl.TrustManagerFactory
(gleich fürKeyManagerFactory
undSSLContext
) statt. (Ich würde vorschlagen, mit"PKIX"
statt"SunX509"
für die trust-manager-Algorithmus, wie es normalerweise der default-mit der Sonne-Anbieter, oder besser, verwenden SieTrustManagerFactory.getDefaultAlgorithm()
).Zweitens, die Sie nicht benötigen, um eine keymanager, der auf der client-Seite, es sei denn, Sie sind mit client-Zertifikat-Authentifizierung.
Schließlich (und vielleicht auch die wichtigste), die Sie benötigen, exportieren Sie das selbstsignierte Zertifikat, das Sie erstellt haben, auf der server-Seite (nur das Zertifikat, nicht den privaten Schlüssel) und importieren Sie Sie in die keystore als truststore auf der client-Seite.
Wenn Sie das Zertifikat generieren, sollten Sie sicherstellen, dass Sie mit
CN=the.server.host.name
.Wenn Sie möchten, verwenden Sie die client-Zertifikat-Authentifizierung, müssen Sie wiederholen Sie den Vorgang, durch den Ersatz-server-keystore-und client-truststore mit den client-keystore und die server-truststore-bzw.
In diesem Fall
server-keystore.jks
undserver-truststore.jks
könnte die gleiche Datei, aber Sie brauchen nicht zu (ebenso auf der client-Seite).InformationsquelleAutor Bruno
Alles, was Sie tun musste, war keytool -selfcert - alias XXX -Gültigkeit DDD wobei XXX für die gleiche alias wie vor und DDD ist die Anzahl der Tage vor Ablauf, für die server-cert, dann exportieren Sie das Zertifikat und den import in den client-truststore. Wiederholen Sie in umgekehrter client. Haben Sie Links aus der export - /import-Teil.
Jedoch viel code ist jetzt veraltet. Sie brauchen nicht zu rufen addProvider(), und Sie können ändern, com.Sonne.net.ssl, javax.net.ssl den ganzen Rest.
InformationsquelleAutor user207421
Dies zu verstehen, müssen Sie verstehen, wie Zertifikate funktionieren.
Da jeder kann ein Zertifikat erstellen (wie du hast), ist es nicht genug, nur um es zu schaffen - Zertifikate Vertrauen. Ein Zertifikat wird nur vertraut, wenn es unterzeichnet ist, durch ein anderes Zertifikat, das als vertrauenswürdig gilt.
Auf der Oberseite des Vertrauen "Nahrungskette" es gibt mehrere große CAs, an wen Sie zahlen Geld, um Ihr Zertifikat "öffentlich Vertrauenswürdige" (Ihr computer kommt mit Ihrem Zertifikat installiert ist).
Natürlich Sie müssen nicht zu zahlen, um eine ZERTIFIZIERUNGSSTELLE, um Ihre Anwendung, ABER Sie haben, um dieses Verhalten nachzuahmen. Was Sie wahrscheinlich tun müssen, ist exportieren Sie das client - /server-public-key, und installieren Sie Sie in einer Art von trusted Shop.
Prüfen Sie, wie Ihre API können Sie definieren, wo Ihre vertrauenswürdigen Zertifikate.
InformationsquelleAutor Hila