• 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. }

  • 相关阅读:
    Spring更加简单地存储Bean
    宇宙都要毁灭了你还在玩汉诺塔?(动画讲解汉诺塔问题)
    【Flutter】如何优美地实现一个悬浮NavigationBar
    七步走,让你快速编写一个最简单的Servlet项目
    x6.js bug记录-流程图json数据导入进来之后拖拽节点,节点直接飞走了
    [C++](21)set和map的模拟实现
    python安装、输入输出、注释、中文编码、编码规范等基础语法
    speedoffice(Word)怎么修改字体颜色呢
    如何让Java项目兼容更多的客户端设备(一)
    【计算机网络笔记】网络应用的体系结构
  • 原文地址:https://blog.csdn.net/bai920708/article/details/139630902