我正在使用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