Java和SSL - java.security.NoSuchAlgorithmException

Zar*_*jio 33 java security ssl

我已经构建了一个Java程序作为服务器上数据库的前端,我正在尝试使用SSL来加密客户端和服务器之间的流量.这是我发出的用于创建服务器证书的命令:

keytool -genkey -alias localhost -keyalg RSA -keypass kpass123 -storepass kpass123 -keystore keystore.jks
Run Code Online (Sandbox Code Playgroud)

这是相关代码:

System.setProperty("javax.net.ssl.keyStore",
                   "G:/Data/Android_Project/keystore.jks");

System.setProperty("javax.net.ssl.keyPassword", "kpass123");

SSLServerSocketFactory factory = 
    (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();

SSLServerSocket accessSocket = 
    (SSLServerSocket)factory.createServerSocket(DB_ACCESS_PORT);
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我抓住了这个:

java.security.NoSuchAlgorithmException:构造实现时出错(算法:默认,提供者:SunJSSE,类:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)

我还发现"KeyPairGenerator"服务有DIFFIEHELLMAN,DSA,RSA算法,而"SSLContext"有算法SSL,TLS,SSLV3,DEFAULT,TLSV1.

我是否需要找到一些方法将RSA安装到SSLContext服务中?我甚至在看正确的服务吗?我不应该使用RSA吗?

我是整个SSL - 安全 - 证书的新手,它让我感到震惊的是,当他们应该访问相同的证书时,这些不同的服务中的每一个都没有相同的算法.

Bru*_*uno 61

尝试javax.net.ssl.keyStorePassword而不是javax.net.ssl.keyPassword:JSSE参考指南中没有提到后者.

您提到的算法默认使用默认安全提供程序.NoSuchAlgorithmExceptions通常是由其他基础异常引起的(文件未找到,密码错误,密钥库类型错误,......).查看完整堆栈跟踪很有用.

如果堆栈跟踪中的信息不足-Djavax.net.debug=ssl,您还可以使用或至少-Djavax.net.debug=ssl,keymanager获取更多调试信息.