在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()获取已经注册的提供者。

你可能感兴趣的:(exception)