2012-12-05 9 views
23

Tworzę aplikację opartą na huśtawce w języku JAVA, która wykorzystuje pewną technikę szyfrowania. Ale javax.crypto.KeyGenerator.getInstance ("AES", "BC") daje wyjątek:JCE nie może uwierzytelnić dostawcy BC w aplikacji java swing

java.security.NoSuchProviderException: JCE cannot authenticate the provider BC 
     at javax.crypto.SunJCE_b.a(DashoA13*..) 
     at javax.crypto.KeyGenerator.getInstance(DashoA13*..) 

Więc jaki jest problem?

+8

Zazwyczaj oznacza to zrobiłeś coś złego opakowania z klas/słoików i/lub ścieżce klasy. Nie można wyodrębnić klas BC z ich słoików i umieścić ich w innym słoiku. –

Odpowiedz

25

Aby rozwinąć komentarz z GregS, wszystkie pliki JAR dostawcy JCE muszą zostać podpisane, zanim zostaną zaufane przez środowisko wykonawcze Java.

BouncyCastle posłusznie zaopatruje podpisane JARY, które będą działały bez problemu. Jednak jeśli wyodrębnisz pliki klas z tego pliku JAR lub przekompilujesz źródło, usunie podpis i spowoduje, że Java odrzuci kod.

Zobacz ten związany SO pytanie: How to sign a custom JCE security provider

+7

Nie wyodrębniłem ani nie rekompilowałem pliku JAR, pobieram tylko bcprov-jdk14 i bcpkix-jdk14 z http://repo2.maven.org/maven2/org/bouncycastle/; jednak to nie działa dla mnie! –

23

1. edit jre \ lib \ security \ java.security

dodać security.provider.10 = org.bouncycastle.jce.provider.BouncyCastleProvider

2. skopiować bc * .jar do jre \ lib \ ext

+0

Dlaczego ta sugestia została odrzucona? Pomogło mi to: http://stackoverflow.com/questions/27168951/jce-cannot-authenticate-the-provider-bc-when-running-a-jar – Anton

+0

To była jedyna rzecz, która mi pomogła. –

+1

To działało świetnie dla mnie! Używałem jython, mimo że podałem pliki JAR bezpośrednio (nie wyodrębniłem plików klas oddzielnie), otrzymałem wyjątek. Ewentualnie jython go wyodrębnia. Świetne rozwiązanie. Dzięki! – rsmoorthy

3

dla tych, znalezienie tego problemu, ale rzeczywiście przy SpongyCastle, to może być interesujące wiedzieć, że na Androida nie ma takiego testu podpisu i dla twoich testów możesz użyć SpongyCastle przez openJDK-8, ponieważ to nie obchodzi też podpisów.

Dla porównania, z SpongyCastle błąd brzmi:

java.lang.SecurityException: JCE cannot authenticate the provider SC 

Więcej informacji w this issue