Java 1.8.161から1.8.181にアップグレードすると、アプリケーションからLDAPに接続できません。以下のユーザーでアプリケーションにログインしようとすると、例外が発生します。 LDAPでアクティブ。
javax.naming.CommunicationException::[ルート例外はjavax.net.ssl.SSLHandshakeExceptionです:Java.security.cert.CertificateException:IPアドレスに一致するサブジェクトの別名が見つかりません]
バージョン1.8.181のOracleサイトで以下の リリースノート を見つけました
変更
core-libs/javax.naming LDAP LDAPサポートの改善LDAPS接続でエンドポイント識別が有効になりました。
LDAPS(Secure LDAP over TLS)接続の堅牢性を向上させるために、エンドポイント識別アルゴリズムはデフォルトで有効になっています。
以前はLDAPSサーバーに正常に接続できた一部のアプリケーションが接続できなくなる場合があることに注意してください。そのようなアプリケーションは、適切であると判断した場合、新しいシステムプロパティ
com.Sun.jndi.ldap.object.disableEndpointIdentification
を使用してエンドポイント識別を無効にする場合があります。このシステムプロパティを定義(またはtrueに設定)して、エンドポイント識別アルゴリズムを無効にします。
他のプロパティと一緒に以下のようにプロパティをtrueに設定しようとしました。しかし、それでも同じエラーがスローされます。
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, ctxFactory);
env.put(Context.PROVIDER_URL, providerUrl);
env.put(Context.SECURITY_PRINCIPAL, secPrincipal);
env.put(Context.SECURITY_AUTHENTICATION, secAuthentication);
env.put(Context.SECURITY_CREDENTIALS, secCredentials);
env.put("com.Sun.jndi.ldap.object.disableEndpointIdentification" ,disableEndpointIdentification);
DirContext ldapCtx = new InitialDirContext(env);
プロパティcom.Sun.jndi.ldap.object.disableEndpointIdentification
をtrueに設定するために必要な方法と場所を確認してください。
コンテキストインターフェイスにも、これに関連するそのような定数のString変数はありません。
Java 1.8.161バージョンに戻すと、正常に動作します。
docはLdapコンテキスト環境ではなく、アプリケーションシステムプロパティについて説明します
次に、アプリケーションのアプリケーションJVM(Javaコマンドライン)で次のように設定する必要があります。
-Dcom.Sun.jndi.ldap.object.disableEndpointIdentification=true
LDAPで構成された証明書にIPアドレスのSANを追加します
例えば証明書要求構成(request.inf)
[RequestAttributes]
SAN="ipaddress=10.233.207.65"
[Extensions]
2.5.29.17 = "{text}"
continue_ = "ipaddress=10.233.207.65"
と証明書の生成のためのようなもの
keyUsage=digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectKeyIdentifier=hash
subjectAltName=@alt_names
[alt_names]
IP = 10.233.207.65
extfile構成