我正在使用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
千恩万谢
多数民众赞成 - 罚款 - 该项目只是为了目前本地运行,但我似乎甚至似乎得到它在localhost上工作...(即运行服务器和客户端都在同一台计算机上) – oneAday 2010-01-24 03:12:37
@oneADay - 您是否在请求URL中使用机器的DNS名称或“localhost”?如果你正在做前者,那么“本地主机”证书将不起作用。我建议你为机器的DNS名称创建并配置一个自签名证书。 – 2010-01-24 03:20:15
当使用波形符号(〜/ keystore.p12)给密钥库的路径时,我遇到了同样的错误。当我切换到完整路径名称(/home/user/keystore.p12)时,它工作正常。 – CoverosGene 2012-05-10 15:49:07