2016-03-23 7 views
0

Ich möchte SSL-Verbindung erstellen. Ich habe Keystore erstellt. und versuche, x509 zu verwenden.java.security.NoSuchAlgorithmException: X509 KeyManagerFactory nicht verfügbar

final KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509"); 

aber ich bekomme unter Ausnahme auf Konsole nach dem Ausführen.

java.security.NoSuchAlgorithmException: X509 KeyManagerFactory nicht verfügbar bei sun.security.jca.GetInstance.getInstance (Unknown Source) bei javax.net.ssl.KeyManagerFactory.getInstance (Unknown Source) SSL-Kontext sc = SSL-Kontext .getInstance (Verbindungstyp); letzte char [] keyPassPhrase = "changeit" .toCharArray(); // String [] array = Security.getProviders(); abschließender KeyStore ks = KeyStore.getInstance ("jks");

 ks.load(new FileInputStream("ClientKeyStore"), keyPassPhrase); 
     provider(); 
     final KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509"); // this line is problem 

     // SunX509 : supporting only: [TLSv1, TLSv1.1, TLSv1.2] 
     kmf.init(ks, keyPassPhrase); 

     sc.init(kmf.getKeyManagers(), new TrustManager[] { 
       new X509TrustManager(){ 
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
         return null; 
        } 
        @Override 
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) 
          throws CertificateException { 

        } 
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) 
          throws CertificateException { 
        } 
       } 
     },new SecureRandom()); 
     SSLSocketFactory factory = sc.getSocketFactory(); 
     SSLSocket socket=null; 
     try{ 
      //socket = (SSLSocket) factory.createSocket("XXXX",xxxx);/ 
      socket = (SSLSocket) factory.createSocket(ipAddress, Integer.parseInt(ports[portIndex])); 

      //convert to array 
      String[] cipherSelectedArray; 
      if(isSupported == 1) { 
       cipherSelectedArray = new String[] {msupportedcipherList.get(cipherIndex).trim()}; 
      } 
      else { 
       cipherSelectedArray = new String[] {mnotSupportedcipherList.get(cipherIndex).trim()}; 
      } 

      String []mselectedSSLOrTLSVersionArrray = new String[] {mselectedSSLOrTLSVersion}; // if passing these --> getting connection timeout 

      socket.setEnabledProtocols(mselectedSSLOrTLSVersionArrray); 
      socket.setEnabledCipherSuites(cipherSelectedArray); 
      for(int i = 0; i<cipherSelectedArray.length ; i++) { 
       //System.out.println("ciphers are :" + cipherSelectedArray[i]); 
      } 


      socket.setSoTimeout(15000); 

      socket.addHandshakeCompletedListener(new HandshakeCompletedListener() { 

       @Override 
       public void handshakeCompleted(HandshakeCompletedEvent event) { 
        ////System.out.println("completed"); 

       } 
      }); 



      socket.startHandshake(); //handshake           as "SunX509" does not support SSL. I need to create above one. Can someone help. And also with "SunX509" i am getting            java.lang.IllegalArgumentException: Cannot support TLS_RSA_WITH_AES_256_CBC_SHA with currently installed providers problem with some ciphers. please help 

Antwort

2

Lesen Sie, was die Stack-Trace Sie sagt:

java.security.NoSuchAlgorithmException: X509 KeyManagerFactory nicht verfügbar

Der X509 Algorithmus ist vom Sicherheitsanbieter nicht verfügbar du benutzt. Allerdings sollte der folgende Code für Sie arbeiten:

final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 

Bitte werfen Sie einen Blick auf diese Code Ranch article, die Ihr Problem diskutiert und zeigt auch, wie um herauszufinden, welche Sicherheitsalgorithmen von Ihrem Provider zur Verfügung stehen.

+0

Danke für die Antwort. Ich habe den obigen Code bereits verwendet, wie Sie vorgeschlagen haben. Aber SunX509 unterstützt SSl nicht. Es unterstützt nur TLSv1, v2, v3. Was ich verwenden muss, wenn ich mit SSL erstellen möchte. bitte vorschlagen. Ein weiteres Problem, wenn ich SunX509 verwende, gibt es mir Ausnahme. z.B. Kann TLS_DH_anon_WITH_AES_256_CBC_SHA mit aktuell installierten Providern nicht unterstützen: was muss ich in diesem Fall tun. – sudhanshu

4

Der von Ihnen verwendete Parameter X509 wird vom Algorithmusanbieter nicht erkannt.

Wie beschrieben getInstance(String algorithm) der Grund ist klar.

NoSuchAlgorithmException - wenn kein Provider eine KeyManagerFactorySpi-Implementierung für den angegebenen Algorithmus unterstützt.

Die Standardalgorithmen sind here beschrieben

Ich denke, sie PKIX, SunX509 diese zwei Algorithmus in KeyManagerFactory

Sie müssen SunX509 So unterstützen anstelle von X509.

See the table here

+0

Auch wenn ich "PKIX" verwende, gibt es einige Cipher mit Ausnahmen. javax.net.ssl.SSLHandshakeException: Kein passendes Protokoll (Protokoll ist deaktiviert oder Cipher Suites sind ungeeignet). kann jemand helfen. – sudhanshu

+0

hast du 'SunX509' benutzt? – Saif

+0

ja. Ich habe SunX509 benutzt. dabei gibt es weitere Ausnahmen. "javax.de.ssl.SSLHandshakeException:.. Kein geeignetes Protokoll (Protokoll deaktiviert oder Chiffriersätze sind ungeeignet) PKIX ‚weniger“, während mit‘ – sudhanshu