JDK-8233954 : UnsatisfiedLinkError or NoSuchAlgorithmException after removing sunec.dll
  • Type: Bug
  • Component: security-libs
  • Sub-Component: javax.crypto
  • Affected Version: 11.0.5-oracle,13,14
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: windows_10
  • CPU: x86_64
  • Submitted: 2019-11-08
  • Updated: 2022-06-27
  • Resolved: 2019-11-22
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 13 JDK 14 JDK 8 Other
11.0.6-oracleFixed 13.0.6Fixed 14 b25Fixed 8u261Fixed openjdk8u272Fixed
Related Reports
Relates :  
Relates :  
Relates :  
Description
ADDITIONAL SYSTEM INFORMATION :
java version "11.0.5" 2019-10-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.5+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode)

Windows 10 Pro

A DESCRIPTION OF THE PROBLEM :
We develop an application with which we bundle the Oracle JDK. We currently use Java 8 but are looking to go to Java 11. 

Our Legal department requires that the Elliptic Curve Cryptography library is removed so we have done so, according to the instructions in jdk/legal/jdk.crypto.ec/ecc.md which tells us to simply delete libsunec.so/libsunec.dylib/sunec.dll.

Doing so works well on Java 8 but with Java 11(.0.5, but as it appears earlier versions as well) this results in failure to establish TLS connections. We've seen two types of failures as shown below. The first one is from the small test program I'm attaching.
1)
Exception in thread "main" java.lang.UnsatisfiedLinkError: sun.security.ec.ECKeyPairGenerator.isCurveSupported([B)Z
	at jdk.crypto.ec/sun.security.ec.ECKeyPairGenerator.isCurveSupported(Native Method)
	at jdk.crypto.ec/sun.security.ec.ECKeyPairGenerator.ensureCurveIsSupported(ECKeyPairGenerator.java:135)
	at jdk.crypto.ec/sun.security.ec.ECKeyPairGenerator.initialize(ECKeyPairGenerator.java:114)
	at java.base/java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:699)
	at java.base/sun.security.ssl.ECDHKeyExchange$ECDHEPossession.<init>(ECDHKeyExchange.java:112)
	at java.base/sun.security.ssl.SSLKeyExchange$T13KeyAgreement.createPossession(SSLKeyExchange.java:575)
	at java.base/sun.security.ssl.SSLKeyExchange.createPossessions(SSLKeyExchange.java:88)
	at java.base/sun.security.ssl.KeyShareExtension$CHKeyShareProducer.produce(KeyShareExtension.java:263)
	at java.base/sun.security.ssl.SSLExtension.produce(SSLExtension.java:532)
	at java.base/sun.security.ssl.SSLExtensions.produce(SSLExtensions.java:249)
	at java.base/sun.security.ssl.ClientHello$ClientHelloKickstartProducer.produce(ClientHello.java:648)
	at java.base/sun.security.ssl.SSLHandshake.kickstart(SSLHandshake.java:515)
	at java.base/sun.security.ssl.ClientHandshakeContext.kickstart(ClientHandshakeContext.java:107)
	at java.base/sun.security.ssl.TransportContext.kickstart(TransportContext.java:228)
	at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:395)
	at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
	at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:168)
	at com.example.NoEcTest.main(NoEcTest.java:13)

2)
  java.lang.RuntimeException: Could not generate ECDH keypair
  	at java.base/sun.security.ssl.ECDHKeyExchange$ECDHEPossession.<init>(ECDHKeyExchange.java:117)
  	at java.base/sun.security.ssl.SSLKeyExchange$T13KeyAgreement.createPossession(SSLKeyExchange.java:575)
  	at java.base/sun.security.ssl.SSLKeyExchange.createPossessions(SSLKeyExchange.java:88)
  	at java.base/sun.security.ssl.KeyShareExtension$CHKeyShareProducer.produce(KeyShareExtension.java:263)
  	at java.base/sun.security.ssl.SSLExtension.produce(SSLExtension.java:532)
  	at java.base/sun.security.ssl.SSLExtensions.produce(SSLExtensions.java:249)
  	at java.base/sun.security.ssl.ClientHello$ClientHelloKickstartProducer.produce(ClientHello.java:648)
  	at java.base/sun.security.ssl.SSLHandshake.kickstart(SSLHandshake.java:515)
  	at java.base/sun.security.ssl.ClientHandshakeContext.kickstart(ClientHandshakeContext.java:107)
  	at java.base/sun.security.ssl.TransportContext.kickstart(TransportContext.java:228)
  	at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:395)
  	at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)
  	at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)
  	at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
  	at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
  	at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
  	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
  	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
  	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
  	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
  	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
  	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
  	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
  	at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:87)
  	at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
  	at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
  	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:735)
  	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:710)
  	at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:598)
  	[REDACTED]
  Caused by: java.security.NoSuchAlgorithmException: EC KeyPairGenerator not available
  	at java.base/java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:236)
  	at java.base/sun.security.ssl.JsseJce.getKeyPairGenerator(JsseJce.java:237)
  	at java.base/sun.security.ssl.ECDHKeyExchange$ECDHEPossession.<init>(ECDHKeyExchange.java:109)
  	... 35 more}

REGRESSION : Last worked in version 8u231

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1) Install Oracle JDK 11.0.5 on Windows
2) Remove sunec.dll
3) Try to establish a TLS connection

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
To be able to connect (as long as the server accepts some non-EC cipher suites).
ACTUAL -
Exception in thread "main" java.lang.UnsatisfiedLinkError: sun.security.ec.ECKeyPairGenerator.isCurveSupported([B)Z
	at jdk.crypto.ec/sun.security.ec.ECKeyPairGenerator.isCurveSupported(Native Method)
	at jdk.crypto.ec/sun.security.ec.ECKeyPairGenerator.ensureCurveIsSupported(ECKeyPairGenerator.java:135)
	at jdk.crypto.ec/sun.security.ec.ECKeyPairGenerator.initialize(ECKeyPairGenerator.java:114)
	at java.base/java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:699)
	at java.base/sun.security.ssl.ECDHKeyExchange$ECDHEPossession.<init>(ECDHKeyExchange.java:112)
	at java.base/sun.security.ssl.SSLKeyExchange$T13KeyAgreement.createPossession(SSLKeyExchange.java:575)
	at java.base/sun.security.ssl.SSLKeyExchange.createPossessions(SSLKeyExchange.java:88)
	at java.base/sun.security.ssl.KeyShareExtension$CHKeyShareProducer.produce(KeyShareExtension.java:263)
	at java.base/sun.security.ssl.SSLExtension.produce(SSLExtension.java:532)
	at java.base/sun.security.ssl.SSLExtensions.produce(SSLExtensions.java:249)
	at java.base/sun.security.ssl.ClientHello$ClientHelloKickstartProducer.produce(ClientHello.java:648)
	at java.base/sun.security.ssl.SSLHandshake.kickstart(SSLHandshake.java:515)
	at java.base/sun.security.ssl.ClientHandshakeContext.kickstart(ClientHandshakeContext.java:107)
	at java.base/sun.security.ssl.TransportContext.kickstart(TransportContext.java:228)
	at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:395)
	at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
	at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:168)
	at com.example.NoEcTest.main(NoEcTest.java:13)

---------- BEGIN SOURCE ----------
package com.example;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class NoEcTest {

  public static void main(String[] args) throws IOException {
    URL url = new URL("https://example.com/");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    con.connect();
    System.out.println(con.getResponseCode());
  }

}
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Providing another EC library (like Bouncy Castle).

FREQUENCY : always



Comments
Fix request (13u). I would like to backport the fix to jdk13u. The original patch applied cleanly. Jtreg tests passed.
26-11-2020

Fix request (11u) I would like to downport this for parity with 11.0.6-oracle. I think this should go to 11.0.6 still. Unfortunately the change does not apply at all, see review: http://mail.openjdk.java.net/pipermail/jdk-updates-dev/2019-December/002215.html
09-12-2019

For the UnsatisfiedLinkError issue, please double check if the sunec library is still in java library path, which could be a place other than the $JAVA_HOME/bin. Please remove/rename/exclude it as well.
06-12-2019

URL: https://hg.openjdk.java.net/jdk/jdk/rev/e7df7c86eda1 User: xuelei Date: 2019-11-22 02:43:16 +0000
22-11-2019

http://cr.openjdk.java.net/~xuelei/8233954/webrev.00/
20-11-2019

No new regression test. The test code in the bug description could be used to verify the fix. The ClientHello debug log when filter out EC named groups and signature schemes in the SunJSSE provider: javax.net.ssl|DEBUG|01|main|2019-11-19 16:57:07.094 PST|ClientHello.java:652|Produced ClientHello handshake message ( "ClientHello": { "client version" : "TLSv1.2", "random" : "E7 1C D1 46 2D 39 0D 0C 6F 14 F1 8D 42 62 40 6F E7 4C 70 7B A2 37 A4 B0 0D 73 E7 22 1F 05 52 A7", "session id" : "7D 9A E3 E9 12 D3 81 94 AD 10 BE A5 D0 37 0C C8 53 0B FC B2 69 7F 2B 2E BC C3 02 EF 65 C8 60 BC", "cipher suites" : "[TLS_AES_256_GCM_SHA384(0x1302), TLS_AES_128_GCM_SHA256(0x1301), TLS_CHACHA20_POLY1305_SHA256(0x1303), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCCAA), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]", "compression methods" : "00", "extensions" : [ "server_name (0)": { type=host_name (0), value=bugs.openjdk.java.net }, "status_request (5)": { "certificate status type": ocsp "OCSP status request": { "responder_id": <empty> "request extensions": { <empty> } } }, "supported_groups (10)": { "versions": [x25519, x448, ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192] }, "ec_point_formats (11)": { "formats": [uncompressed] }, "signature_algorithms (13)": { "signature schemes": [rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, rsa_pkcs1_sha1, dsa_sha1] }, "signature_algorithms_cert (50)": { "signature schemes": [rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, rsa_pkcs1_sha1, dsa_sha1] }, "status_request_v2 (17)": { "cert status request": { "certificate status type": ocsp_multi "OCSP status request": { "responder_id": <empty> "request extensions": { <empty> } } } }, "extended_master_secret (23)": { <empty> }, "session_ticket (35)": { <empty> }, "supported_versions (43)": { "versions": [TLSv1.3, TLSv1.2, TLSv1.1, TLSv1] }, "psk_key_exchange_modes (45)": { "ke_modes": [psk_dhe_ke] }, "key_share (51)": { "client_shares": [ { "named group": x25519 "key_exchange": { 0000: 55 13 B2 C0 1D 94 67 B0 CA D3 2B 5E 37 27 91 D1 U.....g...+^7'.. 0010: B2 AB 43 16 C1 EB CD AA CB 5A D5 E1 0D 0E 2F 22 ..C......Z..../" } }, ] } ] } )
20-11-2019

The issue is reproducible with the latest JDK 14 (build 14-ea+23-1048), if XDH algorithms are disabled in java.security file: jdk.tls.disabledAlgorithms= XDH, // all the other algorithms
18-11-2019