gpt4 book ai didi

java - SSLHandshakeException : Certificate Unknown (Java Spring Boot & Android)

转载 作者:行者123 更新时间:2023-12-04 22:37:55 33 4
gpt4 key购买 nike

我有一个使用 HTTPS 协议(protocol)在本地运行的带有自签名证书的 Spring Boot API。
显然,当我发送 GET来自浏览器的请求,我收到 io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown服务器端报错,这是正常的,因为自签名不被浏览器信任。 postman 在 GET 上工作得很好和 POST .

但是,我想发送 GET从 Android 客户端到 Spring API 的请求,但是,即使我使用了一个函数来允许所有 SSL 流量(是的,我知道不推荐),我仍然无法向 API 发送请求,接收到以下输出:

I/STATUS: 405
I/MSG: Method Not Allowed

我以为我的 allowAllSSL()函数( HttpsTrustManager 类)可以解决这个问题,因为如果我删除函数调用,我会收到以下错误,这似乎与服务器端的错误相匹配:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:239)

现在,您可能认为 GET请求在 Spring 中没有正确实现,但事实并非如此,因为相同的 GET postman 的请求工作得很好。我相信问题仍然与证书有关,但我无法弄清楚我需要更改什么。这是我的代码:

Spring BOOT 休息 Controller
@RestController
@RequestMapping("/post")


public class PostRequest {
@GetMapping("")
public String string(@RequestBody ImageRequest newEmployee){
....
ImageRequest类只包含三个私有(private) String成员。

HttpsTrustManager 类(允许所有 SSL)
package com.example.androidclient;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class HttpsTrustManager implements X509TrustManager {
private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{};

@Override
public void checkClientTrusted(
X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {

}

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

}

public boolean isClientTrusted(X509Certificate[] chain) {
return true;
}

public boolean isServerTrusted(X509Certificate[] chain) {
return true;
}

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

public static void allowAllSSL() {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}

});

SSLContext context = null;
if (trustManagers == null) {
trustManagers = new TrustManager[]{new HttpsTrustManager()};
}

try {
context = SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}

HttpsURLConnection.setDefaultSSLSocketFactory(context != null ? context.getSocketFactory() : null);
}
}

安卓请求
        HttpsTrustManager.allowAllSSL();
URL url = new URL("https://192.168.1.106:8443/post");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
conn.setDoOutput(true);
conn.setDoInput(true);

JSONObject jsonParam = new JSONObject();
jsonParam.put("location", "Somewhere");
jsonParam.put("date", "22.05.2020");
jsonParam.put("imageBytes", strings[0]);


Log.i("JSON", jsonParam.toString());
DataOutputStream os = new DataOutputStream(conn.getOutputStream());
//os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
os.writeBytes(jsonParam.toString());

os.flush();
os.close();

Log.i("STATUS", String.valueOf(conn.getResponseCode()));
Log.i("MSG", conn.getResponseMessage());

conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return "ok";
}

最佳答案

在您的 android 应用程序中使用此功能。

请注意,这将允许所有 ssl 证书无需验证。我鼓励您在处理此处概述的自签名证书时遵循推荐的方法:https://developer.android.com/training/articles/security-ssl#java

// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

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

// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

关于java - SSLHandshakeException : Certificate Unknown (Java Spring Boot & Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61944766/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com