minio PKIX path building failed SSL证书验证失败的问题解决

背景

    1、我们项目要集成到第三方平台上,访问方式使用的是https,开始集成是minio服务器是http,上传和下载过程中会出现不安全的问题。后面把minio服务改为https。如何改自行百度。

    2、但是在我们使用minio https服务的过程中,因为我们使用的SSL证书是自己生成的,下载文件可以,但是在上传文件是会发生
 PKIX path building failed 的问题。

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() 一般是封装好的网络连接。

网上有一般有两种方法解决:

1、一种是下载证书,在客户端导入证书,也就是我们的jdk导入证书,但是我自己导入过还是不行(可能是我这边涉及到多个证书,但其实我都导入了,最后还是不行。) 这个导入我觉得很不方便,如果我换一台服务器,意味着证书之类的要重新导入。

2、通过代码,取消SSL验证。

 

这里主要是讲第二种。

由于出问题的地方就是http链接,这块,我们抓住minioclient是如何进行https链接,从这里着手。

   new MinioClient(),一般初始化会传入 链接,账号和密码,但是我们这里要用的是在链接的时候就把安全验证这一步去掉,看看源码进去,new 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;
    }

  Minio使用

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

这样就解决了SSL证书验证的问题,希望对大家有帮助。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 要在Java中上传Minio图片,需要遵循以下步骤: 首先,您需要安装Minio的Java SDK,并在必要的情况下,添加依赖项。 接下来,您需要准备证书,这些证书将与Minio服务器建立安全连接。确保证书的正确性和安全性。 一旦准备好了证书,您将需要建立一个连接,使用以下代码: ``` MinioClient minioClient = new MinioClient.Builder() .endpoint("https://play.minio.io") .credentials("YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY") .build(); ``` 在建立连接后,您将需要选择要将文件上传到的bucket。使用以下代码: ``` boolean isExist = minioClient.bucketExists("mybucket"); if(!isExist) { minioClient.makeBucket("mybucket"); } ``` 一旦bucket被创建,您将需要上传文件。使用以下代码: ``` minioClient.putObject( "mybucket", "myobject", "/path/to/file.jpg", "image/jpeg" ); ``` 这将把“/path/to/file.jpg”上传到“mybucket”中,并将其命名为“myobject”。 最后,不要忘记关闭连接,使用以下代码: ``` minioClient.close(); ``` 以上就是用Java上传Minio图片的主要步骤,并提供了代码样例作为参考。 ### 回答2: 在使用 Java 来上传图片到 MinIO 时,有可能会遇到证书问题。这个问题通常是因为 MinIO 使用了自签名证书或者是由自己企业签发的证书而不是经过公共颁发机构(CA)签发的证书。在这种情况下,Java 客户端会认为 MinIO证书不受信任,从而出现问题解决这个问题的方法就是让 Java 客户端信任 MinIO证书。为了达到这个目的,需要做如下步骤: 1. 从 MinIO 中获取证书:首先需要从 MinIO 中获取到证书,可以通过浏览器访问 MinIO 的域名,然后用浏览器扩展将证书下载下来。 2. 将证书导入到 Java 中:在 Java 中,可以使用 keytool 命令将证书导入到 Java 的证书库中。例如,假设证书是保存在 /path/to/cert.crt,可以使用下面的命令: keytool -import -alias minio -file /path/to/cert.crt -keystore /path/to/truststore.jks 这个命令会向名为 truststore.jks 的证书库中导入证书,并命名为 minio。 3. 在 Java 中使用信任证书库:最后,需要在 Java 中使用刚才创建的证书库,以在与 MinIO 通信时验证 MinIO证书。可以通过在 Java 启动时设置 javax.net.ssl.trustStore 系统属性来实现。 例如,假设刚才创建了 /path/to/truststore.jks,可以使用下面的命令: java -Djavax.net.ssl.trustStore=/path/to/truststore.jks -jar myapp.jar 这个命令会运行名为 myapp.jar 的 Java 应用程序,并指示 Java 使用名为 truststore.jks 的证书并信任证书中的所有证书。 通过以上步骤,就可以让 Java 客户端信任 MinIO证书,从而解决证书问题并成功上传图片到 MinIO。 ### 回答3: Java上传Minio图片证书问题,涉及到如何在Java代码中使用HTTPS协议,同时将Minio证书导入到Java的KeyStore中。 首先,为了在Java中使用HTTPS协议,需要为Java Runtime配置HTTPS代理。其中关键的配置项是javax.net.ssl.trustStoreSystemProperty,它指定了Java Runtime使用的TrustStore路径。TrustStore是Java用于存储受信任的证书的地方。 其次,为了上传Minio图片,需要将Minio证书导入到Java的TrustStore中。证书可以使用Java的keytool工具导入。步骤如下: 1. 打开命令行终端,进入到Java的bin目录。 2. 执行以下命令: keytool -import -alias minio -file /path/to/minio.crt -keystore /path/to/truststore.jks 其中,minio.crt是Minio服务器的证书文件,truststore.jks是要导入证书的Java TrustStore文件。 3. 根据提示输入密码,即可将Minio证书导入到Java的TrustStore中。 完成以上步骤后,Java就可以使用HTTPS协议上传图片到Minio了。代码示例: ```java import java.io.InputStream; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; import java.security.KeyStore; import java.security.cert.X509Certificate; import java.security.cert.CertificateFactory; import java.net.URL; public class MinioUploader { public static void main(String[] args) { try { // Load truststore KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); InputStream trustStoreIS = new FileInputStream("/path/to/truststore.jks"); trustStore.load(trustStoreIS, "truststore_password".toCharArray()); // Create SSL context using truststore TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); // Upload image to Minio server URL url = new URL("https://minio.example.com/images/image.jpg"); HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); connection.setSSLSocketFactory(sslContext.getSocketFactory()); connection.setRequestMethod("PUT"); connection.setDoOutput(true); InputStream imageIS = new FileInputStream("/path/to/image.jpg"); byte[] buffer = new byte[imageIS.available()]; imageIS.read(buffer); connection.getOutputStream().write(buffer); imageIS.close(); // Print server response int responseCode = connection.getResponseCode(); InputStream responseIS = connection.getInputStream(); byte[] responseBuffer = new byte[responseIS.available()]; responseIS.read(responseBuffer); String responseString = new String(responseBuffer); System.out.println("Response code: " + responseCode); System.out.println("Response body: " + responseString); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码中,在函数开头加载了TrustStore,并利用TrustStore创建了SSLContext。在上传图片时,使用SSLContext来与Minio服务器建立加密连接。同时,也可以看到在代码中使用了证书的Alias来指示使用的是Minio证书。对于Java的开发者来说,在开发代码时,上传Minio图片并不困难,只需要遵循以上步骤即可保证上传的数据得到加密保护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值