un client creato con Apache CXF che funzionava correttamente, utilizzando un determinato server (ad esempio: https://serverexample.com/application/webservice?wsdl).Errore client Apache CXF nel server di test che necessita dell'indicazione SNI (Server Name Indication)
ma il server si è spostato in un altro IP, e ora ha due certificati SSL con TLS e SNI (Server Name Indication) nello stesso IP, e ora le nostre applicazioni non riesce con questo errore:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching serverexample.com found
Capisco che questo si verifica quando https sta ottenendo il certificato sbagliato (ha un altro nome di server), e quindi non corrisponde alla mia.
ho cercato di scoprire cosa succede con OpenSSL, e l'URL funziona solo se ho messo servername:
# openssl s_client -connect serverexample.com:443 -tls1
Certificate chain
0 s:/CN=otherserver.com/OU=Servers/O=MyOrganization/C=ES
i:/CN=ACV20/OU=PKACV/O=ACV/C=ES
# openssl s_client -connect serverexample.com:443 -servername serverexample.com
Certificate chain
0 s:/CN=serverexample.com/OU=Servers/O=MyOrganization/C=ES
i:/CN=ACV220/OU=PKACV1/O=ACV2/C=ES
L'errore è accaduto nel client apache generato in questo punto:
final URL wsdlURL = new URL("https://serverexample.com/application/webservice?wsdl");
final Operation_Service ss = new Operation_Service(wsdlURL, SERVICE_NAME);
Non riesce nel nuovo Operation_Service:
@WebServiceClient(name = "ENI.Operation",
wsdlLocation = "https://serverexample.com/application/webservice?wsdl",
targetNamespace = "http://inter.ra.es/awrp/wsdl")
public class Operation_Service extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://inter.ra.es/awrp/wsdl", "ENI.Operation");
public final static QName Operation = new QName("http://inter.ra.es/awrp/wsdl", "ENI.Operation");
static {
URL url = null;
try {
url = new URL("https://serverexample.com/application/webservice?wsdl");
} catch (final MalformedURLException e) {
java.util.logging.Logger.getLogger(Operation_Service.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "https://serverexample.com/application/webservice?wsdl");
}
WSDL_LOCATION = url;
}
public Operation_Service(final URL wsdlLocation, final QName serviceName) {
super(wsdlLocation, serviceName);
}
javax.xml.ws.Service chiamate javax.xml.ws .spi.ServiceDelegate, una classe di abstract implementata da qualche classe in org.apache.cxf.jaxws .. ma qui sto perdendo, non so cosa guardare ...
Il nostro cliente è runnring in java 7.0 con apache cxf 3.0.4 su un weblogic 12.1.1.0. Ho letto che in Java 6 c'erano problemi con SNI, ma stiamo usando 7.0 qui.
Non so cosa posso fare. C'è qualche opzione in java o nel nostro client per indicare il nomeserver (come in openssl) che stiamo cercando di connettere?
Dubito che sia dovuto a JDK-8072464 poiché il verificatore del nome host predefinito non sembra essere modificato. Forse è l'altro bug che lo fa fallire anche quando viene impostato un algoritmo di identificazione degli endpoint. Sono alcuni esempi su come lavorarlo con le fabbriche personalizzate, ma non per il caso CXF. – jmd
Certo, il verificatore non è stato modificato. Ma un altro codice vede che il verificatore del nome host è presente e si comporta diversamente. È tutto spiegato nel post collegato. – user568826