Не работает ли Java SSL в OpenJDK в Ubuntu? - PullRequest
10 голосов
/ 09 января 2011

Я только что установил Ubuntu, только что установив OpenJDK:

OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode) on Ubuntu 64 bit 10.10

Не уверен, что это актуально, но я запускаю его из VMWare Fusion.

Следующая строка:

javax.net.SSLContext.getDefault(); // same as getInstance("Default")

throws the following exception:

java.net.SocketException: java.security.NoSuchAlgorithmException: Default SSLContext not available

Мои коллеги и я пробовали это на нескольких машинах, все свежие версии Ubuntu, и продолжаем получать это. Мне посоветовали попробовать getInstance ("TLSv1"), но это вывело ту же ошибку. Кажется, что-то действительно фундаментальное, чтобы не работать, поэтому я думаю, что мы должны делать что-то не так.

Ответы [ 2 ]

6 голосов
/ 20 января 2011

Ответ Гвидо указал мне правильное направление.Это просто вопрос:

sudo apt-get install libbcprov-java
2 голосов
/ 14 января 2011

openjdk, поставляемый с Ubuntu, может отсутствовать JCE-провайдера; скачайте bouncycastle crypto api из http://www.bouncycastle.org/ (это проект с открытым исходным кодом, реализующий JCE) и поместите его в classpath вашего проекта.

Тогда в вашем классе обратитесь к следующему примеру кода:

static {
    Security.addProvider( new BouncyCastleProvider() );
}

public SSLSocket getSSLSocket() {

    // Load the Keystore
    KeyStore ks = KeyStore.getInstance(keystoreType);
    ks.load(new FileInputStream(this.keyStorePath),this.keyStorePass.toCharArray());

    // Get a KeyManager and initialize it 
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
    kmf.init(ks, this.keyStorePass.toCharArray());

    // Get a TrustManagerFactory and init with KeyStore
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
    tmf.init(ks);

    // Get the SSLContext to help create SSLSocketFactory
    SSLContext sslc = SSLContext.getInstance("TLS");
    sslc.init(kmf.getKeyManagers(), null, null);

    // Get SSLSocketFactory and get a SSLSocket
    SSLSocketFactory sslsf = sslc.getSocketFactory();
    SSLSocket socket = (SSLSocket) sslsf.createSocket(host, port);
    return socket;
}
...