Générer un Certificat SSL à l'aide de keytool fournir dans le jdk
Keystore fichiers que j'ai utilisé dans mon application web a expiré la semaine dernière. J'ai généré depuis longtemps. J'ai donc commencé à générer un nouveau certificat à l'aide de keytool. J'ai utilisé ce certificat pour se connecter un serveur de transaction et le serveur web. Je voulais utiliser un certificat auto-signé pour cette application. Je générer en utilisant la commande suivante pour générer des auto-signé clé pour le serveur de transaction.
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"
suivantes commnad pour générer des fichier de clés pour les applications web
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"
J'ai utilisé le code suivant dans la transaction de serveur pour créer la connexion de socket
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);
Mais il donne exception suivante lorsque je l'ai utilisé dans mon application et essayez de vous connecter au serveur de transaction par le biais du serveur web
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)
S'il vous plaît peut-on me dire où est le problème
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, évitez d'utiliser le
com.sun.net.ssl
les packages et les classes directement. L'architecture de la JSSE est construit de sorte que vous pouvez utiliser dans les usines et spécifier les fournisseurs plus tard. Utilisationjavax.net.ssl.TrustManagerFactory
(même pourKeyManagerFactory
etSSLContext
) à la place. (Je vous conseille d'utiliser"PKIX"
au lieu de"SunX509"
pour la fiducie, le gestionnaire de l'algorithme, comme c'est normalement le défaut avec le Soleil fournisseur, ou mieux, utiliserTrustManagerFactory.getDefaultAlgorithm()
).Deuxièmement, vous n'avez pas besoin de configurer un keymanager sur le côté client, sauf si vous utilisez le client de l'authentification par certificat.
Enfin (et peut-être le plus important), vous devez exporter le certificat auto-signé que vous avez généré sur le serveur (uniquement le certificat, pas de la clé privée) et de l'importer dans le fichier de clés que vous utilisez comme un magasin de confiance sur le côté client.
Au moment de générer le certificat, vous devez vous assurer que vous utilisez
CN=the.server.host.name
.Si vous souhaitez utiliser le client-l'authentification par certificat, vous devez répéter l'opération en remplaçant serveur-keystore et le client truststore avec le client-keystore et le serveur-truststore respectivement.
Dans ce cas,
server-keystore.jks
etserver-truststore.jks
pourrait être le même fichier, mais vous n'avez pas besoin d' (même sur le côté client).Tous vous avez besoin à faire était de keytool -selfcert - alias XXX -validité DDD où XXX est le même alias comme avant et le DDD est le nombre de jours avant l'expiration, pour le serveur cert, puis exportez-les cert et l'importation dans le client truststore. Répétez l'opération en sens inverse pour le client. Vous avez laissé de côté l'exportation/importation de la partie.
Toutefois que le code est maintenant obsolète. Vous n'avez pas besoin d'appeler addProvider(), et vous pouvez changer com.soleil.net.ssl pour javax.net.ssl dans tout le reste.
De comprendre ce que vous avez à comprendre la façon dont les certificats de travail.
Puisque n'importe qui peut créer un certificat (comme vous l'avez fait), il ne suffit pas de créer des certificats de confiance. Un certificat est approuvé que s'il est signé par un autre certificat, qui est digne de confiance.
Sur le haut de la confiance "chaîne alimentaire" plusieurs CAs, à qui vous pouvez verser de l'argent pour avoir votre certificat public "de confiance" (votre ordinateur est livré avec leurs certificats installés).
Bien sûr, vous n'avez pas à payer pour un CA de l'ordre dans votre application, MAIS vous devez imiter ce comportement. Ce que vous aurez probablement à faire est d'exporter le client/serveur de clé publique, et de l'installer dans une sorte de magasin de confiance.
Vérifier comment votre API permet de définir l'emplacement de votre confiance certificats sont.