在代码中:
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 Exception:
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导入新公钥之前,它工作正常。
提前感谢您的帮助。
答案 0 :(得分:3)
我将引导您完成设置过程。我建议你只使用一个密码,一开始就不要混淆。
请按照以下步骤操作:
1。在命令行上:
要使用RSA创建公钥/私钥对,2048位,实体名称为“secureEntity”,存储在文件“server.keyStore”中。
1.1 keytool -genkeypair -alias secureEntity -keyalg RSA -keysize 2048 - keystone server.keyStore
该命令存储了“secureEntity”的私钥和公钥
私钥,只有你应该有权访问它(通过知道文件密码)
公钥存储为证书,因此它遵循X509证书协议字段。这样我们可以假设它包含一个公钥,这个公钥与“secureEntity”相关联
这是我们需要知道的,以验证服务器发送给客户端的证书
SSL第一步验证由客户端进行,因此客户端首先验证服务器
现在我们已经生成了证书并将其存储在server.keyStore中,我们可以将其导出,以便能够将其导入一个或多个trustStore。
我们这样做的方式:
1.2 keytool -exportcert -alias secureEntity -file exported.cer -keystore server.keystore
所以现在我们可以添加到我们真正的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”)
System.setProperty(“javax.net.ssl.keyStorePassword”,“serverKeys.keyStore FILE WORDWORD,你之前定义的”)
创建一个服务器ssl,就是这样。 希望这可以帮助。干杯!
答案 1 :(得分:2)
我从另一个方面得到了解决方案,我为那些带着同样问题来到这里的人分享了它:
我需要添加此代码
System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
因为默认情况下它需要JKS类型。
答案 2 :(得分:0)
您导入的文件(Server.cer)不是java期望的格式。你告诉keytool格式是JCEKS。我相信这意味着它是一个完整的密钥库,这对于名为Server.cer的文件来说是不可能的。
您可能想要使用-type PKCS12。
答案 3 :(得分:0)
感谢您的回答...... 通过输入以下代码解决了我的问题:
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");