コード全体がかなり複雑なので、私は直接要点に来ています。コードは次のとおりです
SSLContext ctx = SSLContext.getInstance("TLS");
getInstance(String protocol) メソッドのドキュメントを読むと、
This method traverses the list of registered security Providers, starting
with the most preferred Provider. A new SSLContext object encapsulating
the SSLContextSpi implementation from the first Provider that supports the
specified protocol is returned.
Note that the list of registered providers may be retrieved via the
Security.getProviders() method.
私にとって Security.getProviders() メソッドは次のプロバイダーを提供します
「TLS」プロトコルがcom.sun.net.ssl.internal.ssl.Provider
(インデックス 2 ) にあり、常に選択されていることを確認しました。
しかし、対応する SSLContextSpi オブジェクトは Java 6 と Java 7 で異なってきます。Java 6 では取得com.sun.net.ssl.internal.ssl.SSLContextImpl@7bbf68a9
し、Java 7 では取得してsun.security.ssl.SSLContextImpl$TLS10Context@615ece16
います。後でSSLソケットを作成するときに、それらが異なるクラスであるため、これは非常に悪い影響を及ぼしています。
では、なぜこれが起こっているのですか?回避策はありますか?コンテキストにカプセル化された同じcom.sun.net.ssl.internal.ssl.SSLContextImpl@7bbf68a9
SSLContextSpi オブジェクトが必要ですcom.sun.net.ssl.internal.ssl.Provider
(どちらの場合も同じです)。