Java 클라이언트에서 서버의 자체 서명 SSL 인증서 수락
표준질문처럼 보이지만 어디에서도 뚜렷한 방향을 찾을 수 없었다.
자바 코드가 자체 서명(또는 만료된) 인증서가 있는 서버에 연결하려고 시도 중임.코드는 다음과 같은 오류를 보고한다.
[HttpMethodDirector] I/O exception (javax.net.ssl.SSLHandshakeException) caught
when processing request: sun.security.validator.ValidatorException: PKIX path
building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
내가 알기로는, 나는 키툴을 사용하고 자바에게 이 연결을 허용해도 괜찮다고 말해야 해.
이 문제를 해결하기 위한 모든 지침은 다음과 같은 키툴에 능숙하다고 가정한다.
서버의 개인 키를 생성하여 keystore로 가져오기
자세한 지시사항을 게시할 수 있는 사람 있어?
나는 유닉스를 운영하고 있으니 bash 스크립트가 가장 좋을 거야.
중요한지는 모르겠지만, jboss로 실행된 코드.
기본적으로 JVM 신뢰 저장소에 자체 서명된 인증서를 추가하거나 클라이언트를 다음으로 구성하는 두 가지 옵션이 있으며
옵션 1
브라우저에서 인증서를 내보낸 후 JVM 신뢰 저장소로 가져오기(신뢰 체인 설정):
<JAVA_HOME>\bin\keytool -import -v -trustcacerts
-alias server-alias -file server.cer
-keystore cacerts.jks -keypass changeit
-storepass changeit
옵션 2
인증서 유효성 검사 사용 안 함:
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
}
// Now you can access an https URL without having the certificate in the truststore
try {
URL url = new URL("https://hostname/index.html");
} catch (MalformedURLException e) {
}
나는 옵션 #2를 전혀 추천하지 않는다.트러스트 매니저를 비활성화하면 SSL의 일부분이 파괴되고 중간 공격에서 인간에게 취약해진다.옵션 #1을 선호하거나, 더 나은 것은 서버가 잘 알려진 CA에 의해 서명한 "실제" 인증서를 사용하도록 하는 것이다.
모든 인증서를 신뢰하는 것에는 더 나은 대안이 있다.만들기TrustStore
하고 이를 하여 특정인더서(人人圖書)를 것SSLContext
어디서부터 얻을 수 있는 것SSLSocketFactory
출발하다HttpsURLConnection
여기에 전체 코드가 있다.
File crtFile = new File("server.crt");
Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(crtFile));
// Or if the crt-file is packaged into a jar file:
// CertificateFactory.getInstance("X.509").generateCertificate(this.class.getClassLoader().getResourceAsStream("server.crt"));
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());
또는 로딩할 수 있으며KeyStore
파일에서 직접 또는 신뢰할 수 있는 원본에서 X.509 인증서를 검색하십시오.
이 코드를 사용하여 다음 위치에 있는 인증서를 확인하십시오.cacerts
사용할 수 없다.이 특이사항HttpsURLConnection
이 특정 인증서만 신뢰할 수 있음.
Apache HttpClient 4.5는 자체 서명 인증서 수락 지원:
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(new TrustSelfSignedStrategy())
.build();
SSLConnectionSocketFactory socketFactory =
new SSLConnectionSocketFactory(sslContext);
Registry<ConnectionSocketFactory> reg =
RegistryBuilder.<ConnectionSocketFactory>create()
.register("https", socketFactory)
.build();
HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse sslResponse = httpClient.execute(httpGet);
이것은 다음을 사용할 SSL 소켓 팩토리를 만든다.TrustSelfSignedStrategy
는 사용자 지정 연결 관리자에 등록한 후 해당 연결 관리자를 사용하여 HTTP GET를 실행한다.
"생산에서 이러지 말라"고 외치는 사람들의 말에 동의하지만, 생산 밖에서 자체 서명된 인증서를 받아들이는 사용 사례가 있다. 우리는 이를 자동화된 통합 테스트에 사용하기 때문에 생산 하드웨어에서 실행되지 않을 때에도 SSL(생산에서와 같이)을 사용하고 있다.
이 문제를 다음으로 기본 JVM 신뢰 호스트에 속하지 않는 인증서 공급자로 추적한 경우JDK 8u74
. 제공자는 www.identrust.com이지만, 내가 연결하려고 했던 도메인은 아니었다.그 도메인은 이 제공자로부터 인증서를 받았었다.자세한 내용은 교차 루트가 JDK/JRE의 기본 목록으로 신뢰 범위를 가리킬 것인가?를 참조하십시오. - 두 개의 항목을 읽어 보십시오.또한 암호화를 지원하는 브라우저 및 운영 체제를 참조하십시오.
그래서 관심 있는 도메인으로 연결하기 위해서, 그 도메인에서 발급된 인증서를 가지고 있었다.identrust.com
나는 다음과 같은 절차를 밟았다.기본적으로 identrust.com을 받아야 했다.DST Root CA X3
해야 할 인데, JVM에서 신뢰해야 할 자격증이다.Apache HttpComponents 4.5를 사용하여 다음과 같이 할 수 있었다.
1: 인증서 체인 다운로드 지침의 indettrust에서 인증서를 얻으십시오.DST 루트 CA X3 링크를 클릭하십시오.
2: 문자열을 "DST 루트 CA X3.pem" 파일에 저장하십시오.파일의 처음과 끝에 "-----BEGIN Certificate---" 및 "-----END Certificate---" 줄을 추가하십시오.
3: 다음 명령을 사용하여 java keystore 파일 cacerts.jks를 생성하십시오.
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: 결과 cacerts.jks keystore를 Java/(maven) 응용 프로그램의 리소스 디렉터리에 복사하십시오.
이 5 하십시오.이렇게 하면 에서 발급된 인증서를 가진 모든 도메인의 문제가 해결된다.indetrust.com
keystore. oracled oracled JRE에 하고 있다.
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
프로젝트가 구축되면 cacerts.jks가 클래스 경로로 복사되어 로드될 것이다.현시점에서는 다른 ssl 사이트와 테스트하지 않았지만, 만약 위의 코드가 이 인증서에 "체크"된다면 그들 역시 작동하겠지만, 다시 한 번, 나는 잘 모르겠다.
참조:사용자 지정 SSL 컨텍스트 및 Java Https로 자체 서명된 인증서를 수락하는 방법URLConnection?
기본 소켓 팩토리(IMO가 나쁜 것)를 설정하는 대신, yhis는 당신이 열려고 하는 모든 SSL 연결이 아니라 현재 연결에 영향을 줄 것이다.
URLConnection connection = url.openConnection();
// JMD - this is a better way to do it that doesn't override the default SSL factory.
if (connection instanceof HttpsURLConnection)
{
HttpsURLConnection conHttps = (HttpsURLConnection) connection;
// Set up a Trust all manager
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager()
{
public java.security.cert.X509Certificate[] getAcceptedIssuers()
{
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType)
{
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType)
{
}
} };
// Get a new SSL context
SSLContext sc = SSLContext.getInstance("TLSv1.2");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
// Set our connection to use this SSL context, with the "Trust all" manager in place.
conHttps.setSSLSocketFactory(sc.getSocketFactory());
// Also force it to trust all hosts
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// and set the hostname verifier.
conHttps.setHostnameVerifier(allHostsValid);
}
InputStream stream = connection.getInputStream();
모든 SSL 인증서 신뢰:- 테스트 서버에서 테스트하려는 경우 SSL을 무시할 수 있음.그러나 이 코드를 생산에 사용하지 마십시오.
public static class NukeSSLCerts {
protected static final String TAG = "NukeSSLCerts";
public static void nuke() {
try {
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] myTrustedAnchors = new X509Certificate[0];
return myTrustedAnchors;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
} catch (Exception e) {
}
}
}
활동 또는 응용 프로그램 클래스의 onCreate() 함수로 이 기능을 호출하십시오.
NukeSSLCerts.nuke();
이것은 안드로이드의 발리에도 사용할 수 있다.
대상 페이지에서 브라우저와 함께 자체 서명된 인증서를 다운로드하여 기본 암호로 기본 스토리지에 추가하십시오.
keytool -import -v -trustcacerts -file selfsigned.crt -alias myserver -keystore /etc/alternatives/jre/lib/security/cacerts -storepass changeit
파일 사용$JAVA_HOME/jre/lib/security/cacerts
나의 예는 오라클 리눅스 7.7 에서 왔다.
'그들'이 자체 서명된 인증서를 사용하고 있는 경우, 서버를 사용할 수 있도록 하기 위해 필요한 조치를 취하는 것은 그들에게 달려 있다.특히 그것은 오프라인에서 신뢰할 수 있는 방법으로 인증서를 제공하는 것을 의미한다.그러니 그들이 그렇게 하도록 해.그런 다음 JSSE 참조 가이드에 설명된 키툴을 사용하여 신뢰 저장소로 가져오십시오.여기에 게시된 불안정한 TrustManager에 대해서는 생각도 하지 마십시오.
EDIT 내가 여기서 쓴 것을 실제로 읽지 않은 열일곱 명의 다운보터(!)와 아래의 수많은 코멘터들의 이익을 위해, 이것은 자기 서명된 인증서에 대한 예레미디드가 아니다.올바르게 구현했을 때 자체 서명된 인증서는 문제가 없다.단, 인증에 사용될 인증되지 않은 채널을 통해 인증서가 전달되지 않고 오프라인 프로세스를 통해 안전하게 전달되는 것이 올바른 방법이다.확실히 이것은 명백한가?수천 개의 지점이 있는 은행에서부터 내 회사에 이르기까지 내가 일해 온 모든 보안 인식 조직에는 분명 분명한 일이다.절대 누구나 서명한 자체 서명된 인증서나 CA로 설정한 임의의 독립적 기구를 포함한 모든 인증서를 신뢰하는 클라이언트측 코드 기반 '솔루션'은 사실상 안전하지 않다.그것은 단지 보안을 위해 놀고 있을 뿐이다.그것은 무의미하다.당신은 누군가와의 사적인, 변조 방지, 회신 방지, 주사 방지 대화를 하고 있다.아무나.가운데에 있는 남자.가장하는 사람.아무나.그냥 일반 텍스트로 하는 게 좋을 거야.
나는 내가 전화하는 도서관에 URL을 전달한다는 문제가 있었다.url.openConnection();
존 대니얼의 대답을 각색했는데
public class TrustHostUrlStreamHandler extends URLStreamHandler {
private static final Logger LOG = LoggerFactory.getLogger(TrustHostUrlStreamHandler.class);
@Override
protected URLConnection openConnection(final URL url) throws IOException {
final URLConnection urlConnection = new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile()).openConnection();
// adapated from
// https://stackoverflow.com/questions/2893819/accept-servers-self-signed-ssl-certificate-in-java-client
if (urlConnection instanceof HttpsURLConnection) {
final HttpsURLConnection conHttps = (HttpsURLConnection) urlConnection;
try {
// Set up a Trust all manager
final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
}
@Override
public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
}
} };
// Get a new SSL context
final SSLContext sc = SSLContext.getInstance("TLSv1.2");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
// Set our connection to use this SSL context, with the "Trust all" manager in place.
conHttps.setSSLSocketFactory(sc.getSocketFactory());
// Also force it to trust all hosts
final HostnameVerifier allHostsValid = new HostnameVerifier() {
@Override
public boolean verify(final String hostname, final SSLSession session) {
return true;
}
};
// and set the hostname verifier.
conHttps.setHostnameVerifier(allHostsValid);
} catch (final NoSuchAlgorithmException e) {
LOG.warn("Failed to override URLConnection.", e);
} catch (final KeyManagementException e) {
LOG.warn("Failed to override URLConnection.", e);
}
} else {
LOG.warn("Failed to override URLConnection. Incorrect type: {}", urlConnection.getClass().getName());
}
return urlConnection;
}
}
이 클래스를 사용하여 다음을 사용하여 새 URL을 만들 수 있다.
trustedUrl = new URL(new URL(originalUrl), "", new TrustHostUrlStreamHandler());
trustedUrl.openConnection();
이는 지역화되어 기본값을 대체하지 않는다는 장점이 있다.URL.openConnection
.
수락된 대답은 괜찮지만, Mac에서 IntelliJ를 사용하고 있었는데, 이 제품을 사용하여 작동시킬 수 없었기 때문에, 여기에 뭔가를 덧붙이고 싶다.JAVA_HOME
경로 변수
Java Home은 IntelliJ에서 애플리케이션을 실행할 때 달랐던 것으로 밝혀졌다.
정확히 어디에 있는지 알아내기 위해서, 당신은 단지 할 수 있다.System.getProperty("java.home")
신뢰할 수 있는 인증서를 읽으려면
승인된 답변에는 옵션 3이 필요하다.
또한 옵션 2는 끔찍하다.이것은 FALSE 보안의식을 제공하기 때문에 (생산에서) 절대 사용되어서는 안 된다.옵션 2 대신 HTTP를 사용하십시오.
옵션 3
자체 서명 인증서를 사용하여 Https를 연결하십시오.
예를 들면 다음과 같다.
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.KeyStore;
/*
* Use a SSLSocket to send a HTTP GET request and read the response from an HTTPS server.
* It assumes that the client is not behind a proxy/firewall
*/
public class SSLSocketClientCert
{
private static final String[] useProtocols = new String[] {"TLSv1.2"};
public static void main(String[] args) throws Exception
{
URL inputUrl = null;
String certFile = null;
if(args.length < 1)
{
System.out.println("Usage: " + SSLSocketClient.class.getName() + " <url>");
System.exit(1);
}
if(args.length == 1)
{
inputUrl = new URL(args[0]);
}
else
{
inputUrl = new URL(args[0]);
certFile = args[1];
}
SSLSocket sslSocket = null;
PrintWriter outWriter = null;
BufferedReader inReader = null;
try
{
SSLSocketFactory sslSocketFactory = getSSLSocketFactory(certFile);
sslSocket = (SSLSocket) sslSocketFactory.createSocket(inputUrl.getHost(), inputUrl.getPort() == -1 ? inputUrl.getDefaultPort() : inputUrl.getPort());
String[] enabledProtocols = sslSocket.getEnabledProtocols();
System.out.println("Enabled Protocols: ");
for(String enabledProtocol : enabledProtocols) System.out.println("\t" + enabledProtocol);
String[] supportedProtocols = sslSocket.getSupportedProtocols();
System.out.println("Supported Protocols: ");
for(String supportedProtocol : supportedProtocols) System.out.println("\t" + supportedProtocol + ", ");
sslSocket.setEnabledProtocols(useProtocols);
/*
* Before any data transmission, the SSL socket needs to do an SSL handshake.
* We manually initiate the handshake so that we can see/catch any SSLExceptions.
* The handshake would automatically be initiated by writing & flushing data but
* then the PrintWriter would catch all IOExceptions (including SSLExceptions),
* set an internal error flag, and then return without rethrowing the exception.
*
* This means any error messages are lost, which causes problems here because
* the only way to tell there was an error is to call PrintWriter.checkError().
*/
sslSocket.startHandshake();
outWriter = sendRequest(sslSocket, inputUrl);
readResponse(sslSocket);
closeAll(sslSocket, outWriter, inReader);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
closeAll(sslSocket, outWriter, inReader);
}
}
private static PrintWriter sendRequest(SSLSocket sslSocket, URL inputUrl) throws IOException
{
PrintWriter outWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sslSocket.getOutputStream())));
outWriter.println("GET " + inputUrl.getPath() + " HTTP/1.1");
outWriter.println("Host: " + inputUrl.getHost());
outWriter.println("Connection: Close");
outWriter.println();
outWriter.flush();
if(outWriter.checkError()) // Check for any PrintWriter errors
System.out.println("SSLSocketClient: PrintWriter error");
return outWriter;
}
private static void readResponse(SSLSocket sslSocket) throws IOException
{
BufferedReader inReader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
String inputLine;
while((inputLine = inReader.readLine()) != null)
System.out.println(inputLine);
}
// Terminate all streams
private static void closeAll(SSLSocket sslSocket, PrintWriter outWriter, BufferedReader inReader) throws IOException
{
if(sslSocket != null) sslSocket.close();
if(outWriter != null) outWriter.close();
if(inReader != null) inReader.close();
}
// Create an SSLSocketFactory based on the certificate if it is available, otherwise use the JVM default certs
public static SSLSocketFactory getSSLSocketFactory(String certFile)
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException
{
if (certFile == null) return (SSLSocketFactory) SSLSocketFactory.getDefault();
Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(new File(certFile)));
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
}
이것은 전체 문제에 대한 해결책은 아니지만, 오라클은 이 키툴을 사용하는 방법에 대한 상세한 문서를 가지고 있다.이렇게 하면 어떻게 해야 하는지 설명이 된다.
- 키툴을 사용하다
- 키툴을 사용하여 인증서/자체 서명된 인증서를 생성한다.
- 생성된 인증서를 Java 클라이언트로 가져오기.
https://docs.oracle.com/cd/E54932_01/doc.705/e54936/cssg_create_ssl_cert.htm#CSVSG178
상단 코멘트가 제안한 키툴을 사용하는 대신 RHEL 6의 최신 버전부터 업데이트-ca-trust를 사용할 수 있다. 인증서를 펨 형식으로 가져야 한다.그러면
trust anchor <cert.pem>
/etc/pki/ca-trust/source/cert.p11-kit를 편집하고 "인증서 카테고리: 기타 입력"을 "인증서 카테고리: 권한"으로 변경하십시오(또는 스크립트에서 이 작업을 수행하려면 sed를 사용하십시오).그럼 하다
update-ca-trust
몇 가지 주의 사항:
- 내 RHEL 6 서버에서 "신뢰"를 찾을 수 없었고 yu는 설치를 제안하지 않았다.결국 RHEL 7 서버에서 사용하게 되었고 .p11-kit 파일을 복사하게 되었다.
- 너를 위해 이 일을 하기 위해서는, 너는 해야 할 필요가 있다.
update-ca-trust enable
/etc/pki/java/cacerts를 /etc/pki/ca-trust/extracted/java/cacerts를 가리키는 심볼 링크로 대체한다.(따라서 전자를 먼저 백업하는 것이 좋을 것이다.) - Java 클라이언트가 다른 위치에 저장된 캐서트를 사용하는 경우, 수동으로 /etc/pki/ca-trust/extracted/java/cacerts에 대한 symlink로 바꾸거나 해당 파일로 바꾸십시오.
코틀린의 변종
@SuppressLint("CustomX509TrustManager", "TrustAllX509TrustManager")
fun ignoreSsl() {
val trustAllCerts: Array<TrustManager> = arrayOf(
object : X509TrustManager {
override fun getAcceptedIssuers(): Array<X509Certificate>? = null
override fun checkClientTrusted(certs: Array<X509Certificate?>?, authType: String?) {}
override fun checkServerTrusted(certs: Array<X509Certificate?>?, authType: String?) {}
})
val sc = SSLContext.getInstance("SSL")
sc.init(null, trustAllCerts, SecureRandom())
HttpsURLConnection.setDefaultSSLSocketFactory(sc.socketFactory)
}
파티에 늦으면 RestTemplate 수준에서 비활성화하면 된다.이 TrustStrategy는 모든 인증서를 신뢰하며, NoopHostnameVerifier()를 사용하여 호스트 이름 확인을 사용하지 않도록 설정한다는 점에 유의하십시오.
public RestTemplate getRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (x509Certificates, s) -> true;
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return new RestTemplate(requestFactory);
}
'Programing' 카테고리의 다른 글
Vue.js - 요소 UI - 폼 유효성 검사 상태를 확인하는 방법 (0) | 2022.04.17 |
---|---|
무료()가 내 어레이의 길이를 알고 있다면 왜 내 코드로 요청할 수 없는가? (0) | 2022.04.17 |
유닉스 도메인 소켓 VS 명명된 파이프? (0) | 2022.04.17 |
JVM에서 기본 로캘을 설정하는 방법 (0) | 2022.04.17 |
vuej에서 클릭한 버튼에만 로딩을 추가하려면 어떻게 해야 하는가? (0) | 2022.04.17 |