当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
- 所以代码改为:
-
这样会自动调用Security.getProviders()获取已经注册的提供者。SSLContext sslContext = SSLContext.getInstance("SSL");
-