Использование собственного ключа для тестирования приложения Java Java - PullRequest
2 голосов
/ 24 января 2010

Я работаю на очень простом сервере, который использует ssl (в netbeans) - чтобы проверить его, я создал сертификат, следуя инструкциям здесь: http://java.sun.com/javaee/5/docs/tutorial/doc/bnbxw.html

java-home\bin\keytool -genkey -alias server-alias-keyalg RSA -keypass changeit -storepass changeit -keystore keystore.jks

java-home\bin\keytool -export -alias server-alias -storepass changeit -file server.cer -keystore keystore.jks

java-home\bin\keytool -import -v -trustcacerts -alias server-alias -file server.cer -keystore cacerts.jks -keypass changeit -storepass changeit

Теперь, чтобы получить простой эхо-сервер, использующий ssl, я попробовал разнообразный код: каждый из которых выдает множество исключений - один пример приведен ниже:

try {
            System.setProperty("javax.net.ssl.keyStore", "cacerts.jks");
            System.setProperty("javax.net.ssl.keyStorePassword", "changeit");

            SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

            ServerSocket ss = ssf.createServerSocket(5432);
        } catch (Exception e {
            e.printStackTrace();
        }

Это лучший способ сделать это?

На странице Java упоминается это:

Вы должны ввести имя сервера в ответ на первое приглашение keytool, в который он просит первым и последним имена. Для целей тестирования это может быть локальным.

Когда вы запускаете примеры приложений, хост, указанный в хранилище ключей должен соответствовать хосту, указанному в свойство javaee.server.name указано в файле Tut-установки / javaeetutorial5 / примеры / BP-проект / build.properties.

Как применить это к коду, который я собираю (и выполняю) в netbeans ide?

ОБНОВЛЕНИЕ: выдает следующие ошибки

java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
        at javax.net.ssl.DefaultSSLServerSocketFactory.throwException(SSLServerSocketFactory.java:142)
        at javax.net.ssl.DefaultSSLServerSocketFactory.createServerSocket(SSLServerSocketFactory.java:149)
        at MainClass.main(MainClass.java:23)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
        at java.security.Provider$Service.newInstance(Provider.java:1245)
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
        at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
        at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
        at javax.net.ssl.SSLServerSocketFactory.getDefault(SSLServerSocketFactory.java:96)
        at MainClass.main(MainClass.java:21)
Caused by: java.security.PrivilegedActionException: java.io.FileNotFoundException: cacerts.jks (The system cannot find the file specified)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:120)
        at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
        at java.lang.Class.newInstance(Class.java:308)
        at java.security.Provider$Service.newInstance(Provider.java:1221)
        ... 6 more
Caused by: java.io.FileNotFoundException: cacerts.jks (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl$2.run(DefaultSSLContextImpl.java:123)
        at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl$2.run(DefaultSSLContextImpl.java:121)
        ... 16 more

большое спасибо

1 Ответ

6 голосов
/ 24 января 2010

Если вы использовали «localhost» в качестве имени хоста в самозаверяющем сертификате, то HTTPS будет работать только тогда, когда вы отправляете запросы на ваш сервер, используя «localhost» в качестве имени домена для запроса.

РЕДАКТИРОВАТЬ : исходя из исключения, я бы сказал, что реальная проблема может заключаться в том, что ваш файл хранилища ключей находится не в том месте, где JVM ожидает его. Попробуйте использовать абсолютный путь в системном свойстве, которое указывает местоположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...