2010-01-24 48 views
2

我正在使用SSL(在NetBeans)一个非常简单的服务器上 - 要测试它,我已经创建了以下这些指令的证书: http://java.sun.com/javaee/5/docs/tutorial/doc/bnbxw.html使用自生成的密钥来测试Java应用SSL

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会得到一个简单的echo服务器,i'vre想尽了各种代码:所有这些都抛出大量的异常的 - 一个例子是如下:

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页面提到了这一点:

您必须 响应密钥工具的第一个提示,在 其中它要求第一和最后一个 名称输入服务器名称。出于测试目的,这可以是 是localhost。

当您运行示例应用程序, 密钥库中的指定的主机 必须在 javaee.server.name属性标识的主机相匹配的文件 啧啧安装/ 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 

千恩万谢

回答

6

如果使用“localhost”的是自签名证书中的主机,然后HTTPS当您发送只会工作请求使用'localhost'作为请求的域名。

编辑:基于例外情况,我想说真正的问题可能是您的密钥库文件不在JVM预期的位置。尝试在提供位置的系统属性中使用绝对路径名。

+0

多数民众赞成 - 罚款 - 该项目只是为了目前本地运行,但我似乎甚至似乎得到它在localhost上工作...(即运行服务器和客户端都在同一台计算机上) – oneAday 2010-01-24 03:12:37

+0

@oneADay - 您是否在请求URL中使用机器的DNS名称或“localhost”?如果你正在做前者,那么“本地主机”证书将不起作用。我建议你为机器的DNS名称创建并配置一个自签名证书。 – 2010-01-24 03:20:15

+0

当使用波形符号(〜/ keystore.p12)给密钥库的路径时,我遇到了同样的错误。当我切换到完整路径名称(/home/user/keystore.p12)时,它工作正常。 – CoverosGene 2012-05-10 15:49:07