创建SSLSocket时出现Java异常



代码中:

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

它工作得很好,直到我用-keytool -import -keystore cacerts -alias kpServer type JCEKS -file Server.cer导入一个新的公钥到cacerts中,这导致了上面的异常。

提前感谢您的帮助。

我将引导您完成设置过程。我建议你用一个密码,这样你就不会一开始就把它弄混了。

遵循以下步骤:
1。命令行:

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

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

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

现在为了方便,让我们将它导入到一个只包含服务器证书的文件中:
1.4 keytool -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")
serverKeys System.setProperty("javax.net.ssl.keyStorePassword"。"

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

我从另一种方式得到了解决方案,我把它分享给有同样问题的人:

我需要添加这个代码

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

因为默认情况下它需要JKS类型

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

您可能希望使用-type PKCS12。

谢谢你的回答…解决我的问题,把这段代码:

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");

相关内容

  • 没有找到相关文章

最新更新