Java: comment ajouter une authentification SSL côté client
J'ai ce code pour se connecter au serveur avec un client à l'aide de SSL, et maintenant je veux ajouter l'authentification côté client:
(J'ai un serveur de fichier de clés (JCEKS type) et un client du magasin de clés (JKS), le serveur utilise un truststore (cacerts) où j'ai importé les deux certificats, car je veux aussi utiliser cette truststore pour l'authentification du client)
Code Client:
System.setProperty("javax.net.ssl.trustStore", cerServer);
System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", port);
Code Serveur:
KeyStore ks = LoadKeyStore(new File(serverKeyStore), pwdKeyStore, "JCEKS");
KeyManagerFactory kmf;
kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, pwdKeyStore.toCharArray());
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(kmf.getKeyManagers(),null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
sslserversocket = (SSLServerSocket) ssf.createServerSocket(port);
merci d'avance pour toute aide.
edit:
J'ai ajouter ce code dans le côté serveur:
System.setProperty("javax.net.ssl.trustStore", cacerts);
System.setProperty("javax.net.ssl.trustStoreType","JKS");
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);
mais si je supprime le certificat du client dans le fichier cacerts, la connexion ne me donne pas d'erreur et que je pense que c'est le problème de cette façon
source d'informationauteur naxo
Vous devez vous connecter pour publier un commentaire.
Si vous voulez que votre système pour utiliser le client-l'authentification par certificat, vous aurez besoin
le serveur pour demander (ou besoin) d'un certificat client. Ceci est fait en mettant
setWantClientAuth(true)
sur le serveur de socket (ousetNeedClientAuth
respectivement). Vous aurez également besoin de serveur pour faire la publicité de l'autorité de certification, il accepte, qui est normalement effectué à l'aide d'un truststore sur le serveur qui contient le CA par lequel le client-la chaîne de certificat a été émis (ce qui semble être ce que vous avez fait par la mise enjavax.net.ssl.trustStore*
sur le serveur).le client doit être configuré avec un fichier de clés contenant le certificat du client (possible de la chaîne si il y a des CAs intermédiaires) et de sa clé privée. Cela peut être fait par le réglage de la
javax.net.ssl.keyStore*
(qui peut influer sur les autres connexions) ou à l'aide d'unKeyManagerFactory
de la même manière que vous l'avez fait sur le côté serveur.Si vous utilisez
setWantClientAuth(true)
vous pouvez toujours pas obtenir une erreur, étant donné que le serveur accepte des connexions qui n'ont pas de certificat client (le serveur, puis de vérifier laSSLSession
's par les pairs des certificats pour voir si il y avait un cert ou pas).setNeedClientAuth(true)
permettrait de rompre la connexion lorsque le client ne présente pas un certificat.