"java.security.cert" 수정 방법인증서.예외:제목 대체 이름이 없습니다" 오류입니까?
Java 웹 서비스 클라이언트가 있는데, 이 클라이언트는 HTTPS를 통해 웹 서비스를 소비합니다.
import javax.xml.ws.Service;
@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
extends Service
{
public ISomeService() {
super(__getWsdlLocation(), ISOMESERVICE_QNAME);
}
URLURL')에때('URL')https://AAA.BBB.CCC.DDD:9443/ISomeService
는 있습니다.java.security.cert.CertificateException: No subject alternative names present
.
치치 to치 to to to to to to to to 。openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt
에는 다음과 같은 이 있습니다.certs.txt
:
CONNECTED(00000003)
---
Certificate chain
0 s:/CN=someSubdomain.someorganisation.com
i:/CN=someSubdomain.someorganisation.com
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=someSubdomain.someorganisation.com
issuer=/CN=someSubdomain.someorganisation.com
---
No client certificate CA names sent
---
SSL handshake has read 489 bytes and written 236 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 512 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Session-ID-ctx:
Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Key-Arg : None
Start Time: 1382521838
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
AFAIK, 이제 내가
- 의
certs.txt
-----BEGIN CERTIFICATE-----
★★★★★★★★★★★★★★★★★」-----END CERTIFICATE-----
, - 이 「증명서명」이하다.
AAA.BBB.CCC.DDD
... - 결과를 됩니다.
keytool -importcert -file fileWithModifiedCertificate
서 (어디서)fileWithModifiedCertificate
1번 2)번복하다.
이거 맞는건가요?
를 IP 「1」 「IP」)로시키려면 , 요.AAA.BBB.CCC.DDD
? ) 。
업데이트 1(23.10.2013 15:37 MSK): 유사한 질문에 대한 답변에서 다음을 읽었습니다.
해당 서버를 제어할 수 없는 경우 해당 호스트 이름을 사용합니다(기존 증명서에 해당 호스트 이름과 일치하는 CN이 적어도 있는 경우).
'사용'이 정확히 무슨 뜻입니까?
다음의 어프로치를 사용해 HTTPS 체크를 무효로 해 문제를 해결했습니다.
'다'에를 넣었어요.ISomeService
링크:
static {
disableSslVerification();
}
private static void disableSslVerification() {
try
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
★★★★★★★★★★★★★★를 사용하고 있기 때문에https://AAA.BBB.CCC.DDD:9443/ISomeService
이 솔루션은 테스트 목적으로만 사용할 수 있지만 실제 가동 환경에서는 사용하지 마십시오.
「한 번에 1개의 접속」에 대해서, SSL 를 무효로 할 수도 있습니다.예를 들어 다음과 같습니다.
// don't call disableSslVerification but use its internal code:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
httpsConn.setHostnameVerifier(allHostsValid);
httpsConn.setSSLSocketFactory(sc.getSocketFactory());
}
오래된 질문이지만 JDK 1.8.0_144에서jdk 1.8.0_191로 이행할 때도 같은 문제가 있었습니다.
changelog에서 힌트를 찾았습니다.
이 문제를 해결하는 데 도움이 되는 시스템 속성을 다음과 같이 추가했습니다.
-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
나는 이 코드로 같은 문제를 해결했다.이 코드를 웹 서비스에 처음 걸기 전에 입력했습니다.
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier(){
public boolean verify(String hostname,
javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost"); // or return true
}
});
단순하고 잘 작동합니다.
원본 출처는 이쪽입니다.
증명서 ID 확인은 클라이언트가 요구하는 것에 대해 실행됩니다.
가 '하다'를 사용하는 https://xxx.xxx.xxx.xxx/something
서 (어디서)xxx.xxx.xxx.xxx
는 IP 주소입니다.이 IP 주소와 대조하여 증명서 ID가 체크됩니다(이론적으로는 IP SAN 확장만 사용).
증명서에 IP SAN이 없지만 DNS SAN이 있는 경우(또는 DNS SAN이 없는 경우 Subject DN에 공통 이름이 있는 경우), 대신 클라이언트가 해당 호스트 이름을 가진 URL(또는 여러 개의 가능한 값이 있는 경우 증명서가 유효한 호스트 이름)을 사용하도록 함으로써 이 기능을 수행할 수 있습니다.를 들어,, 증명서의 이름은 '다'입니다.www.example.com
하다, 사용하다https://www.example.com/something
.
물론 IP 주소로 해결하려면 호스트 이름이 필요합니다.
또한 DNS SAN이 있는 경우 Subject DN 내의 CN은 무시되므로 이 경우 DNS SAN 중 하나와 일치하는 이름을 사용하십시오.
증명서를 Import 하려면:
- 로부터 증명서를 「증명서」).
openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt
PEM을 사용하다 - 대로 KeyTool DER 형식).
openssl x509 -in certs.txt -out certs.der -outform DER
- 이제 이 인증서를 시스템 기본 'cacert' 파일로 가져오려고 합니다.Java 설치용 시스템 기본 'cacerts' 파일을 찾습니다.기본 Java 설치의 cacerts 위치를 얻는 방법을 참조하십시오.
- 파일에 Import합니다.「 」 「 Import 」 。
sudo keytool -importcert -file certs.der -keystore <path-to-cacerts>
불협화음을 내다
증명서가 FQDN에 대해 발행되어 Java 코드의 IP 주소로 접속하려고 할 경우 증명서 자체를 조작하는 것이 아니라 코드로 수정해야 합니다.FQDN으로 연결하도록 코드를 변경합니다. 개발 시스템에서 FQDN을 확인할 수 없는 경우 FQDN을 호스트 파일에 추가하거나 이 FQDN을 해결할 수 있는 DNS 서버로 시스템을 구성하십시오.
다른 답변과 달리 코드를 변경하거나 SSL을 사용하지 않도록 설정하는 대신 증명서에 제목 alt 이름을 추가하여 이 문제를 올바르게 해결했습니다.명확하게 표시되어 있는 경우는 예외에 「Subject alt name is missing」이라고 기재되어 있기 때문에, 그것들을 추가하는 것이 올바른 방법입니다.
위의 오류는 JKS 파일에서 응용 프로그램에 액세스하려는 필수 도메인을 찾을 수 없음을 의미합니다.여러 도메인을 추가하려면 Open SSL과 주요 도구를 사용해야 합니다.
- openssl.cnf를 현재 디렉토리에 복사합니다.
echo '[ subject_alt_name ]' >> openssl.cnf
echo 'subjectAltName = DNS:example.mydomain1.com, DNS:example.mydomain2.com, DNS:example.mydomain3.com, DNS: localhost'>> openssl.cnf
openssl req -x509 -nodes -newkey rsa:2048 -config openssl.cnf -extensions subject_alt_name -keyout private.key -out self-signed.pem -subj '/C=gb/ST=edinburgh/L=edinburgh/O=mygroup/OU=servicing/CN=www.example.com/emailAddress=postmaster@example.com' -days 365
공개 키(.pem) 파일을 PKS12 형식으로 내보냅니다.비밀번호를 입력하도록 요구됩니다.
openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -in self-signed.pem -inkey private.key -name myalias -out keystore.p12
를 만듭니다.자기서명 PEM으로부터의 JKS(키스토어)
keytool -importkeystore -destkeystore keystore.jks -deststoretype PKCS12 -srcstoretype PKCS12 -srckeystore keystore.p12
Keystore 또는 JKS 파일에서 증명서 생성
keytool -export -keystore keystore.jks -alias myalias -file selfsigned.crt
위의 증명서는 자체 서명된 것으로 CA에 의해 검증되지 않으므로 신뢰 스토어에 추가해야 합니다(MAC의 경우 아래 위치에 있는 캐시 파일, Windows의 경우 JDK 설치 위치를 확인합니다).
sudo keytool -importcert -file selfsigned.crt -alias myalias -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts
모든 ssl Verification을 디세블로 할 필요는 없습니다.따라서 hostName 검증을 디세블로 할 수 있습니다.이것에 의해서, 다른 방법보다 조금 덜 무서울 수 있습니다.
HttpsURLConnection.setDefaultHostnameVerifier(
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
[편집]
conarp3에서 한 와 같이SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
현재는 권장되지 않기 때문에 향후 버전에서는 삭제될 가능성이 있기 때문에 향후에는 자신의 것을 롤링해야 할 수도 있습니다.다만, 모든 검증이 오프 되어 있는 솔루션에서는, 일절 회피할 수 없습니다.
이 에러가 발생했을 때의 문제는, 「qatest/webService」가 아니고, 완전한 URL 「qatest.ourCompany.com/webService」를 사용하는 것으로 해결되었습니다.그 이유는 보안 증명서에 와일드카드('*.ourCompany.com')가 포함되어 있었기 때문입니다.내가 주소를 전부 입력하자 예외는 사라졌다.이게 도움이 됐으면 좋겠다.
앞에서 지적한 바와 같이 RestTemplate 오브젝트를 작성하기 직전에 다음 코드(lambda)를 추가했는데 정상적으로 동작합니다.IT는 사내 테스트 클래스 전용이기 때문에, 생산 코드의 보다 좋은 솔루션을 사용해 임하겠습니다.
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
(hostname, sslSession) -> true);
최근 "No subject alternative DNS name matching found"라는 유사한 문제에 직면했습니다.실가동 서버에서만 재현할 수 있었고 디버깅에 대한 액세스가 거의 0에 가까웠기 때문에 악몽이었습니다.나머지 환경은 정상적으로 작동하고 있었습니다.스택은 JDK 1.8.x+, JBoss EAP 7+, Java Spring Boot 앱 및 ID 제공자로서 Okta였습니다(AWS Cloud - 가상 서버에서 Okta를 사용할 수 있는 Okta에서 잘 알려진 구성을 복구할 때 SSL 핸드쉐이크가 실패했습니다).
마지막으로 사용하던 JBoss EAP 애플리케이션서버에 JVM 시스템 속성이 추가되어 있는 것을 알게 되었습니다.
jse.enableSNIExtension = false
이로 인해 TLS 접속을 확립할 수 없게 되어 다른 환경에서도 같은 시스템 속성/값을 추가하여 문제를 재현할 수 있었습니다.따라서 불필요한 속성과 가치를 제거하는 방법은 간단했습니다.
Java Security Doc에 따르면 Java 7+에서는 이 속성이 기본적으로 true로 설정되어 있습니다(https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#InstallationAndCustomization) 참조).
- jse.enableSNIExtension 시스템 속성입니다.Server Name Indication(SNI; 서버명 표시)는 RFC 4366에서 정의된 TLS 확장입니다.가상 서버로의 TLS 접속을 유효하게 합니다.가상 서버에서는, 다른 네트워크명의 복수의 서버가 단일의 기본 네트워크 주소로 호스트 됩니다.일부 오래된 SSL/TLS 벤더는 SSL/TLS 확장을 처리하지 못할 수 있습니다.이 경우 이 속성을 false로 설정하여 SNI 확장을 디세블로 합니다.
https://stackoverflow.com/a/53491151/1909708에서 이미 답변했습니다.
의 공통명 「」 「」 「」 「」)이 없기 때문에 합니다.CN
Subject
이름 )도Subject Alternative Name
IP를 사용합니다.
주소JVM」)로의WW.XX.YY.ZZ
증명서가 Java 트러스트 스토어에 저장되어 있기 때문에 HTTPS 접속이 실패합니다.cacerts
는또 ( stackoverflow.com ) 、 * .stackoverflow.com ) 。
https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#HostnameVerifier 를 확인해 주세요.
HttpsURLConnection urlConnection = (HttpsURLConnection) new URL("https://WW.XX.YY.ZZ/api/verify").openConnection();
urlConnection.setSSLSocketFactory(socketFactory());
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("GET");
urlConnection.setUseCaches(false);
urlConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession sslSession) {
return true;
}
});
urlConnection.getOutputStream();
「」를 했습니다.HostnameVerifier
반환되는 true
:
new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession sslSession) {
return true;
}
}
의 경우RestTemplate
:
org.apache.httpcomponents.httpcore
관계NoopHostnameVerifier
SSL:SSLContext sslContext = new SSLContextBuilder() .loadTrustMaterial(new URL("file:pathToServerKeyStore"), storePassword) // .loadKeyMaterial(new URL("file:pathToClientKeyStore"), storePassword, storePassword) .build(); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client); RestTemplate restTemplate = new RestTemplate(factory);
이 코드는 매력적으로 동작하며 나머지 코드에는 restTemple 객체를 사용합니다.
RestTemplate restTemplate = new RestTemplate();
TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
@Override
public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {
return true;
}
};
SSLContext sslContext = null;
try {
sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy)
.build();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
}
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
restTemplate.setRequestFactory(requestFactory);
}
자기서명증명서도 같은 문제에 직면했습니다.위의 몇 가지 해결책을 참조하여 서버의 IP 주소 등 올바른 CN을 사용하여 증명서를 재생성해 보았습니다.하지만 아직 동작하지 않았습니다.마지막으로 아래 명령어를 사용하여 증명서를 SAN 주소로 추가함으로써 증명서를 재생성하려고 했습니다.
**keytool -genkey -keyalg RSA -keystore keystore.jks -keysize 2048 -alias <IP_ADDRESS> -ext san=ip:<IP_ADDRESS>**
그 후 서버를 기동하여 아래 openssl 명령어를 사용하여 클라이언트 증명서를 다운로드했습니다.
**openssl s_client -showcerts -connect <IP_ADDRESS>:443 < /dev/null | openssl x509 -outform PEM > myCert.pem**
그런 다음 아래 명령어를 사용하여 이 클라이언트 증명서를 클라이언트머신의 자바 디폴트키 스토어 파일(cacerts)로 Import했습니다.
**keytool -import -trustcacerts -keystore /home/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64/jre/lib/security/cacerts -alias <IP_ADDRESS> -file ./mycert.pem**
같은 에러메시지를 받은 후에 이 질문을 하게 되었습니다.다만, 제 경우는, 다른 서브 도메인(http://example1.xxx.com/someservice과 http://example2.yyy.com/someservice))을 가지는 2개의 URL이 있었습니다.이 URL은 같은 서버로 보내졌습니다.이 서버에는 *.xxx.com 도메인에 대한 와일드카드 인증서가 하나만 있습니다.두 번째 도메인을 통해 서비스를 사용할 때 발견된 증명서(*.xxx.com)가 요청된 도메인(*.yyy.com)과 일치하지 않고 오류가 발생합니다.
이 경우 SSL 보안을 낮춤으로써 이러한 오류를 수정하지 않고 서버 및 증명서를 확인해야 합니다.
스프링부트에서 양방향 SSL을 사용하고 있었습니다.설정 서비스 Tomcat 서버와 서비스 발신자 RestTemplate를 모두 올바르게 만들었습니다."java.security.cert"라는 오류가 발생하였습니다.증명서예외: 제목 대체 이름이 없습니다."
솔루션을 검토한 결과 JVM에 이 증명서가 필요합니다.그렇지 않으면 핸드쉐이크 오류가 발생합니다.
이제 이것을 JVM에 추가하는 방법에 대해 설명하겠습니다.
jre/lib/security/secerts 파일로 이동합니다.서버 증명서 파일을 jvm의 이 cacerts 파일에 추가해야 합니다.
윈도의 명령줄을 통해 서버 증명서를 cacerts 파일에 추가하는 명령어.
C:\Program Files\Java\jdk1.8.0_191\jre\lib\security>keytool -import -noprompt -trustcacerts - alias sss sslserver - file E:\spring_cloud_schin\keysl_keysl_ssl 서버.cerver.cer - store cacerts -store changeit
서버 증명서가 인스톨 되어 있는 것을 확인합니다.
C:\Program Files\Java\jdk1.8.0_191\jre\lib\security> keytool - list - keystore cacerts
설치되어 있는 증명서 목록을 볼 수 있습니다.
자세한 것은, https://sachin4java.blogspot.com/2019/08/javasecuritycertcertificateexception-no.html 를 참조해 주세요.
증명서의 CN에 대응하는 IP를 사용하여 호스트엔트리를 추가합니다.
CN=some Subdomain.someorganisation.com
이제 URL에 액세스하려는 CN 이름으로 ip를 업데이트합니다.
그것은 나에게 효과가 있었다.
CN과 Subject Alternative Name(SAN; 서브젝트 대체 이름)을 모두 가진 증명서가 있는 경우 CN 콘텐츠에 따라 요청을 하면 해당 콘텐츠도 SAN 아래에 존재해야 합니다.그렇지 않으면 해당 콘텐츠는 실패하고 오류가 발생합니다.
저 같은 경우에는 산이가 다른 게 있었어요.SAN URL을 사용해야 했고, 그 후 정상적으로 작동했습니다.
상기의 문제를 해결했습니다.
Mqtt Exception (0) - javax.net.ssl.SSLHandshakeException:제목 없음증명서와 일치하는 AltNames
서버 인증서(CN=example.com 포함)에 대체 주체 이름 하나를 추가하면 다음과 같이 오류가 발생합니다.
Subject Alternative Name:
DNS: example.com
서버 증명서를 생성하기 위해 Windows에서 KeyExplector를 사용했습니다.대체 제목 이름을 추가하려면 이 링크를 따라갈 수 있습니다(추가하는 부분만 따라갑니다).
3를 백업하기 위해 Bitbucket Client 3.6.0도 Animo3991을 시켰습니다.No subject alternative names present
, 첫 번째 는 ", "를 사용해야 .alias tomcat
Bitbucket Server 렇렇etetetetet 。
keytool -genkey -keyalg RSA -sigalg SHA256withRSA -keystore keystore.jks -keysize 2048 -alias tomcat -ext san=ip:<IP_ADDRESS>
openssl s_client -showcerts -connect <IP_ADDRESS>:443 < /dev/null | openssl x509 -outform PEM > myCert.pem
keytool -import -trustcacerts -keystore /etc/pki/ca-trust/extracted/java/cacerts -alias <IP_ADDRESS> -file ./myCert.pem
public class RESTfulClientSSL {
static TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}};
public class NullHostNameVerifier implements HostnameVerifier {
/*
* (non-Javadoc)
*
* @see javax.net.ssl.HostnameVerifier#verify(java.lang.String,
* javax.net.ssl.SSLSession)
*/
@Override
public boolean verify(String arg0, SSLSession arg1) {
// TODO Auto-generated method stub
return true;
}
}
public static void main(String[] args) {
HttpURLConnection connection = null;
try {
HttpsURLConnection.setDefaultHostnameVerifier(new RESTfulwalkthroughCer().new NullHostNameVerifier());
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
String uriString = "https://172.20.20.12:9443/rest/hr/exposed/service";
URL url = new URL(uriString);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
//connection.setRequestMethod("POST");
BASE64Encoder encoder = new BASE64Encoder();
String username = "admin";
String password = "admin";
String encodedCredential = encoder.encode((username + ":" + password).getBytes());
connection.setRequestProperty("Authorization", "Basic " + encodedCredential);
connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
StringBuffer stringBuffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
stringBuffer.append(line);
}
String content = stringBuffer.toString();
System.out.println(content);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
}
호스트 파일에 IP 주소를 추가합니다.C:\Windows\폴더에 있습니다.System32\drivers\etc.또, IP 주소와 도메인명을 추가합니다.예: aaa.bbb.ccc.ddd abc@def.com
저는 다음과 같은 방법으로 문제를 해결했습니다.
1. 클래스를 만듭니다.클래스에 빈 구현이 있습니다.
class MyTrustManager implements X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
throws CertificateException {
// TODO Auto-generated method stub
}
2. 메서드의 작성
private static void disableSSL() {
try {
TrustManager[] trustAllCerts = new TrustManager[] { new MyTrustManager() };
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
- 예외가 발생한 disableSSL() 메서드를 호출합니다.그것은 잘 작동했다.
언급URL : https://stackoverflow.com/questions/19540289/how-to-fix-the-java-security-cert-certificateexception-no-subject-alternative
'programing' 카테고리의 다른 글
Google App Engine에서 Java vs Python 선택 (0) | 2022.09.04 |
---|---|
자바 이메일 주소의 가장 좋은 검증 방법은 무엇입니까? (0) | 2022.09.04 |
@Mock, @MockBean 및 Mockito.mock()의 차이점 (0) | 2022.09.04 |
목록을 쉼표로 구분하는 가장 간단한 방법? (0) | 2022.09.04 |
알파벳 순서로 문자열 비교 (0) | 2022.09.04 |