Minio PKIX パスの構築に失敗した SSL 証明書の検証に失敗した問題の解決策

背景

    1. プロジェクトはサードパーティのプラットフォームに統合する必要があります。アクセス方法は https です。統合の開始時の minio サーバーは http です。アップロードおよびダウンロードのプロセス中にセキュリティの問題が発生する可能性があります。その後、minioサービスはhttpsに変更されます。自分でBaiduに変更する方法。

    2. ただし、minio https サービスを使用する場合、使用する SSL 証明書は独自に生成されるため、ファイルのダウンロードはできますが、ファイルのアップロード時に
 PKIX パスの構築に失敗するという問題が発生します。

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)

  ソース コードをトレースすると、信頼できない証明書の問題が原因であることがわかりました。New MinioClient() は通常、カプセル化されたネットワーク接続です。

オンラインで問題を解決するには、通常、次の 2 つの方法があります。

1. 1 つは、証明書をダウンロードして、クライアントに証明書をインポートすることです。これは、JDK インポート証明書ですが、自分でインポートしましたが、まだ機能しませんでした (私の側で複数の証明書が関係している可能性がありますが、実際にはすべてインポートしましたが、最終的にはまだ機能しませんでした) いいえ、このインポートは非​​常に不便だと思います。サーバーを変更すると、証明書などを再インポートする必要があります。

2. コードを使用して SSL 検証をキャンセルします。

 

ここでは主に 2 番目のタイプについて説明します。

問題は http リンクなので、ここでは minioclient が https リンクをどのように実行するかを把握し、ここから始めます。

   new MinioClient(), 通常、初期化ではリンク、アカウント、パスワードが渡されますが、ここで使用したいのは、リンク時のセキュリティ検証ステップを削除することです。ソース コードを見てください。新しい minio には複数のオーバーロード メソッドがあります。最後に発見する

これはまさに私たちが望んでいることではありませんか? httpclient の初期化時に SSL 検証を削除するだけです。コードを直接アップロードする

SSL検証を削除する

      ダイレクトコード、OKhttpClient は ssl 検証接続を削除します

public static OkHttpClient getUnsafeOkHttpClent() throws KeyManagementException {
        try {
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

                        }

                        @Override
                        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

                        }

                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[]{};
                        }
                    }
            };


            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new SecureRandom());
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory);


            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });
            return builder.build();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

  ミニオ使用

//去掉ssl验证
        OkHttpClient okHttpClient = SslUtils.getUnsafeOkHttpClent();
        //        MinioClient minioClient = new MinioClient(minioUrl, minioName, minioPass);
        MinioClient minioClient = new MinioClient(minioUrl,9000 ,minioName, minioPass,
                null,true,okHttpClient);

これでSSL証明書検証の問題が解決しましたので、皆様のお役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/u010445301/article/details/108058005