Новичок
Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.1.2007
Репутация: нет Всего: нет
|
Помогите пожалуйста! Проблема состоит в том, что JSSE не может найти JCE. Я сделал свой код, но когда тот не заработал для верности скопировал код для работы с SSL с статьи этого сайта и он точно так же не работает. После того как произойдет handshaking постоянно выскакивает исключение, привожу последнюю часть с включенным интернет логом -Djavax.net.debug=all или как-то там, так вот: | Код | *** ServerHelloDone [read] MD5 and SHA1 hashes: len = 4 0000: 0E 00 00 00 .... matching alias: sslsecretkey *** Certificate chain chain [0] = [ [ Version: V1 Subject: CN=Vasya Pupkin, OU=CIA, O=CIA, L=Tmutarakan, ST=Kukuevskiy Region, C=RU Signature Algorithm: MD5withRSA, OID = 1.2.840.113549.1.1.4
Key: Sun RSA public key, 1024 bits modulus: 99610213800826206034039542021082246569623563604961979771027354363501512127231350173296106147884413904007171077166072992475824339194478849365410906084286376644182748693348767959007534872379375743457737800528498627232203242074533242725983381773053810775452126195350741285099535086096354523854519198476336248369 public exponent: 65537 Validity: [From: Tue Jul 03 20:29:04 EEST 2007, To: Mon Oct 01 20:29:04 EEST 2007] Issuer: CN=Vasya Pupkin, OU=CIA, O=CIA, L=Tmutarakan, ST=Kukuevskiy Region, C=RU SerialNumber: [ 468a8760]
] Algorithm: [MD5withRSA] Signature: 0000: 00 E8 DC 4D 14 DF 76 BD 24 64 CE 4B C8 2D 78 8D ...M..v.$d.K.-x. 0010: 34 24 BC 13 81 21 AC 38 81 6F 75 F0 B3 AB 5E AF 4$...!.8.ou...^. 0020: 29 69 DF 00 ED E1 CC 2B C5 DC 1D 42 2D F9 3E 1A )i.....+...B-.>. 0030: 6F A4 16 69 B7 93 CE EE 50 A9 25 1A 53 55 C6 97 o..i....P.%.SU.. 0040: D6 28 04 9E 17 77 FC B2 37 00 FD E2 1F 7D 21 3D .(...w..7.....!= 0050: 04 92 C8 A1 F5 4C F2 4C 24 31 C3 18 8D EA FD 68 .....L.L$1.....h 0060: 97 9F 2B B9 0E 64 7E 60 E0 70 1D 9C FA 9C E6 8D ..+..d.`.p...... 0070: 34 34 A7 18 82 AF 5E D9 4C CF 4B 64 BA 22 B9 35 44....^.L.Kd.".5
] *** main, handling exception: javax.net.ssl.SSLKeyException: RSA premaster secret error main, SEND TLSv1 ALERT: fatal, description = unexpected_message main, WRITE: TLSv1 Alert, length = 2 [Raw write]: length = 7 0000: 15 03 01 00 02 02 0A ....... main, called closeSocket() javax.net.ssl.SSLKeyException: RSA premaster secret error at com.sun.net.ssl.internal.ssl.PreMasterSecret.<init>(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) at engine.net.NetworkEngine.<init>(NetworkEngine.java:54) at engine.net.NetworkEngine.main(NetworkEngine.java:192) Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/ECB/PKCS1Padding at javax.crypto.Cipher.getInstance(DashoA12275) at com.sun.net.ssl.internal.ssl.JsseJce.getCipher(Unknown Source) at com.sun.net.ssl.internal.ssl.RSACipher.<init>(Unknown Source) at com.sun.net.ssl.internal.ssl.RSACipher.getInstance(Unknown Source) ... 10 more
|
Код серера и клиента. | Код | String KSType="JKS", KSProvider="SUN", KSFileName="D:/mykey.ks", KSPassword="murzilka";
try { System.out.println("=====Where did you get AES====="); Cipher c = Cipher.getInstance("AES/CBC/NoPadding"); System.out.println(c.getProvider()); } catch(Exception nspe) { nspe.printStackTrace(); } try { KeyStore ks=KeyStore.getInstance(KSType,KSProvider); ks.load(new BufferedInputStream(new FileInputStream(KSFileName)), KSPassword.toCharArray()); String KeyPassword="murzilka", KMFAlgorithm="SunX509", KMFProvider="SunJSSE", TMFAlgorithm="SunX509", TMFProvider="SunJSSE";
KeyManagerFactory kmf=KeyManagerFactory.getInstance(KMFAlgorithm,KMFProvider); kmf.init(ks,KeyPassword.toCharArray()); TrustManagerFactory tmf=TrustManagerFactory.getInstance(TMFAlgorithm,TMFProvider); tmf.init(ks); // параметры для создания контекста String SSLCProtocol="TLSv1", SSLCProvider="SunJSSE";
SSLContext sslc=SSLContext.getInstance(SSLCProtocol,SSLCProvider); sslc.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null);
SSLServerSocketFactory ssf=sslc.getServerSocketFactory(); SSLServerSocket ss=(SSLServerSocket)ssf.createServerSocket(4443); ss.setNeedClientAuth(true);//требуем аутентификацию подключающихся клиентов Logger.log("Listening..."); SSLSocket sock = (SSLSocket)ss.accept(); Logger.log("Handshaking"); sock.startHandshake(); Logger.log("OK :)"); sock.close(); } catch(Exception e) { e.printStackTrace(); }
|
Клиент: | Код | //параметры для загрузки хранилища ключей String KSType="JKS", KSProvider="SUN", KSFileName="D:/mykeycopy.ks", KSPassword="murzilka";
try { KeyStore ks=KeyStore.getInstance(KSType,KSProvider); ks.load(new BufferedInputStream(new FileInputStream(KSFileName)), KSPassword.toCharArray()); String KeyPassword="murzilka", KMFAlgorithm="SunX509", KMFProvider="SunJSSE", TMFAlgorithm="SunX509", TMFProvider="SunJSSE";
KeyManagerFactory kmf=KeyManagerFactory.getInstance(KMFAlgorithm,KMFProvider); kmf.init(ks,KeyPassword.toCharArray()); TrustManagerFactory tmf=TrustManagerFactory.getInstance(TMFAlgorithm,TMFProvider); tmf.init(ks); // параметры для создания контекста String SSLCProtocol="TLSv1", SSLCProvider="SunJSSE";
SSLContext sslc=SSLContext.getInstance(SSLCProtocol,SSLCProvider); sslc.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null); String host="localhost"; int port=4443; SSLSocketFactory sf=sslc.getSocketFactory(); SSLSocket s=(SSLSocket)sf.createSocket(host,port); s.setWantClientAuth(true);//клиент хочет пройти процедуру аутентификации Logger.log("Created"); s.startHandshake(); Logger.log("OK"); s.close(); } catch(Exception e) { e.printStackTrace(); }
|
(Logger - класс протоколирования) На java.sun написано в доке по JSSE: | Цитата | SunJSSE can not find a JCA/JCE provider which supports a required algorithm and causes NoSuchAlgorithmException
Problem: A handshake is attempted, and fails when it can not find a required algorithm. Examples might include: Exception in thread ...deleted... ...deleted... Caused by java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/ECB/PKCS1Padding or Caused by java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/NoPadding
Cause: SunJSSE uses JCE for all of its cryptographic algorithms. By default, the Sun JDK will use the Standard Extension ClassLoader to load the SunJCE provider located in <java-home>/lib/ext/sunjce_provider.jar. If the file can't be found or loaded, or if the SunJCE provider has been deregistered from the Provider mechanism and an alternate implementation from JCE isn't available, this exception will be seen.
Solution: Ensure the SunJCE is available by checking the file is loadable and that the provider is registered with the Provider interface. Try to run the following code in the context of your SSL connection. import javax.crypto.*;
System.out.println("=====Where did you get AES====="); Cipher c = Cipher.getInstance("AES/CBC/NoPadding"); System.out.println(c.getProvider());
|
Сначала на сервере кстати именно этот код стоит и он прекрасненько выводит нам: | Код | =====Where did you get AES===== java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/NoPadding at javax.crypto.Cipher.getInstance(DashoA12275) at engine.net.SSLServer.main(SSLServer.java:24) Tue Jul 03 21:51:00 EEST 2007 LOG: Listening...
|
При этом и пакет sunjce_provider.jar у меня в Eclipse видимый, и в java.security есть такая строчка | Код | security.provider.4=com.sun.crypto.provider.SunJCE
|
Помогите пожалуйста!!! Что делать?! :( Буду рад любой помощи. Это сообщение отредактировал(а) progdog - 4.7.2007, 10:20
|