• okHttp的https请求忽略ssl证书认证


    使用okhttp请求第三方https接口返回异常

    1. sun.security.validator.ValidatorException: PKIX path building failed:
    2. sun.security.provider.certpath.SunCertPathBuilderException:
    3. unable to find valid certification path to requested target

    意思就是非安全的调用,java不认识这个接口证书。java security仓库中没有这个第三方站点的SSL证书,调用失败。

    这里为了简单,我直接忽略ssl证书认证,代码如下

    1. import okhttp3.ConnectionPool;
    2. import okhttp3.OkHttpClient;
    3. import java.net.Proxy;
    4. import java.security.KeyStore;
    5. import java.security.SecureRandom;
    6. import java.security.cert.X509Certificate;
    7. import java.util.Arrays;
    8. import java.util.concurrent.TimeUnit;
    9. import javax.net.ssl.*;
    10. /**
    11. * @author 白**
    12. * @date 2024-06-12 14:46
    13. */
    14. public class OkHttpUtil {
    15. private static OkHttpClient okHttpClient;
    16. public static ConnectionPool connectionPool = new ConnectionPool(10, 5, TimeUnit.MINUTES);
    17. public static OkHttpClient getInstance() {
    18. if (okHttpClient == null) { //加同步安全
    19. synchronized (OkHttpClient.class) {
    20. if (okHttpClient == null) { //okhttp可以缓存数据....指定缓存路径
    21. okHttpClient = new OkHttpClient.Builder()//构建器
    22. .proxy(Proxy.NO_PROXY) //来屏蔽系统代理
    23. .connectionPool(connectionPool)
    24. .sslSocketFactory(getSSLSocketFactory(), getX509TrustManager())
    25. .hostnameVerifier(getHostnameVerifier())
    26. .connectTimeout(600, TimeUnit.SECONDS)//连接超时
    27. .writeTimeout(600, TimeUnit.SECONDS)//写入超时
    28. .readTimeout(600, TimeUnit.SECONDS)//读取超时
    29. .build();
    30. okHttpClient.dispatcher().setMaxRequestsPerHost(200);
    31. okHttpClient.dispatcher().setMaxRequests(200);
    32. }
    33. }
    34. }
    35. return okHttpClient;
    36. }
    37. /**
    38. * description 忽略https证书验证
    39. */
    40. private static HostnameVerifier getHostnameVerifier() {
    41. HostnameVerifier hostnameVerifier = new HostnameVerifier() {
    42. @Override
    43. public boolean verify(String s, SSLSession sslSession) {
    44. return true;
    45. }
    46. };
    47. return hostnameVerifier;
    48. }
    49. /**
    50. * description 忽略https证书验证
    51. */
    52. private static SSLSocketFactory getSSLSocketFactory() {
    53. try {
    54. SSLContext sslContext = SSLContext.getInstance("SSL");
    55. sslContext.init(null, getTrustManager(), new SecureRandom());
    56. return sslContext.getSocketFactory();
    57. } catch (Exception e) {
    58. throw new RuntimeException(e);
    59. }
    60. }
    61. private static X509TrustManager getX509TrustManager() {
    62. X509TrustManager trustManager = null;
    63. try {
    64. TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    65. trustManagerFactory.init((KeyStore) null);
    66. TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
    67. if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
    68. throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
    69. }
    70. trustManager = (X509TrustManager) trustManagers[0];
    71. } catch (Exception e) {
    72. e.printStackTrace();
    73. }
    74. return trustManager;
    75. }
    76. private static TrustManager[] getTrustManager() {
    77. TrustManager[] trustAllCerts = new TrustManager[]{
    78. new X509TrustManager() {
    79. @Override
    80. public void checkClientTrusted(X509Certificate[] chain, String authType) {
    81. }
    82. @Override
    83. public void checkServerTrusted(X509Certificate[] chain, String authType) {
    84. }
    85. @Override
    86. public X509Certificate[] getAcceptedIssuers() {
    87. return new X509Certificate[]{};
    88. }
    89. }
    90. };
    91. return trustAllCerts;
    92. }
    93. }

  • 相关阅读:
    【探索Linux】文件描述符 | 重定向 | 基础IO —— 强大的命令行工具 P.12
    docker desktop无法启动问题
    Java 基于 SpringBoot+Vue 的留守儿童关爱网站
    1067 试密码
    2023-11-22 LeetCode每日一题(网格中的最小路径代价)
    MATLAB数字图像处理 实验三:空域频域图像去噪与锐化
    区间映射算法
    Python将Qt的ui文件转成py代码文件
    Node.js在Python中的应用实例解析
    获取手机位置信息
  • 原文地址:https://blog.csdn.net/bai920708/article/details/139630902