1. Résolvez l'exception SSL : le certificat pour
1.1 Description du problème
Récemment, je travaille sur un projet de service client Q&A intelligent, qui est connecté à l'interface Yunwen. Ensuite, l'interface Yunwen est connectée en utilisant la méthode https. Avant, c'était toujours la méthode http. Le changement soudain a provoqué une erreur lors de l'accès au projet. Le message d'erreur est tel qu'indiqué dans le titre. C'est un problème avec le certificat SSL.
1.2 Solutions
Première solution :
Lorsque vous rencontrez un problème, commencez par le déboguer et constatez que l'erreur est causée par une classe d'outils dans le projet. Il semble que ce soit parce qu'il n'est pas prévu d'utiliser un certificat par défaut. Je ne sais pas si je comprends bien. Quoi qu'il en soit, après l'avoir modifié selon le code suivant, tout va bien, mais il y aura encore d'autres problèmes, que vous pouvez lire ci-dessous.
Sur le code précédent, c'est-à-dire le code qui envoie la requête http, ajoutez les deux instructions suivantes. Sa fonction principale est de configurer HttpClient avec une connexion sécurisée SSL/TSL.
SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);
httpclient = HttpClients.custom().setSSLSocketFactory(scsf).build();
Le code corrigé est le suivant :
public static String doGet(String url, Map<String, Object> params) throws IOException {
String apiUrl = url;
StringBuffer param = new StringBuffer();
int i = 0;
for (String key : params.keySet()) {
if (i == 0)
param.append("?");
else
param.append("&");
param.append(key).append("=").append(params.get(key));
i++;
}
apiUrl += param;
String result = null;
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);
httpclient = HttpClients.custom().setSSLSocketFactory(scsf).build();
HttpGet httpPost = new HttpGet(apiUrl);
HttpResponse response = httpclient.execute(httpPost);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
result = IOUtils.toString(instream, "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
} finally {
if(httpclient!=null) {
httpclient.close();
}
}
return result;
}
Deuxième solution :
Cette solution a été proposée par ChatGPT et je n'ai pas vérifié son exactitude.
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import javax.net.ssl.SSLContext;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class HTTPSRequestExample {
public static void main(String[] args) {
try {
// 创建自定义SSLContext
SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial((chain, authType) -> true).build();
// 创建SSLConnectionSocketFactory并禁用主机名验证
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
// 使用自定义SSLConnectionSocketFactory创建HttpClient
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();
// 创建要发送的GET请求
HttpGet request = new HttpGet("https://example.com");
// 发送请求并获取响应
CloseableHttpResponse response = httpClient.execute(request);
// 读取响应内容
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line;
StringBuilder content = new StringBuilder();
while ((line = reader.readLine()) != null) {
content.append(line);
}
// 输出响应内容
System.out.println("Response Content: " + content.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (response != null) {
response.close();
}
if (httpClient != null) {
httpClient.close();
}
}
}
}
1.3 Références
documentation de référence de stackoverflow
2. De nouveaux problèmes surgissent
Après avoir modifié le code ci-dessus, de nouveaux problèmes apparaîtront. Les images, les audios et les vidéos ne semblent pas fonctionner. F12 signalera une erreur sur la console, qui semble être liée au certificat. En même temps, le chemin demandé sera être remplacé par un chemin local. L'erreur est signalée comme indiqué dans la figure ci-dessous.