10

我正在全新安装刚刚安装 OpenJDK 的 Ubuntu:

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"),但这引发了同样的错误。似乎有些东西根本无法正常工作,所以我认为我们一定做错了什么。

4

2 回答 2

6

guido 的回答为我指明了正确的方向。这只是一个问题:

sudo apt-get install libbcprov-java
于 2011-01-20T04:28:11.097 回答
2

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

然后在您的课程中参考以下示例代码:

静止的 {
    Security.addProvider(new BouncyCastleProvider());
}

公共 SSLSocket getSSLSocket() {

    // 加载密钥库
    KeyStore ks = KeyStore.getInstance(keystoreType);
    ks.load(new FileInputStream(this.keyStorePath),this.keyStorePass.toCharArray());

    // 获取一个 KeyManager 并初始化它
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
    kmf.init(ks, this.keyStorePass.toCharArray());

    // 获取 TrustManagerFactory 并使用 KeyStore 进行初始化
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
    tmf.init(ks);

    // 获取 SSLContext 以帮助创建 SSLSocketFactory
    SSLContext sslc = SSLContext.getInstance("TLS");
    sslc.init(kmf.getKeyManagers(), null, null);

    // 获取 SSLSocketFactory 并获取 SSLSocket
    SSLSocketFactory sslsf = sslc.getSocketFactory();
    SSLSocket socket = (SSLSocket) sslsf.createSocket(host, port);
    返回套接字;
}
于 2011-01-14T11:05:50.260 回答