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”,