SSL el sıkışma uyarısı: Java 1.7.0'a yükseltildikten sonra tanınmayan_adı hatası


225

Bugün Java 1.6'dan Java 1.7'ye yükselttim. O zamandan beri SSL üzerinden web sunucumla bağlantı kurmaya çalıştığımda bir hata oluştu:

javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
    at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1288)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1904)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at java.net.URL.openStream(URL.java:1035)

İşte kod:

SAXBuilder builder = new SAXBuilder();
Document document = null;

try {
    url = new URL(https://some url);
    document = (Document) builder.build(url.openStream());
} catch (NoSuchAlgorithmException ex) {
    Logger.getLogger(DownloadLoadiciousComputer.class.getName()).log(Level.SEVERE, null, ex);  
}

Onun sadece bir test projesi thats neden izin ve kod ile güvenilmeyen sertifikaları kullanmak:

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

try {

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {

    Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, e);
} 

Https://google.com adresine başarılı bir şekilde bağlanmayı denedim . benim hatam nerede

Teşekkürler.

Yanıtlar:


304

Java 7, varsayılan olarak etkin olan SNI desteğini tanıttı. Bazı yanlış yapılandırılmış sunucuların SSL anlaşmasında "Tanınmayan Ad" uyarısı gönderdiklerini fark ettim. As @Bob Kerns söz Oracle mühendisleri bu böcek / özellik "düzeltme" reddediyorum.

Geçici çözüm olarak jsse.enableSNIExtensionözelliği ayarlamayı önerirler . Programlarınızın yeniden derlemeden çalışmasına izin vermek için uygulamanızı şu şekilde çalıştırın:

java -Djsse.enableSNIExtension=false yourClass

Özellik Java kodunda da ayarlanabilir, ancak herhangi bir SSL işleminden önce ayarlanması gerekir . SSL kitaplığı yüklendikten sonra özelliği değiştirebilirsiniz, ancak SNI durumu üzerinde herhangi bir etkisi olmaz . Çalışma zamanında SNI'yı devre dışı bırakmak için (yukarıda belirtilen sınırlamalarla), şunu kullanın:

System.setProperty("jsse.enableSNIExtension", "false");

Bu bayrağı ayarlamanın dezavantajı, SNI'nin uygulamanın her yerinde devre dışı bırakılmış olmasıdır. SNI'den yararlanmak ve yine de yanlış yapılandırılmış sunucuları desteklemek için:

  1. SSLSocketBağlanmak istediğiniz ana bilgisayar adıyla bir oluşturun . Bunu adlandıralım sslsock.
  2. Koşmaya çalış sslsock.startHandshake(). Bu, yapılana kadar engellenir veya hata üzerine bir istisna atar. Bir hata oluştuğunda startHandshake(), istisna mesajını alın. Eşitse handshake alert: unrecognized_name, yanlış yapılandırılmış bir sunucu buldunuz.
  3. unrecognized_nameUyarıyı aldığınızda (Java'da ölümcül), SSLSocketbir ana bilgisayar adı olmadan a açmayı tekrar deneyin . Bu, SNI'yi etkin bir şekilde devre dışı bırakır (sonuçta, SNI uzantısı ClientHello mesajına bir ana bilgisayar adı eklemekle ilgilidir).

WebScarab SSL proxy için bu taahhüt uygulayan Sonbahar geri kurulumu.


5
çalışıyor, teşekkürler! IntelliJ IDEA alt sürüm istemcisi HTTPS üzerinden bağlanırken aynı hatayla karşılaştı. İdea.exe.vmoptions dosyasını şu satırla güncellemeniz gerekir: -Djsse.enableSNIExtension = false
Dima

2
Java webstart için bunu kullanın: javaws -J-Djsse.enableSNIExtension = yanlış yourClass
Torsten

Ben https dinlenme sunucusu ile Jersey istemcim ile aynı sorunu vardı. Görünüşe göre senin hile kullandım ve çalıştı !! Teşekkürler!
shahshi15

4
Java 8'i merak edenler için Oracle hala davranışı değiştirmedi ve hala programcının SNI'yi
Lekensteyn

2
@Blauhirn Webhost desteğinizle iletişime geçin, yapılandırmasını düzeltmeleri gerekir. Apache kullanıyorlarsa, yapılması gereken bazı değişikliklere bakın.
Lekensteyn

89

Aynı sorunun olduğuna inandığım şey vardı. Ana bilgisayar için bir ServerName veya ServerAlias ​​içerecek şekilde Apache yapılandırmasını ayarlamak gerektiğini buldum.

Bu kod başarısız oldu:

public class a {
   public static void main(String [] a) throws Exception {
      java.net.URLConnection c = new java.net.URL("https://mydomain.com/").openConnection();
      c.setDoOutput(true);
      c.getOutputStream();
   }
}

Ve bu kod işe yaradı:

public class a {
   public static void main(String [] a) throws Exception {
      java.net.URLConnection c = new java.net.URL("https://google.com/").openConnection();
      c.setDoOutput(true);
      c.getOutputStream();
   }
}

Wireshark, TSL / SSL Merhaba sırasında Uyarı Uyarısı (Seviye: Uyarı, Açıklama: Tanınmayan Ad), Sunucu Merhaba'nun sunucudan istemciye gönderildiğini ortaya koydu. Bu sadece bir uyarıydı, ancak Java 7.1 hemen bir "Ölümcül, Açıklama: Beklenmedik İleti" ile hemen yanıt verdi.

Taşıma Katmanı Güvenliği Hakkında Wiki'den (TLS):

112 Tanınmayan ad uyarısı yalnızca TLS; istemcinin Sunucu Adı Göstergesi, sunucu tarafından desteklenmeyen bir ana bilgisayar adı belirledi

Bu, Apache yapılandırma dosyalarıma bakmamı sağladı ve istemci / java tarafından gönderilen ad için bir ServerName veya ServerAlias ​​eklediğimde, hatasız çalıştığını gördüm.

<VirtualHost mydomain.com:443>
  ServerName mydomain.com
  ServerAlias www.mydomain.com

3
Bu, Java'nın TLS uygulamasında bir hata gibi görünüyor.
Paŭlo Ebermann

1
Aslında bunun için bir Hata açıyorum. Bu numara atanmış (henüz görünmüyor): bugs.sun.com/bugdatabase/view_bug.do?bug_id=7127374
eckes

1
Teşekkürler, ServerAliasbenim için çalıştı. Wireshark'ta aynı TLS uyarısını görmüştüm.
Jared Beck

2
Bu benim için de işe yaradı. (eğer inanmış olsaydım ve başka bir yolda avlanmasaydım daha iyi olurdu)
son kullanıcı

10
@JosephShraibman, Oracle çalışanının aptal olduğunu söylemek uygunsuz. İki ServerNames kullandığınızda , Apache bir unrecognized_name uyarı uyarısıyla yanıt verir (bu da ölümcül bir uyarı olabilir). RFC 6066 , bu konuda tam olarak şunu söylüyor: " Uyarı düzeyi uyarılara yanıt olarak istemcinin davranışı tahmin edilemez olduğundan, bir uyarı düzeyinde tanınmayan_adı (112) uyarısı göndermek ÖNERİLMEZ. " Bu çalışan tarafından yapılan tek hata bunun ölümcül bir uyarı olduğunu varsaymaktır . Bu bir Apache kadar JRE hatasıdır.
Bruno

36

SNI kayıtlarının gönderilmesini jsse.enableSNIExtension = false Sistem özelliğiyle devre dışı bırakabilirsiniz.

Kodu değiştirebiliyorsanız SSLCocketFactory#createSocket()(host parametresi olmadan veya bağlı bir soketle) kullanımı yardımcı olur . Bu durumda, sunucu_adı göstergesi göndermez.


11
Hangi böyle yapılır:System.setProperty ("jsse.enableSNIExtension", "false");
jn1kk

Bunun her zaman işe yaramadığını fark ettim. Neden bazı durumlarda işe yarayıp yaramadığını bilmiyorum.
Joseph Shraibman

2
Benim için çalışıyor -Djsse.enableSNIExtension=false. Ama başka ne yapıyor? Javas güvenliğinin geri kalanı için zararlı mıdır?
ceving

2
Hayır, sadece paylaşılan bir IP'nin arkasında birden fazla ana bilgisayar adı kullanan bazı sitelerin (özellikle web sunucuları) hangi sertifikanın gönderileceğini bilmediği anlamına gelir. Ancak, java uygulamanızın milyonlarca web sitesine bağlanması gerekmedikçe, bu özelliğe ihtiyacınız olmayacaktır. Böyle bir sunucuyla karşılaşırsanız, sertifika doğrulamanız başarısız olabilir ve bağlantı kesilir. Yani herhangi bir güvenlik problemi beklenmiyor.
Eckes

17

Ayrıca yeni bir Apache sunucu derlemesinde bu hatayla karşılaştık.

Bizim durumumuzda düzeltme bir tanımlamaya oldu ServerAliasyılında httpd.confJava bağlanmaya çalıştığını ana bilgisayar adına karşılık geldiğini. Bizim ServerNamedahili ana bilgisayar adına ayarlandı. SSL sertifikamız harici ana bilgisayar adını kullanıyordu, ancak bu uyarıyı önlemek için yeterli değildi.

Hata ayıklamaya yardımcı olmak için şu ssl komutunu kullanabilirsiniz:

openssl s_client -servername <hostname> -connect <hostname>:443 -state

Bu ana bilgisayar adıyla ilgili bir sorun varsa, bu iletiyi çıktının üst kısmına yakın bir yerde yazdırır:

SSL3 alert read: warning:unrecognized name

SSL sertifikasıyla eşleşmese bile, dahili ana makine adına bağlanmak için bu komutu kullanırken bu hatayı almadığımızı da not etmeliyim.


6
Sorunun nasıl yeniden oluşturulacağına ilişkin örneği eklediğiniz için teşekkür ederiz openssl. Çok faydalı.
sideshowbarker

2
Bir openssl istemcisinin iletiyi oluşturan ad farkını görmesinin bir yolu var mı SSL3 alert read: warning:unrecognized name? Yazdırılan uyarıyı görüyorum, ancak çıktı aslında bu adlandırma farkını
görmeme

Bu benim için işe yaramıyor. İle test edilmiştir OpenSSL 1.0.1e-fips 11 Feb 2013, OpenSSL 1.0.2k-fips 26 Jan 2017ve LibreSSL 2.6.5.
Greg Dubicki

15

Apache'deki varsayılan sanal ana bilgisayar mekanizmasına güvenmek yerine, rastgele bir ServerName ve joker ServerAlias ​​kullanan bir son catchall sanal ana bilgisayarı tanımlayabilirsiniz, örn.

ServerName catchall.mydomain.com
ServerAlias *.mydomain.com

Bu şekilde SNI kullanabilirsiniz ve apache SSL uyarısını geri göndermez.

Tabii ki, bu yalnızca bir joker karakter sözdizimi kullanarak tüm alan adlarınızı kolayca tanımlayabiliyorsanız çalışır.


Anladığım kadarıyla, apache bu uyarıyı yalnızca istemcinin ServerName veya ServerAlias ​​olarak yapılandırılmamış bir ad kullanması durumunda gönderir. Bir joker kart sertifikanız varsa, kullanılan tüm alt etki alanlarını belirtin veya *.mydomain.comServerAlias için sözdizimini kullanın . Örneğin kullanarak birden çok takma ad ekleyebileceğinizi unutmayın . ServerAliasServerAlias *.mydomain.com mydomain.com *.myotherdomain.com
Michael Paesold

13

Yararlı olmalı. Apache HttpClient 4.4'te bir SNI hatası denemek için - en kolay yolumuz (bkz. HTTPCLIENT-1522 ):

public class SniHttpClientConnectionOperator extends DefaultHttpClientConnectionOperator {

    public SniHttpClientConnectionOperator(Lookup<ConnectionSocketFactory> socketFactoryRegistry) {
        super(socketFactoryRegistry, null, null);
    }

    @Override
    public void connect(
            final ManagedHttpClientConnection conn,
            final HttpHost host,
            final InetSocketAddress localAddress,
            final int connectTimeout,
            final SocketConfig socketConfig,
            final HttpContext context) throws IOException {
        try {
            super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
        } catch (SSLProtocolException e) {
            Boolean enableSniValue = (Boolean) context.getAttribute(SniSSLSocketFactory.ENABLE_SNI);
            boolean enableSni = enableSniValue == null || enableSniValue;
            if (enableSni && e.getMessage() != null && e.getMessage().equals("handshake alert:  unrecognized_name")) {
                TimesLoggers.httpworker.warn("Server received saw wrong SNI host, retrying without SNI");
                context.setAttribute(SniSSLSocketFactory.ENABLE_SNI, false);
                super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
            } else {
                throw e;
            }
        }
    }
}

ve

public class SniSSLSocketFactory extends SSLConnectionSocketFactory {

    public static final String ENABLE_SNI = "__enable_sni__";

    /*
     * Implement any constructor you need for your particular application -
     * SSLConnectionSocketFactory has many variants
     */
    public SniSSLSocketFactory(final SSLContext sslContext, final HostnameVerifier verifier) {
        super(sslContext, verifier);
    }

    @Override
    public Socket createLayeredSocket(
            final Socket socket,
            final String target,
            final int port,
            final HttpContext context) throws IOException {
        Boolean enableSniValue = (Boolean) context.getAttribute(ENABLE_SNI);
        boolean enableSni = enableSniValue == null || enableSniValue;
        return super.createLayeredSocket(socket, enableSni ? target : "", port, context);
    }
}

ve

cm = new PoolingHttpClientConnectionManager(new SniHttpClientConnectionOperator(socketFactoryRegistry), null, -1, TimeUnit.MILLISECONDS);

Eğer bu şekilde yaparsan. Nasıl başa çıkıyorsun verifyHostname(sslsock, target)içinde SSLConnectionSocketFactory.createLayeredSocket? Yana targetboş dize olarak değiştirilir, verifyHostnamebaşarılı olacak değildir. Burada bariz bir şeyi mi kaçırıyorum?
Haozhun

2
Bu tam olarak, aradığım şeydi, çok teşekkür ederim! Bu "tanınmayan_adı" uyarısıyla aynı anda yanıt veren SNI ve sunucuları desteklemenin başka bir yolunu bulamadım.
korpe

Proxy sunucu kullanmadığınız sürece bu çözüm çalışır.
mrog

VeriacheHostname () ile başlayarak hızlı bir hata ayıklama Apache istemci kodu yaptıktan sonra, bunun DefaultHostnameVerifier kullanarak nasıl çalıştığını göremiyorum. Bu çözümün, ortadaki adam saldırılarına izin verdiği için iyi bir fikir DEĞİLDİR (örneğin, bir NoopHostnameVerifier kullanarak) ana bilgisayar ad doğrulaması devre dışı bırakılmasını gerektirir.
FlyingSheep

11

kullanın:

  • System.setProperty ("jsse.enableSNIExtension", "yanlış");
  • Tomcat'inizi yeniden başlatın (önemli)

6

Bahar önyükleme ile bu sorunla karşılaştı ve jvm 1.7 ve 1.8 . AWS'de, ServerName ve ServerAlias'ı eşleşecek şekilde değiştirme seçeneğimiz yoktu (bunlar farklı), bu yüzden aşağıdakileri yaptık:

Gelen build.gradle biz aşağıdakileri ekledi:

System.setProperty("jsse.enableSNIExtension", "false")
bootRun.systemProperties = System.properties

Bu, "Tanınmayan Ad" ile ilgili sorunu atlamamıza izin verdi.


5

Ne yazık ki jarsigner.exe aracına sistem özellikleri sağlayamazsınız.

7177232 numaralı kusuru gönderdim , @eckes'ın 7127374 numaralı kusura referansta bulunarak ve neden yanlışlıkla kapatıldığını açıkladım.

Kusurum özellikle jarsigner aracı üzerindeki etki ile ilgili, ancak belki de onları diğer kusuru yeniden açmaya ve sorunu doğru bir şekilde ele almaya yönlendirecektir.

GÜNCELLEME: Aslında, Jarsigner aracına sistem özellikleri sağlayabileceğiniz anlaşılıyor, bu sadece yardım iletisinde değil. kullanımjarsigner -J-Djsse.enableSNIExtension=false


1
Takip için teşekkürler Bob. Ne yazık ki Oracle hala her şeyi anlamıyor. SNI uyarısı ölümcül değildir, ölümcül olabilir. Ancak çoğu tipik SSL istemcisi (yani tarayıcılar) gerçek bir güvenlik sorunu olmadığı için yok saymayı seçti (çünkü yine de sunucu sertifikasını kontrol etmeniz ve yanlış uç noktaları tespit etmeniz gerekir). yapılandırılmış bir https sunucusu oluşturun.
2'de eckes

2
Aslında, Jarsigner aracına sistem özellikleri sağlayabileceğiniz ortaya çıkıyor, sadece yardım iletisinde değil. Belgelerde ele alınmıştır. Çevrimiçi metne inandığım için bana saçma. Elbette, bunu düzeltmemek için bir bahane olarak kullandılar.
Bob Kerns

BTW: Şu anda security-dev @ openjdk ile ilgili bu konuyu tartışıyorum ve bunu değerlendiriyordum, Symantec GEOTrust zaman damgası sunucusunu düzeltti gibi görünüyor, şimdi URL'yi hiçbir uyarı olmadan doğru bir şekilde kabul ediyor. Ama yine de bunun düzeltilmesi gerektiğini düşünüyorum. Bir göz atmak istiyorsanız, bir test istemci projesi ve tartışma :
eckes

3

Aynı sorunu vurdum ve ters dns kurulumunun doğru olmadığı ortaya çıktı, IP için yanlış ana bilgisayar adını işaret etti. Ters dns düzelttikten ve httpd yeniden başlatıldıktan sonra uyarı gitti. (ters dns'i düzeltmezsem, ServerName eklemek de benim için hile yaptı)



2

Resttemplate ile bir istemci oluşturuyorsanız, yalnızca bitiş noktasını şu şekilde ayarlayabilirsiniz: https: // IP / path_to_service ve requestFactory öğesini ayarlayabilirsiniz.
Bu çözümle TOMCAT'inizi veya Apache'nizi YENİDEN BAŞLATMAK gerekmez:

public static HttpComponentsClientHttpRequestFactory requestFactory(CloseableHttpClient httpClient) {
    TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            return true;
        }
    };

    SSLContext sslContext = null;
    try {
        sslContext = org.apache.http.ssl.SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy)
                .build();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }   

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

    final SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext,hostnameVerifier);

    final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", new PlainConnectionSocketFactory())
            .register("https", csf)
            .build();

    final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
    cm.setMaxTotal(100);
    httpClient = HttpClients.custom()
            .setSSLSocketFactory(csf)
            .setConnectionManager(cm)
            .build();

    HttpComponentsClientHttpRequestFactory requestFactory =
            new HttpComponentsClientHttpRequestFactory();

    requestFactory.setHttpClient(httpClient);

    return requestFactory;
}

1

Java 1.6_29'dan 1.7'ye yükseltme yaparken de bu sorunla karşılaştım.

Korkunç bir şekilde, müşterim Java kontrol panelinde bunu çözen bir ayar keşfetti.

Gelişmiş Sekmesinde 'SSL 2.0 uyumlu ClientHello biçimini kullan' seçeneğini işaretleyebilirsiniz.

Bu sorunu çözüyor gibi görünüyor.

Bir Internet Explorer tarayıcısında Java uygulamaları kullanıyoruz.

Bu yardımcı olur umarım.


0

Eclipse aracılığıyla erişildiğinde bir subversion çalışan bir Ubuntu Linux sunucusu ile aynı sorunu yaşadım.

Apache (yeniden) başladığında sorunun bir uyarı ile ilgili olduğunu göstermiştir:

[Mon Jun 30 22:27:10 2014] [warn] NameVirtualHost *:80 has no VirtualHosts

... waiting [Mon Jun 30 22:27:11 2014] [warn] NameVirtualHost *:80 has no VirtualHosts

Bunun nedeni, yeni bir girişin olması ports.confve buradaki NameVirtualHostdirektifin yanında başka bir direktifin girilmesidir.sites-enabled/000-default .

Yönerge yürürlükten kaldırıldıktan sonra ports.confsorun ortadan kalkmıştı (doğal olarak Apache'yi yeniden başlattıktan sonra)


0

Buraya bir çözüm eklemek için. Bu LAMP kullanıcıları için yardımcı olabilir

Options +FollowSymLinks -SymLinksIfOwnerMatch

Sanal ana bilgisayar yapılandırmasında yukarıda belirtilen satır suçluydu.

Hata olduğunda Sanal Ana Bilgisayar Yapılandırması

<VirtualHost *:80>
    DocumentRoot /var/www/html/load/web
    ServerName dev.load.com
    <Directory "/var/www/html/load/web">
        Options +FollowSymLinks -SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
        Order Allow,Deny
        Allow from All
    </Directory>
     RewriteEngine on
     RewriteCond %{SERVER_PORT} !^443$
     RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]
</VirtualHost>

Çalışma Yapılandırması

<VirtualHost *:80>
    DocumentRoot /var/www/html/load/web

   ServerName dev.load.com
   <Directory "/var/www/html/load/web">

        AllowOverride All

        Options All

        Order Allow,Deny

        Allow from All

    </Directory>

    # To allow authorization header
    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

   # RewriteCond %{SERVER_PORT} !^443$
   # RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]


</VirtualHost>

0

İşte Appache httpclient 4.5.11 için çözüm. Konu joker karakterli cert ile ilgili sorunum vardı *.hostname.com. Bana aynı istisnayı getirdi, ancak mülk tarafından devre dışı bırakmayı kullanmamSystem.setProperty("jsse.enableSNIExtension", "false"); Google konum istemcisinde hata yaptığı için .

Basit bir çözüm buldum (sadece değiştiren soket):

import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;

import javax.inject.Named;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.util.List;

@Factory
public class BeanFactory {

    @Bean
    @Named("without_verify")
    public HttpClient provideHttpClient() {
        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(SSLContexts.createDefault(), NoopHostnameVerifier.INSTANCE) {
            @Override
            protected void prepareSocket(SSLSocket socket) throws IOException {
                SSLParameters parameters = socket.getSSLParameters();
                parameters.setServerNames(List.of());
                socket.setSSLParameters(parameters);
                super.prepareSocket(socket);
            }
        };

        return HttpClients.custom()
                .setSSLSocketFactory(connectionSocketFactory)
                .build();
    }


}

-1

Belirli bağlantılara dolaylı olarak güvenmek için kendi HostnameVerifier'ınızı kullanmanın daha kolay bir yolu vardır . Sorun, SNI uzantılarının eklendiği Java 1.7 ile birlikte gelir ve hatanız bir sunucu yanlış yapılandırmasından kaynaklanır.

Tüm JVM genelinde SNI'yi devre dışı bırakmak için "-Djsse.enableSNIExtension = false" kullanabilir veya bir URL bağlantısının üzerine özel bir doğrulayıcı nasıl uygulanacağını açıkladığım blogumu okuyabilirsiniz.

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.