Java 6はTLSをv1.0までサポートしているようですが、Java 6でTLS 1.2を使用する方法はありますか?Java 6でTLS 1.2を使用する方法
Java 6のパッチまたは特定のアップデートでサポートされるかもしれませんか?
Java 6はTLSをv1.0までサポートしているようですが、Java 6でTLS 1.2を使用する方法はありますか?Java 6でTLS 1.2を使用する方法
Java 6のパッチまたは特定のアップデートでサポートされるかもしれませんか?
公開Oracle Java 6リリースでは、TLSv1.2はサポートされません。有料版Java 6(EOL後)の可能性があります。 (UPDATE - TLSv1.1は、アップデート111以降のJava 1.6で利用可能です。source)
Oracle販売代理店にお問い合わせください。
他の選択肢は以下のとおりです。
は、弾む城などの代替JCEの実装を使用します。
ご使用のプラットフォームで使用可能な場合は、IBM Java 6 ...を使用してください。 "IBM SDK, Java Technology Edition fixes to mitigate against the POODLE security vulnerability (CVE-2014-3566)"によれば:
"TLSv1.1とTLSv1.2は、Java 6のサービスのために利用可能である10、Java(登録商標)6.0.1サービス・リフレッシュ1(J9 VM2.6)、以降のリリースを更新します。"
しかし、私は、Java 8のJava 6にアップグレードするお勧めする2013年2月にEOL'd、それを使い続けることは、潜在的に危険であるました。
これについての一言。Bouncyを使用して見たすべてのサンプルは、生のHTTPコマンドを送信することに基づいています...それは少し難しいです作業/制作プログラムに統合する。明らかに最善の方法は、JVMをアップグレードすることです(アプリケーションサーバに応じて、IBM JVM、f.e、Oracle WLS環境では利用できません)。 Bellow私はBouncyに基づいてカスタマイズされたSSL SocketConnectionFactoryを使用して回避策を説明します。誰かが解決策を見つけた場合、生のHTTPコマンドをsendindだけでなく、procommons ..のために共有してください! .-) – Azimuts
Bouncy Castleに基づいて独自のSSLSocketFactoryを作成する必要があります。使用した後、このカスタマイズされたSocketFactoryを使用するための共通のHttpsConnextionに渡します。
:1.まずTLSConnectionFactoryを作成
ここに1つのヒント:
@Override
public Socket createSocket(Socket socket, final String host, int port, boolean arg3)
このメソッドは、次を呼び出します:
1.1はSSLConnectionFactory
1.2オーバーライドにこの方法を拡張内部方法、
1.3内部メソッド_createSSLSocket(host、tlsClientProtocol)を実装します。
TlsClientProtocolを使用してSocketを作成する必要があります。 TLSクライアントプロトコルを使用する方法の完全なサンプルはここにも説明されています:Using BouncyCastle for a simple HTTPS query
(2)第2:使用して、このカスタマイズSSLConnextionFactoryトリックはTlsClientProtocol
private SSLSocket _createSSLSocket(final String host , final TlsClientProtocol tlsClientProtocol) {
return new SSLSocket() {
.... Override and implement SSLSocket methods, particulary:
startHandshake() {
}
}
重要を呼び出すオーバーライド... startHandshake()メソッドであります一般的なHTTPSConnection。
これは重要です。他のサンプルでは、Webには、ハードコードされたHTTPコマンドが表示されます。そのため、カスタマイズされたSSLConnectionFactoryでは何も必要ありません。
ここURL myurl = new URL("http:// ...URL tha only Works in TLS 1.2);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
con.setSSLSocketFactory(new TSLSocketConnectionFactory());
ありがとうございます。私はtomcatでbouncyCastleを使用しています。ソリューションを詳しく説明できますか?またはTLS1.2を使用するようにBCをカスタマイズするためのサンプルまたはチュートリアルがありますか(java6の場合)? – alex
完全なサンプルはこのuriにあります:http://stackoverflow.com/questions/8171802/using-bouncycastle-for-a-simple-https-query – Azimuts
しかし、カスタマイズされたSSLConnectionFactory(TLSConnectionFactory)を実装しようとすると、 SSLConnectionFactoryを拡張して@Overrideをオーバーライドするクラスを作ることを開始するpublicソケットcreateSocket(ソケットソケット final String host、int port、boolean arg3)...ただTSLClientProtocolを呼び出す – Azimuts
TLSConnection工場:
package test.connection;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.Principal;
import java.security.SecureRandom;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSessionContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.security.cert.X509Certificate;
import org.bouncycastle.crypto.tls.Certificate;
import org.bouncycastle.crypto.tls.CertificateRequest;
import org.bouncycastle.crypto.tls.DefaultTlsClient;
import org.bouncycastle.crypto.tls.ExtensionType;
import org.bouncycastle.crypto.tls.TlsAuthentication;
import org.bouncycastle.crypto.tls.TlsClientProtocol;
import org.bouncycastle.crypto.tls.TlsCredentials;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
/**
* This Class enables TLS V1.2 connection based on BouncyCastle Providers.
* Just to use:
* URL myurl = new URL("http:// ...URL tha only Works in TLS 1.2);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
con.setSSLSocketFactory(new TSLSocketConnectionFactory());
* @author AZIMUTS
*
*/
public class TSLSocketConnectionFactory extends SSLSocketFactory {
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Adding Custom BouncyCastleProvider
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
static {
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null)
Security.addProvider(new BouncyCastleProvider());
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//HANDSHAKE LISTENER
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class TLSHandshakeListener implements HandshakeCompletedListener {
@Override
public void handshakeCompleted(HandshakeCompletedEvent event) {
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SECURE RANDOM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
private SecureRandom _secureRandom = new SecureRandom();
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Adding Custom BouncyCastleProvider
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public Socket createSocket(Socket socket, final String host, int port, boolean arg3)
throws IOException {
if (socket == null) {
socket = new Socket();
}
if (!socket.isConnected()) {
socket.connect(new InetSocketAddress(host, port));
}
final TlsClientProtocol tlsClientProtocol = new TlsClientProtocol(socket.getInputStream(), socket.getOutputStream(), _secureRandom);
return _createSSLSocket(host, tlsClientProtocol);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SOCKET FACTORY METHODS
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public String[] getDefaultCipherSuites() {
return null;
}
@Override
public String[] getSupportedCipherSuites(){
return null;
}
@Override
public Socket createSocket(String host, int port) throws IOException,UnknownHostException{
return null;
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return null;
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost,
int localPort) throws IOException, UnknownHostException {
return null;
}
@Override
public Socket createSocket(InetAddress address, int port,
InetAddress localAddress, int localPort) throws IOException{
return null;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SOCKET CREATION
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private SSLSocket _createSSLSocket(final String host , final TlsClientProtocol tlsClientProtocol) {
return new SSLSocket() {
private java.security.cert.Certificate[] peertCerts;
@Override
public InputStream getInputStream() throws IOException {
return tlsClientProtocol.getInputStream();
}
@Override
public OutputStream getOutputStream() throws IOException {
return tlsClientProtocol.getOutputStream();
}
@Override
public synchronized void close() throws IOException {
tlsClientProtocol.close();
}
@Override
public void addHandshakeCompletedListener(HandshakeCompletedListener arg0) {
}
@Override
public boolean getEnableSessionCreation() {
return false;
}
@Override
public String[] getEnabledCipherSuites() {
return null;
}
@Override
public String[] getEnabledProtocols() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean getNeedClientAuth(){
return false;
}
@Override
public SSLSession getSession() {
return new SSLSession() {
@Override
public int getApplicationBufferSize() {
return 0;
}
@Override
public String getCipherSuite() {
throw new UnsupportedOperationException();
}
@Override
public long getCreationTime() {
throw new UnsupportedOperationException();
}
@Override
public byte[] getId() {
throw new UnsupportedOperationException();
}
@Override
public long getLastAccessedTime() {
throw new UnsupportedOperationException();
}
@Override
public java.security.cert.Certificate[] getLocalCertificates() {
throw new UnsupportedOperationException();
}
@Override
public Principal getLocalPrincipal() {
throw new UnsupportedOperationException();
}
@Override
public int getPacketBufferSize() {
throw new UnsupportedOperationException();
}
@Override
public X509Certificate[] getPeerCertificateChain()
throws SSLPeerUnverifiedException {
// TODO Auto-generated method stub
return null;
}
@Override
public java.security.cert.Certificate[] getPeerCertificates()throws SSLPeerUnverifiedException {
return peertCerts;
}
@Override
public String getPeerHost() {
throw new UnsupportedOperationException();
}
@Override
public int getPeerPort() {
return 0;
}
@Override
public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
return null;
//throw new UnsupportedOperationException();
}
@Override
public String getProtocol() {
throw new UnsupportedOperationException();
}
@Override
public SSLSessionContext getSessionContext() {
throw new UnsupportedOperationException();
}
@Override
public Object getValue(String arg0) {
throw new UnsupportedOperationException();
}
@Override
public String[] getValueNames() {
throw new UnsupportedOperationException();
}
@Override
public void invalidate() {
throw new UnsupportedOperationException();
}
@Override
public boolean isValid() {
throw new UnsupportedOperationException();
}
@Override
public void putValue(String arg0, Object arg1) {
throw new UnsupportedOperationException();
}
@Override
public void removeValue(String arg0) {
throw new UnsupportedOperationException();
}
};
}
@Override
public String[] getSupportedProtocols() {
return null;
}
@Override
public boolean getUseClientMode() {
return false;
}
@Override
public boolean getWantClientAuth() {
return false;
}
@Override
public void removeHandshakeCompletedListener(HandshakeCompletedListener arg0) {
}
@Override
public void setEnableSessionCreation(boolean arg0) {
}
@Override
public void setEnabledCipherSuites(String[] arg0) {
}
@Override
public void setEnabledProtocols(String[] arg0) {
}
@Override
public void setNeedClientAuth(boolean arg0) {
}
@Override
public void setUseClientMode(boolean arg0) {
}
@Override
public void setWantClientAuth(boolean arg0) {
}
@Override
public String[] getSupportedCipherSuites() {
return null;
}
@Override
public void startHandshake() throws IOException {
tlsClientProtocol.connect(new DefaultTlsClient() {
@Override
public Hashtable<Integer, byte[]> getClientExtensions() throws IOException {
Hashtable<Integer, byte[]> clientExtensions = super.getClientExtensions();
if (clientExtensions == null) {
clientExtensions = new Hashtable<Integer, byte[]>();
}
//Add host_name
byte[] host_name = host.getBytes();
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final DataOutputStream dos = new DataOutputStream(baos);
dos.writeShort(host_name.length + 3); // entry size
dos.writeByte(0); // name type = hostname
dos.writeShort(host_name.length);
dos.write(host_name);
dos.close();
clientExtensions.put(ExtensionType.server_name, baos.toByteArray());
return clientExtensions;
}
@Override
public TlsAuthentication getAuthentication()
throws IOException {
return new TlsAuthentication() {
@Override
public void notifyServerCertificate(Certificate serverCertificate) throws IOException {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
List<java.security.cert.Certificate> certs = new LinkedList<java.security.cert.Certificate>();
for (org.bouncycastle.asn1.x509.Certificate c : serverCertificate.getCertificateList()) {
certs.add(cf.generateCertificate(new ByteArrayInputStream(c.getEncoded())));
}
peertCerts = certs.toArray(new java.security.cert.Certificate[0]);
} catch (CertificateException e) {
System.out.println("Failed to cache server certs"+ e);
throw new IOException(e);
}
}
@Override
public TlsCredentials getClientCredentials(CertificateRequest arg0)
throws IOException {
return null;
}
};
}
});
}
};//Socket
}
}
あなたが望むなら、この方法で生のHTTPコマンドを使うことができますhttp://stackoverflow.com/questions/8171802/using-bouncycastle-for-a-simple-https-query?lq=1 .....しかし、生httpコマンド....私はHTTPSUrlconnection +カスタマイズSSLConnectionFactoryを使用する方が良いと思います:URL myurl =新しいURL( "http:// ... URLはTLS 1.2でのみ動作します); HttpsURLConnection con =(HttpsURLConnection)myurl.openConnection (); con.setSSLSocketFactory(new TSLSocketConnectionFactory()); – Azimuts
これは唯一の解決策であると思われます。これ?Do yo動作しているTLS接続ファクトリ実装がありますか? – Saky
のJava 6、今TLS 1.2をサポートし、
http://www.oracle.com/technetwork/java/javase/overview-156328.html#R160_121
これは理論的に質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にすることが望ましいです(// meta.stackoverflow.com/q/8259)。 –
このバージョンのように見えるのは、サポート契約を結んでいるユーザーだけです。 – user872858
の下にチェックアウトしたJava 6はまた、1024ビットのDH弾性率で立ち往生していますIIRC。 [logjam](http://stackoverflow.com/a/30706878)の後は、適切に構成されたサーバーに接続できない可能性があります。可能であれば、おそらく別のクライアントプラットフォームに移動する必要があります。 – jww
実際、Java 6および7は、JRE 6U105(aka1.6.0_105)および7u91(別名1.7.0_91)から始まるDHエフェメラルキー(最大2048ビット)をサポートします。 (出典:https://github.com/mozilla/server-side-tls/issues/107) –