Java SSL code throwing NoSuchAlgorithException -



Java SSL code throwing NoSuchAlgorithException -

i'm working on project want add together ssl to, created simple client/server test implementation see if worked , nosuchalgorithmexception. next server code throwing exception:

import java.io.*; import java.net.*; import java.security.keymanagementexception; import java.security.keystore; import java.security.keystoreexception; import java.security.nosuchalgorithmexception; import java.security.securerandom; import java.security.unrecoverablekeyexception; import java.security.cert.certificateexception; import javax.net.ssl.*; public class sslserver { private static final int port = 5555; public static void main(string[] args) { securerandom sr = new securerandom(); sr.nextint(); seek { //client.public keystore file holds client's public key (created keytool) keystore clientkeystore = keystore.getinstance("jks"); clientkeystore.load(new fileinputstream("client.public"), "clientpublicpw".tochararray()); //server.private key pair server (created keytool) keystore serverkeystore = keystore.getinstance("jks"); clientkeystore.load(new fileinputstream("server.private"), "serverprivatepw".tochararray()); trustmanagerfactory tmf = trustmanagerfactory.getinstance("sunx509"); tmf.init(clientkeystore); //this next line exception occurs keymanagerfactory kmf = keymanagerfactory.getinstance("tls"); kmf.init(serverkeystore, "serverprivatepw".tochararray()); sslcontext sslcontext = sslcontext.getinstance("tls"); sslcontext.init(kmf.getkeymanagers(), tmf.gettrustmanagers(), sr); sslserversocketfactory sf = sslcontext.getserversocketfactory(); sslserversocket ss = (sslserversocket)sf.createserversocket(sslserver.port); ss.setneedclientauth(true); bufferedreader in = new bufferedreader(new inputstreamreader(ss.accept().getinputstream())); string line = null; while((line = in.readline()) != null) { system.out.println(line); } in.close(); ss.close(); } grab (ioexception e) { e.printstacktrace(); } grab (nosuchalgorithmexception e) { e.printstacktrace(); } grab (certificateexception e) { e.printstacktrace(); } grab (keystoreexception e) { e.printstacktrace(); } grab (unrecoverablekeyexception e) { e.printstacktrace(); } grab (keymanagementexception e) { e.printstacktrace(); } } }

the stacktrace is:

java.security.nosuchalgorithmexception: tls keymanagerfactory not available @ sun.security.jca.getinstance.getinstance(unknown source) @ javax.net.ssl.keymanagerfactory.getinstance(unknown source) @ sslserver.main(sslserver.java:32)

i tried replacing "tls" "ssl" , still got same exception. didn't create sense me. how can tls , ssl not supported? first time trying implement ssl , seems hard find resources code examples explained. can tell me why getting exception or point out wrong code?

there number of problems:

it's called tls (transport layer security), not tsl (for sslcontext). i'd suggest using default here: trustmanagerfactory tmf = trustmanagerfactory.getinstance(trustmanagerfactory.getdefaultalgorithm()) (the default pkix on oracle jre`) (edit:) default keymanagerfactory sunx509 (tls doesn't exist here). again, utilize getdefaultalgorithm(). you should close fileinputstream 1 time you've read them. it's not clear why have both client , server keystore @ same place. these should 2 programs: 1 client , server (and setneedclientauth(true) useful on server side). clearer phone call else "client store" if it's keystore. (in addition, since seem learning how create work, i'd suggest trying without client-certificate authentication first, in case, server won't need truststore: utilize null sec parameter of sslcontext.init(...) utilize default value.) do not give server keystore client. export certificate new keystore utilize trust store. each entity (client , server) should maintain own private keys private. it's not much public key (only) of remote party want in trust-store: it's going certificate. create sure haven't imported public key, entire certificate. for clarify, maintain appropriate extensions files: utilize .jks jks keystore, save headaches later. you can utilize null securerandom in sslcontext.init(...): utilize default value according security provider.

something should work better:

keystore truststore = keystore.getinstance("jks"); inputstream tsis = new fileinputstream("trustedcerts.jks"); truststore.load(tsis, "clientpublicpw".tochararray()); tsis.close(); keystore serverkeystore = keystore.getinstance("jks"); inputstream ksis = new fileinputstream("server.jks"); clientkeystore.load(ksis.close(), "serverprivatepw".tochararray()); ksis.close(); trustmanagerfactory tmf = trustmanagerfactory.getinstance(trustmanagerfactory.getdefaultalgorithm()); tmf.init(truststore); keymanagerfactory kmf = keymanagerfactory.getinstance(keymanagerfactory.getdefaultalgorithm()); kmf.init(serverkeystore, "serverprivatepw".tochararray()); sslcontext sslcontext = sslcontext.getinstance("tls"); sslcontext.init(kmf.getkeymanagers(), tmf.gettrustmanagers(), null); sslserversocketfactory sf = sslcontext.getserversocketfactory(); sslserversocket ss = (sslserversocket)sf.createserversocket(sslserver.port); ss.setneedclientauth(true);

java ssl

Comments

Popular posts from this blog

How do I check if an insert was successful with MySQLdb in Python? -

delphi - blogger via idHTTP : error 400 bad request -

postgresql - ERROR: operator is not unique: unknown + unknown -