使用自行生成的密钥测试java ssl应用程序

使用自行生成的密钥测试java ssl应用程序,java,netbeans,ssl,Java,Netbeans,Ssl,我正在一个使用ssl(在netbeans中)的非常简单的服务器上工作-为了测试它,我按照以下说明创建了一个证书: 现在,为了使用ssl实现一个简单的echo服务器,我尝试了多种代码:所有这些代码都会引发大量异常-下面是一个示例: try { System.setProperty("javax.net.ssl.keyStore", "cacerts.jks"); System.setProperty("javax.net.ssl.keyStoreP

我正在一个使用ssl(在netbeans中)的非常简单的服务器上工作-为了测试它,我按照以下说明创建了一个证书:

现在,为了使用ssl实现一个简单的echo服务器,我尝试了多种代码:所有这些代码都会引发大量异常-下面是一个示例:

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 install/javaeetutorial5/examples/bp project/build.properties

如何将此应用于netbeans ide中的代码im构建(和运行)

更新:它抛出以下错误

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
java.net.SocketException:java.security.nosuchagorithmexception:构造实现时出错(算法:默认,提供程序:SunJSSE,类:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
位于javax.net.ssl.DefaultSSLServerSocketFactory.throweException(SSLServerSocketFactory.java:142)
位于javax.net.ssl.DefaultSSLServerSocketFactory.createServerSocket(SSLServerSocketFactory.java:149)
在MainClass.main(MainClass.java:23)
原因:java.security.nosuchalgorithException:构造实现时出错(算法:默认,提供程序:SunJSSE,类:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
位于java.security.Provider$Service.newInstance(Provider.java:1245)
位于sun.security.jca.GetInstance.GetInstance(GetInstance.java:220)
位于sun.security.jca.GetInstance.GetInstance(GetInstance.java:147)
位于javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
位于javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
位于javax.net.ssl.SSLServerSocketFactory.getDefault(SSLServerSocketFactory.java:96)
在MainClass.main(MainClass.java:21)
原因:java.security.PrivilegedActionException:java.io.FileNotFoundException:cacerts.jks(系统找不到指定的文件)
位于java.security.AccessController.doPrivileged(本机方法)
位于com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:120)
位于com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl。(DefaultSSLContextImpl.java:40)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于java.lang.Class.newInstance0(Class.java:355)
位于java.lang.Class.newInstance(Class.java:308)
位于java.security.Provider$Service.newInstance(Provider.java:1221)
... 还有6个
原因:java.io.FileNotFoundException:cacerts.jks(系统找不到指定的文件)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(FileInputStream.java:106)
位于java.io.FileInputStream。(FileInputStream.java:66)
在com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl$2.run(DefaultSSLContextImpl.java:123)
在com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl$2.run(DefaultSSLContextImpl.java:121)
... 还有16个

非常感谢

如果您在自签名证书中使用“localhost”作为主机名,则只有当您使用“localhost”作为请求的域名向服务器发送请求时,HTTPS才会起作用


编辑:基于这个异常,我认为真正的问题可能是您的密钥库文件不在JVM期望的位置。尝试在给出位置的系统属性中使用绝对路径名。

这很好-该项目暂时只能在本地运行,但我甚至无法让它在本地主机上运行。。。(即,在同一台计算机上同时运行服务器和客户端)@oneday-您在请求URL中是否使用计算机的DNS名称或“localhost”?如果您正在执行前者,那么“localhost”的证书将不起作用。我建议您也为计算机的DNS名称创建并配置一个自签名证书。我在使用tilde(~/keystore.p12)提供密钥库的路径时遇到了相同的错误。当我切换到完整路径名(/home/user/keystore.p12)时,它工作得很好。@CoverosGene-Java在打开文件时不进行平铺扩展。它将路径名传递给操作系统。。。这也会扩展tildes。平铺扩展>>外壳
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