2011-01-09 97 views
10

我是一个新的安装Ubuntu的刚刚安装的OpenJDK:Ubuntu上的OpenJDK中的Java SSL是否被破坏?

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”),但是这抛出了相同的错误。看起来像是一件非常重要的事情,因为我不知道该怎么做,所以我认为我们必须做错事。

回答

6

圭多的回答我指出了正确的方向。这只是一个问题:

sudo apt-get install libbcprov-java 
2

ubuntu发布的openjdk可能缺少JCE提供程序;从http://www.bouncycastle.org/(它是一个实现JCE的开源项目)下载bouncycastle加密API并将其放入项目类路径中。

然后在你的类指的是下面的示例代码:

 
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; 
}