1. SSLException: <ドメイン名> の証明書がサブジェクトのいずれにも一致しません。代替エラーの問題を解決します。
1.1 問題の説明
最近、Yunwen インターフェイスに接続されたインテリジェントな Q&A カスタマー サービス プロジェクトに取り組んでいます。その後、Yunwen インターフェイスは https メソッドを使用して接続されています。以前は常に http メソッドでした。突然の変更により、アクセス時にエラーが発生しました。プロジェクト。エラーメッセージはタイトルの通りです。 SSL証明書の問題です。
1.2 解決策
最初の解決策:
問題が発生した場合、まずデバッグしてみると、プロジェクト内のツールクラスが原因でエラーが発生していることがわかりますが、デフォルトの証明書を使用する規定がないことが原因のようですが、正しく理解できているかわかりません。とにかく、次のコードに従って変更した後は問題ありませんが、以下に読むことができる他の問題がまだいくつかあります。
前のコード、つまり http リクエストを送信するコードに、次の 2 つのステートメントを追加します。その主な機能は、SSL/TSL セキュア接続を使用して HttpClient を構成することです。
SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);
httpclient = HttpClients.custom().setSSLSocketFactory(scsf).build();
修正されたコードは次のとおりです。
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;
}
2 番目の解決策:
この解決策は ChatGPT によって提供されたものですが、私はその正しさを検証していません。
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 参考文献
2. 新たな問題が発生する
上記のコードを変更すると、新たな問題が発生します。画像、オーディオ、ビデオが機能しないようです。F12 キーを押すと、証明書に関連していると思われるエラーがコンソールに報告されます。同時に、要求されたパスは、ローカルパスに変更されます。次の図に示すように、エラーが報告されます。