"Java.security.cert.CertificateException: Konu alternatif adı yok" hatası nasıl düzeltilir?


109

HTTPS aracılığıyla bir web hizmeti kullanan bir Java web hizmeti istemcim var.

import javax.xml.ws.Service;

@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
    extends Service
{

    public ISomeService() {
        super(__getWsdlLocation(), ISOMESERVICE_QNAME);
    }

Hizmet URL'sine ( https://AAA.BBB.CCC.DDD:9443/ISomeService) bağlandığımda istisna alıyorum java.security.cert.CertificateException: No subject alternative names present.

Düzeltmek için önce çalıştırdım openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txtve aşağıdaki içeriği dosyadan aldım 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, şimdi ihtiyacım var

  1. parçası özü certs.txtarasında -----BEGIN CERTIFICATE-----ve -----END CERTIFICATE-----,
  2. sertifika adı eşit olacak şekilde değiştirin AAA.BBB.CCC.DDDve
  3. ardından keytool -importcert -file fileWithModifiedCertificate( fileWithModifiedCertificate1. ve 2. işlemlerin sonucu) kullanarak sonucu içe aktarın .

Bu doğru mu?

Öyleyse, 1. adımdaki sertifikanın IP tabanlı adres ( AAA.BBB.CCC.DDD) ile tam olarak çalışmasını nasıl sağlayabilirim ?

Güncelleme 1 (2013/10/23 15:37 MSK): Bir bir cevap olarak benzer soruya , şu okuyun:

Bu sunucunun kontrolü sizde değilse, ana bilgisayar adını kullanın (mevcut sertifikada bu ana bilgisayar adıyla eşleşen en az bir CN olması koşuluyla).

"Kullanmak" tam olarak ne anlama geliyor?

Yanıtlar:


154

Burada sunulan yaklaşımı kullanarak HTTPS kontrollerini devre dışı bırakarak sorunu çözdüm :

Aşağıdaki kodu ISomeServicesınıfa koydum :

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/ISomeServiceYalnızca test amaçlı kullandığım için yeterince iyi bir çözüm.


Yukarıda bahsedilen bağlantıda bahsedilen yaklaşım engellenmiş gibi görünüyor ( nakov.com/blog/2009/07/16/… ). Bağlantıyı herkes güncelleyebilir mi?
John

Bu işlemi yaparken doğrulamayı devre dışı bırakmayı denedim, ancak SSL protokolleri için tarayıcı doğrulaması (Poodle güvenlik açığı) bana şunu veriyor: ssl_error_no_cypher_overlap. Herhangi bir fikir?
will824

Merhaba, org.springframework.web.client.HttpClientErrorException: 403 Yasak

73
HTTPS kontrolünü devre dışı bırakmak bir "çözüm" değildir. Bir "yama" bulduğumu söylemelisin.
Jus12

2
Bu, Pre_prod ve Production'da güvenlik açığına neden olacaktır. 1. Windows ana bilgisayar dosyasında ana bilgisayar girişi yapın 2. Veya sertifikalardaki Konu alternatif adları alanlarına IP veya FQDN adları ekleyin
Shankar

34

Aynı sorunu yaşadım ve bu kodla çözdüm. Bu kodu web servislerime yapılan ilk aramadan önce koydum.

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier(){

    public boolean verify(String hostname,
            javax.net.ssl.SSLSession sslSession) {
        return hostname.equals("localhost");
    }
});

Basit ve iyi çalışıyor.

İşte orijinal kaynak.


3
Veya return hostname.equals("localhost");yapmak istediğiniz buysa , doğrulama () işlevinin tüm gövdesini ile değiştirebilirsiniz . ifTamamen gereksiz olduğunu.
bir CVn

Bu, uygun bir sertifikaya sahip olmayan bir satıcının test ortamında test etmemizi sağlayan basit ve hızlı bir düzeltmeydi. Milyonlarca kez teşekkürler!
dacDave

@ JuanM.Hidalgo benim için çalıştı, kodu aramadan hemen önce yukarıya yerleştirdi HttpsURLConnection connection = (HttpsURLConnection) obj.openConnection();. Ayrıca, bu her sertifikayı yok sayıyor mu? Böyle bir çözümün güvenlik açısından savunmasız olduğunu gördüğümden beri. Teşekkür ederim!
ThunderWiring

bu cevap SSL sertifikası istisnamı ve LDH olmayan karakterler sorunumu çözdü, açık JDK'da rapor edilen bir hata olduğunu görebiliyordum, bugs.openjdk.java.net/browse/JDK-8170265
Akhil S Kamath

28

Bu eski bir soru, ancak JDK 1.8.0_144'ten jdk 1.8.0_191'e geçerken aynı sorunu yaşadım

Değişiklik günlüğünde bir ipucu bulduk:

Değişiklik günlüğü

Bu sorunu çözmemize yardımcı olan aşağıdaki ek sistem özelliğini ekledik:

-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true

25

Sertifika kimliğinin doğrulanması, istemcinin taleplerine göre gerçekleştirilir.

İstemciniz kullandığında https://xxx.xxx.xxx.xxx/something(burada xxx.xxx.xxx.xxxbir IP adresi bulunur), sertifika kimliği bu IP adresine göre kontrol edilir (teorik olarak, yalnızca bir IP SAN uzantısı kullanılarak).

Sertifikanızda IP SAN yoksa, ancak DNS SAN'ları varsa (veya Konu DN'sinde bir Ortak Ad olan DNS SAN yoksa), istemcinizin bunun yerine bu ana bilgisayar adına sahip bir URL (veya bir ana bilgisayar adı) kullanmasını sağlayarak bunun çalışmasını sağlayabilirsiniz. birden fazla olası değer varsa, sertifika geçerli olacaktır). Örneğin, bir adınız varsa www.example.com, kullanın https://www.example.com/something.

Elbette, bu IP adresine çözümlemek için bu ana bilgisayar adına ihtiyacınız olacak.

Ek olarak, herhangi bir DNS SAN varsa, Konu DN'sindeki CN yok sayılacaktır, bu nedenle bu durumda DNS SAN'larından biriyle eşleşen bir ad kullanın.


1
Hizmete üzerinden erişemiyorum http://www.example.com/someservice. O IP tabanlı adres (çalışmak için sertifika için sırayla düzelteyim mi https://AAA.BBB.CCC.DDD:9443/ISomeService), tüm set gerek CNalanları AAA.BBB.CCC.DDD(replace someSubdomain.someorganisation.comtarafından AAA.BBB.CCC.DDDyukarıdaki dosyada) ve elde edilen sertifika dosyasını içe?
Mentiflectax

Sunucunun kontrolü sizde değilse, CN veya sertifika hakkında hiçbir şey yapamazsınız.
Bruno

ip adresine test amacıyla erişmek için /etc/hostsdosyanızı geçici olarak veya eşdeğerini değiştirebilirsiniz
tyoc213

1
Kodumda isteği genel bir IP'ye gönderiyordum, ancak CN sertifikası bir ana bilgisayar adıydı. Kodumda IP'yi ana bilgisayar adıyla değiştirdim ve / etc / hostsmı bu ana bilgisayar adını IP ile ilişkilendirecek şekilde yapılandırdım. Çözüldü!
Leopold Gault

15

Sertifikayı içe aktarmak için:

  1. Sertifikayı sunucudan çıkarın, örn. openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txtBu, sertifikaları PEM formatında alacaktır.
  2. Sertifikayı DER formatına dönüştürün, çünkü keytool'un beklediği şey budur, ör. openssl x509 -in certs.txt -out certs.der -outform DER
  3. Şimdi bu sertifikayı sistem varsayılan 'cacert' dosyasına aktarmak istiyorsunuz. Java yüklemeniz için sistem varsayılan 'cacerts' dosyasını bulun. Bir göz atın varsayılan java kurulum cacerts yerini nasıl elde?
  4. Sertifikaları o cacerts dosyasına aktarın: sudo keytool -importcert -file certs.der -keystore <path-to-cacerts>Varsayılan cacerts şifresi 'changeit'tir.

Sertifika bir FQDN için verilmişse ve Java kodunuzdaki IP adresine bağlanmaya çalışıyorsanız, bu muhtemelen sertifikanın kendisiyle uğraşmak yerine kodunuzda düzeltilmelidir. FQDN ile bağlanmak için kodunuzu değiştirin. FQDN, geliştirme makinenizde çözümlenemiyorsa, onu ana bilgisayar dosyanıza ekleyin veya makinenizi bu FQDN'yi çözebilecek DNS sunucusu ile yapılandırın.


"FQDN geliştirme makinenizde çözümlenemiyorsa, onu ana bilgisayar dosyanıza ekleyin" - yardımcı oldu. Çok teşekkürler!
Woland

Ben de aynı şeyi yaptım ama yine de sorun devam ediyor. Bu yaklaşımı kullanarak yapılabilecek başka bir şey var mı?
pkgajulapalli

9

Kodda herhangi bir değişiklik yapmak veya burada diğer yanıtların önerdiğinden farklı olarak SSL'yi devre dışı bırakmak yerine, konu alt adlarını sertifikaya ekleyerek bu sorunu doğru bir şekilde düzelttim. İstisnanın "Konu alternatif adları eksik" olduğunu açıkça görüyorsanız, doğru yol onları eklemek olmalıdır

Adım adım anlamak için lütfen bu bağlantıya bakın .

Yukarıdaki hata, JKS dosyanızın, uygulamaya erişmeye çalıştığınız gerekli etki alanının eksik olduğu anlamına gelir.Birden fazla etki alanı eklemek için Açık SSL ve anahtar aracını kullanmanız gerekecektir.

  1. Openssl.cnf dosyasını geçerli bir dizine kopyalayın
  2. echo '[ subject_alt_name ]' >> openssl.cnf
  3. echo 'subjectAltName = DNS:example.mydomain1.com, DNS:example.mydomain2.com, DNS:example.mydomain3.com, DNS: localhost'>> openssl.cnf
  4. 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
  5. Genel anahtar (.pem) dosyasını PKS12 formatına aktarın. Bu sizden parola isteyecektir

    openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -in
    self-signed.pem -inkey private.key -name myalias -out keystore.p12
    
  6. Kendinden imzalı PEM'den (Anahtar Deposu) bir .JKS oluşturun

    keytool -importkeystore -destkeystore keystore.jks -deststoretype PKCS12 -srcstoretype PKCS12 -srckeystore keystore.p12
  7. Yukarıdaki Anahtar Deposu veya JKS dosyasından bir Sertifika oluşturun

    keytool -export -keystore keystore.jks -alias myalias -file selfsigned.crt
  8. Yukarıdaki sertifika Kendinden İmzalı olduğundan ve CA tarafından doğrulanmadığından, Truststore'a eklenmesi gerekir (Windows için MAC için aşağıdaki konumda Cacerts dosyası, JDK'nızın nerede kurulu olduğunu öğrenin.)

    sudo keytool -importcert -file selfsigned.crt -alias myalias -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

Bu bağlantıda burada yayınlanan orijinal cevap .


4

Tüm SSL Doğrulamasını devre dışı bırakmak istemeyebilirsiniz ve bu nedenle, alternatife göre biraz daha az korkutucu olan ana bilgisayar adı doğrulamasını devre dışı bırakabilirsiniz:

HttpsURLConnection.setDefaultHostnameVerifier(
    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

[DÜZENLE]

Conapart3 tarafından belirtildiği gibi SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERartık kullanımdan kaldırılmıştır, bu nedenle daha sonraki bir sürümde kaldırılabilir, bu nedenle gelecekte tüm doğrulamanın kapalı olduğu herhangi bir çözümden uzaklaşacağımı söylesem de gelecekte kendinizinkini almaya zorlanabilirsiniz.


2
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERartık kullanımdan kaldırıldı.
conapart3

3

Bu hatayı alma ile ilgili sorunum, sadece "qatest / webService" yerine "qatest.ourCompany.com/webService" tam URL'si kullanılarak çözüldü. Bunun nedeni, güvenlik sertifikamızın "* .ourCompany.com" gibi bir joker karaktere sahip olmasıdır. Tam adresi girdikten sonra istisna ortadan kalktı. Bu yardımcı olur umarım.


2

Https://stackoverflow.com/a/53491151/1909708 adresinde zaten yanıtladınız .

Bu başarısız olur çünkü ne sertifika ortak adı ( CNsertifikada Subject) ne de alternatif adlardan herhangi biri ( Subject Alternative Namesertifikadaki) hedef ana bilgisayar adı veya IP adresi ile eşleşmez.

Örneğin, bir JVM'den, WW.XX.YY.ZZDNS adına ( https://stackoverflow.com ) değil bir IP adresine ( ) bağlanmaya çalışırken , java truststore'da depolanan sertifika cacertsortak bir ad beklediğinden HTTPS bağlantısı başarısız olur (veya Hedef adresle eşleşmesi için stackexchange.com veya * .stackoverflow.com gibi sertifika alternatif adı.

Lütfen kontrol edin: 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();

Yukarıda, HostnameVerifierher zaman şunu döndüren gerçeklenmiş bir nesne geçti true:

new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession sslSession) {
            return true;
        }
    }

1

Spring Boot için RestTemplate:

  • org.apache.httpcomponents.httpcorebağımlılık ekle
  • NoopHostnameVerifierSSL fabrikası için kullanın :

    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);

0

Aynı hata mesajını aldıktan sonra bu soruya ulaştım. Ancak benim durumumda , aynı sunucuya yönlendirilen farklı alt etki alanlarına sahip iki URL'miz vardı ( http://example1.xxx.com/someservice ve http://example2.yyy.com/someservice ). Bu sunucu, * .xxx.com etki alanı için yalnızca bir joker karakter sertifikasına sahipti. Hizmeti ikinci etki alanı üzerinden kullanırken, bulunan sertifika (* .xxx.com) istenen etki alanıyla (* .yyy.com) eşleşmez ve hata oluşur.

Bu durumda, SSL güvenliğini düşürerek böyle bir hata mesajını gidermeye çalışmamalı, sunucuyu ve üzerindeki sertifikaları kontrol etmeliyiz.


0
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();
            }
        }
    }
}

1
lütfen kodunuza açıklayıcı metin ekleyin. Stackoverflow.com/help/how-to-answer
jasie

1
Bu bir güvenlik açığıdır. İlk etapta sertifika doğrulamayı bu şekilde devre dışı bırakırsınız. Bu çözümü kopyalayıp yapıştıran herkes, yazılımlarında bir güvenlik hatası oluşturacaktır.
Marek Puchalski

0

Springboot'ta 2 yollu SSL'den geçiyordum. Tüm doğru yapılandırma hizmetlerini tomcat sunucusu ve hizmet arayan RestTemplate yaptım. ancak "java.security.cert.CertificateException: Konu alternatif adı yok" olarak hata alıyordum

Çözümleri inceledikten sonra, JVM'nin bu sertifikaya ihtiyacı olduğunu, aksi takdirde el sıkışma hatası verdiğini öğrendim.

Şimdi, bunun JVM'ye nasıl ekleneceği.

jre / lib / security / cacerts dosyasına gidin. sunucu sertifika dosyamızı jvm'nin bu cacerts dosyasına eklememiz gerekiyor.

Windows'ta komut satırı aracılığıyla cacerts dosyasına sunucu sertifikası ekleme komutu.

C: \ Program Files \ Java \ jdk1.8.0_191 \ jre \ lib \ security> keytool -import -noprompt -trustcacerts -alias sslserver -file E: \ spring_cloud_sachin \ ssl_keys \ sslserver.cer -keystore cacerts -storepass değişikliği

Sunucu sertifikasının yüklü olup olmadığını kontrol edin:

C: \ Program Files \ Java \ jdk1.8.0_191 \ jre \ lib \ security> keytool -list -keystore cacerts

yüklü sertifikaların listesini görebilirsiniz:

daha fazla ayrıntı için: https://sachin4java.blogspot.com/2019/08/javasecuritycertcertificateexception-no.html


0

sertifikadaki CN'ye karşılık gelen ip ile ana bilgisayar girişini ekleyin

CN = bazıAltalan.someorganisation.com

şimdi url'ye erişmeye çalıştığınız IP'yi CN adıyla güncelleyin.

Benim için çalıştı.


0

Bu kod cazibe gibi çalışacak ve kodun geri kalanı için restTemple nesnesini kullanacaktır.

  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);
}

0

Hem CN hem de Konu Alternatif Adlarına (SAN) sahip bir sertifikanız olduğunda, talebinizi CN içeriğine göre yaparsanız, bu belirli içeriğin de SAN altında bulunması gerekir, aksi takdirde söz konusu hata ile başarısız olur.

Benim durumumda CN'de bir şey vardı, SAN'da başka bir şey vardı. SAN URL kullanmak zorunda kaldım ve sonra gayet iyi çalıştı.


-3

IP adresinizi, C: \ Windows \ System32 \ drivers \ etc klasöründe bulunan hosts dosyasına ekleyin. Ayrıca IP adresinin IP ve Etki Alanı Adını ekleyin. örnek: aaa.bbb.ccc.ddd abc@def.com


-5

Sorunu şu şekilde çözdüm.

1. Bir sınıf oluşturmak. Sınıfta bazı boş uygulamalar var

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. Bir yöntem oluşturmak

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();
    }
}

  1. İstisnanın atıldığı yerde disableSSL () yöntemini çağırın. İyi çalıştı.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.