Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSLSocket创建时出现Java异常_Java_Keytool_Truststore_Sslsocketfactory - Fatal编程技术网

SSLSocket创建时出现Java异常

SSLSocket创建时出现Java异常,java,keytool,truststore,sslsocketfactory,Java,Keytool,Truststore,Sslsocketfactory,在守则中: System.setProperty("javax.net.ssl.trustStore", cacerts); System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts); SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket sslsocket = (SSLSocke

在守则中:

System.setProperty("javax.net.ssl.trustStore", cacerts);
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);

SSLSocketFactory sslsocketfactory = (SSLSocketFactory)  SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", port);
我获得了一个Java异常:

java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
    at javax.net.ssl.DefaultSSLSocketFactory.throwException(Unknown Source)
    at javax.net.ssl.DefaultSSLSocketFactory.createSocket(Unknown Source)
    at PracticaRO.Cliente.main(Cliente.java:24)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
    at java.security.Provider$Service.newInstance(Unknown Source)
    at sun.security.jca.GetInstance.getInstance(Unknown Source)
    at sun.security.jca.GetInstance.getInstance(Unknown Source)
    at javax.net.ssl.SSLContext.getInstance(Unknown Source)
    at javax.net.ssl.SSLContext.getDefault(Unknown Source)
    at javax.net.ssl.SSLSocketFactory.getDefault(Unknown Source)
    at PracticaRO.Cliente.main(Cliente.java:23)
Caused by: java.io.IOException: Invalid keystore format
    at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
    at java.security.KeyStore.load(Unknown Source)
    at sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(Unknown Source)
    at sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultTrustManager(Unknown Source)
    at sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    ... 7 more
java.net.SocketException:java.security.nosuchalgorithexception:构造实现时出错(算法:默认,提供程序:SunJSSE,类:sun.security.ssl.SSLContextImpl$DefaultSSLContext)
位于javax.net.ssl.DefaultSSLSocketFactory.ThroweException(未知源)
位于javax.net.ssl.DefaultSSLSocketFactory.createSocket(未知源)
在PracticaRO.Cliente.main(Cliente.java:24)
原因:java.security.NoSuchAlgorithmException:构造实现时出错(算法:Default,提供程序:SunJSSE,类:sun.security.ssl.SSLContextImpl$DefaultSSLContext)
位于java.security.Provider$Service.newInstance(未知源)
位于sun.security.jca.GetInstance.GetInstance(未知源)
位于sun.security.jca.GetInstance.GetInstance(未知源)
位于javax.net.ssl.SSLContext.getInstance(未知源)
位于javax.net.ssl.SSLContext.getDefault(未知源)
位于javax.net.ssl.SSLSocketFactory.getDefault(未知源)
在PracticaRO.Cliente.main(Cliente.java:23)
原因:java.io.IOException:密钥库格式无效
位于sun.security.provider.JavaKeyStore.engineLoad(未知源)
位于sun.security.provider.JavaKeyStore$JKS.engineLoad(未知源)
位于java.security.KeyStore.load(未知源)
位于sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(未知源)
位于sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultTrustManager(未知源)
位于sun.security.ssl.SSLContextImpl$DefaultSSLContext。(未知来源)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于java.lang.Class.newInstance(未知源)
... 还有7个
在我使用
-keytool-import-keystore-cacerts-alias kpServer type JCEKS-file Server.cer将一个新公钥导入到cacerts中之前,它工作得很好,这是导致上述异常的原因

提前感谢您的帮助。

您导入的文件(Server.cer)不是java所期望的格式。你告诉keytool格式是JCEKS。我相信这意味着它是一个完整的密钥库,对于名为Server.cer的文件来说,这是不可能的

您可能想改用-type PKCS12。

您导入的文件(Server.cer)不是java期望的格式。你告诉keytool格式是JCEKS。我相信这意味着它是一个完整的密钥库,对于名为Server.cer的文件来说,这是不可能的


您可能想改用-type PKCS12。

我从另一个途径获得了解决方案,我将它分享给有同样问题的人:

我需要添加这个代码

System.setProperty("javax.net.ssl.trustStoreType","JCEKS");

因为默认情况下,它需要一个JKS类型。

我从另一种方式获得了解决方案,我将它分享给那些带着同样问题来到这里的人:

我需要添加这个代码

System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
因为默认情况下它需要JKS类型。

谢谢您的回答。。。 通过以下代码解决了我的问题:

System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
代码如下:

System.setProperty("javax.net.ssl.keyStore", CommonUtils.getKeystorePath());
System.setProperty("javax.net.ssl.keyStorePassword", 
                   CommonUtils.getKeystorePassword());
System.setProperty("javax.net.ssl.trustStore", 
                   CommonUtils.getTruststorePath());
System.setProperty("javax.net.ssl.trustStorePassword", 
                   CommonUtils.getTruststorePassword());
System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
谢谢你的回答。。。 通过以下代码解决了我的问题:

System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
代码如下:

System.setProperty("javax.net.ssl.keyStore", CommonUtils.getKeystorePath());
System.setProperty("javax.net.ssl.keyStorePassword", 
                   CommonUtils.getKeystorePassword());
System.setProperty("javax.net.ssl.trustStore", 
                   CommonUtils.getTruststorePath());
System.setProperty("javax.net.ssl.trustStorePassword", 
                   CommonUtils.getTruststorePassword());
System.setProperty("javax.net.ssl.trustStoreType","JCEKS");

我将引导您完成安装过程。我建议你对所有东西都使用一个密码,这样你一开始就不会混淆它。 按照以下步骤操作:
1.在命令行上:

要使用RSA创建公钥/私钥对,2048位,实体名称为“secureEntity”,存储在文件“server.keyStore”中。
1.1keytool-genkeypair-alias secureEntity-keyalg RSA-keysize 2048-keystone server.keyStore

该命令存储了“secureEntity”的私钥和公钥。
私钥,只有您有权访问它(通过知道文件密码)。
公钥存储为证书,因此遵循X509证书协议字段。这样,我们可以假设它包含一个公钥,并且该公钥与“secureEntity”关联。
这就是我们需要知道的,以便验证服务器发送给客户端的证书。
SSL第一步验证由客户端进行,因此客户端首先验证服务器。
现在我们已经生成了一个证书,它存储在server.keyStore中,我们可以将其导出,以便能够将其导入到一个或多个信任库中。
我们的做法:
1.2keytool-exportcert-alias secureEntity-file exported.cer-keystore server.keystore

现在我们可以添加到我们的trustStore文件中,它会要求我们在导入之后立即确认我们确实信任该实体。如果文件不存在,将自动创建该文件。
1.3keytool-importcert-alias secureEntity-keystore trustedEntities.trustStore-file exported.cer

现在,为了方便起见,让我们将其导入到仅包含服务器证书的文件中:
1.4keytool-importcert-alias secureEntity-keystore serverKeys.keystore-file exported.cer

因此,现在您的服务器应该有一个私钥和公钥(证书)

在JAVA中:

客户端:
System.setProperty(“javax.net.ssl.trustStore”、“trustedEntities.trustStore”)
并在此处创建sslsocket

服务器端:
System.setProperty(“javax.net.ssl.keyStore”、“serverKeys.keyStore”)
System.setProperty(“javax.net.ssl.keystrepassword”、“您之前定义的serverKeys.keyStore文件密码”)

创建一个服务器ssl,就这样。
希望这有帮助。干杯

我将引导您完成安装过程。我建议你对所有东西都使用一个密码,这样你一开始就不会混淆它。 按照以下步骤操作:
1.在命令行上:

要使用RSA创建公钥/私钥对,2048位,实体名称为“secureEntity”,