tubaobaoya3 发表于 2017-2-27 11:00:59

在i-jetty中发起https请求失败:java.security.NoSuchProviderException: SunJSSE

  当web项目在tomcat中启动时,可以正确得建立https链接,发起请求并获得响应。
  但是把web项目放到手机上使用i-jetty启动时,发起https请求失败。
  检查后发现在建立SSLContext时报错:java.security.NoSuchProviderException: SunJSSE
  建立SSLContext的代码为:

SSLContext sslContext = SSLContext.getInstance("SSL",”SunJSSE”);
  查看JDK API:


getInstance

public static SSLContext getInstance(String protocol,
String provider)
throws NoSuchAlgorithmException,
NoSuchProviderException
返回实现指定安全套接字协议的 SSLContext 对象。  返回一个封装 SSLContextSpi 实现的新 SSLContext 对象,该实现取自指定的提供者。指定的提供者必须在安全提供者列表中注册。
  注意,可以通过 Security.getProviders() 方法获取已注册提供者列表。



参数:

protocol - 所请求协议的标准名称。有关标准协议名称的信息,请参见 Java Secure Socket Extension Reference Guide 的附录 A。

provider - 提供者的名称。
返回:
新的 SSLContext 对象。
抛出:

NoSuchAlgorithmException - 如果不能从指定提供者获得指定协议的 SSLContextSpi 实现。

NoSuchProviderException - 如果指定提供者未在安全提供者列表中注册。

IllegalArgumentException - 如果提供者的名称为 null 或空。
另请参见:
Provider
  所以报错的原因应该是”SunJSSE“在Android环境下是没有注册的提供者,所以无法建立SSLContext。
  继续查看JDK API,发现:


getInstance

public static SSLContext getInstance(String protocol)
throws NoSuchAlgorithmException
返回实现指定安全套接字协议的 SSLContext 对象。  此方法从首选提供者开始遍历已注册安全提供者列表。返回一个封装 SSLContextSpi 实现的新 SSLContext 对象,该实现取自支持指定协议的第一个提供者。
  注意,可以通过 Security.getProviders() 方法获取已注册提供者列表。



参数:

protocol - 所请求协议的标准名称。有关标准协议名称的信息,请参见 Java Secure Socket Extension Reference Guide 的附录 A。
返回:
新的 SSLContext 对象。
抛出:

NoSuchAlgorithmException - 如果没有提供者支持指定协议的 TrustManagerFactorySpi 实现。
另请参见:
Provider


所以代码改为:

SSLContext sslContext = SSLContext.getInstance("SSL");
这样会自动调用Security.getProviders()获取已经注册的提供者。
页: [1]
查看完整版本: 在i-jetty中发起https请求失败:java.security.NoSuchProviderException: SunJSSE