特定のサーバ(つまりhttps://serverexample.com/application/webservice?wsdl)を使用して正常に動作していたApache CXFでクライアントを作成しました。サーバ名表示(SNI)が必要なサーバのテストでApache CXFクライアントエラーが発生しました
しかし、サーバが別のIPに移動した、と今では同じIPでTLSおよびSNI(Serverの名前表示)を持つ2つのSSL証明書を持って、そして今、私たちのアプリケーションは、このエラーで失敗します。
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching serverexample.com found
httpsが間違った証明書を取得している(別のサーバー名を持っている)ので、これが私のものと一致していないことがわかります。
私は、OpenSSLで起こって何かを見つけることを試みた、と私はサーバー名を入れている場合、URLにのみ動作します:
# 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
エラーは、この時点で生成されたApacheのクライアントで起こった:
final URL wsdlURL = new URL("https://serverexample.com/application/webservice?wsdl");
final Operation_Service ss = new Operation_Service(wsdlURL, SERVICE_NAME);
新しい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はjavax.xml.wsを呼び出します.spi.ServiceDelegate、org.apache.cxf.jaxwsのいくつかのクラスによって実装されているabastractクラスですが、ここで私はそれを失っています、私は何を見て良いのかわかりません...
私たちのクライアントはrunnringでjava 7.0とweblogic 12.1.1.0上のapache cxf 3.0.4。私はJava 6でSNIに問題があったと読んでいますが、ここでは7.0を使用しています。
私は何ができるのでしょうか。接続しようとしているservername(opensslのような)を示すためにjavaまたはクライアントにいくつかのオプションがありますか?
デフォルトのホスト名ベリファイアが変更されていないと思われるので、JDK-8072464が原因であるかどうかは疑問です。エンドポイント識別アルゴリズムが設定されているときにも失敗するかもしれない他のバグかもしれません。 CXFのケースではなく、カスタムファクトリでそれを処理する方法についてのいくつかの例です。 – jmd
確かに、検証者は変更されません。しかし、他のコードでは、ホスト名ベリファイアが存在し、動作が異なることが分かります。それはすべてリンク先の記事で説明されています。 – user568826