pulsar: Apache pulsar Encryption failed using ecdsa

Trying to send encrypted messages from producer but got this exception:

org.apache.pulsar.client.api.PulsarClientException: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: java.lang.NoSuchMethodError: 'org.apache.pulsar.shade.io.netty.buffer.ByteBuf org.apache.pulsar.client.api.MessageCrypto.encrypt(java.util.Set, org.apache.pulsar.client.api.CryptoKeyReader, java.util.function.Supplier, org.apache.pulsar.shade.io.netty.buffer.ByteBuf)'
	at org.apache.pulsar.client.api.PulsarClientException.unwrap(PulsarClientException.java:719)
	at org.apache.pulsar.client.impl.ProducerBase.send(ProducerBase.java:117)
	at org.apache.pulsar.client.impl.TypedMessageBuilderImpl.send(TypedMessageBuilderImpl.java:89)
	at org.apache.pulsar.client.impl.ProducerBase.send(ProducerBase.java:63)
	at com.vz.vmb.PulsarProducer.main(PulsarProducer.java:59)
Caused by: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: java.lang.NoSuchMethodError: 'org.apache.pulsar.shade.io.netty.buffer.ByteBuf org.apache.pulsar.client.api.MessageCrypto.encrypt(java.util.Set, org.apache.pulsar.client.api.CryptoKeyReader, java.util.function.Supplier, org.apache.pulsar.shade.io.netty.buffer.ByteBuf)'
	at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
	at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
	at org.apache.pulsar.client.impl.ProducerBase.send(ProducerBase.java:115)
	... 3 more
Caused by: org.apache.pulsar.client.api.PulsarClientException: java.lang.NoSuchMethodError: 'org.apache.pulsar.shade.io.netty.buffer.ByteBuf org.apache.pulsar.client.api.MessageCrypto.encrypt(java.util.Set, org.apache.pulsar.client.api.CryptoKeyReader, java.util.function.Supplier, org.apache.pulsar.shade.io.netty.buffer.ByteBuf)'
	at org.apache.pulsar.client.impl.ProducerImpl.sendAsync(ProducerImpl.java:477)
	at org.apache.pulsar.client.impl.ProducerImpl.internalSendAsync(ProducerImpl.java:269)
	at org.apache.pulsar.client.impl.ProducerBase.send(ProducerBase.java:108)
	... 3 more
Caused by: java.lang.NoSuchMethodError: 'org.apache.pulsar.shade.io.netty.buffer.ByteBuf org.apache.pulsar.client.api.MessageCrypto.encrypt(java.util.Set, org.apache.pulsar.client.api.CryptoKeyReader, java.util.function.Supplier, org.apache.pulsar.shade.io.netty.buffer.ByteBuf)'
	at org.apache.pulsar.client.impl.ProducerImpl.encryptMessage(ProducerImpl.java:567)
	at org.apache.pulsar.client.impl.ProducerImpl.sendAsync(ProducerImpl.java:446)
	... 5 more

--------------------------------------------------------------------------------------------------
Followed the Encryption from the apache pulsar documentation and the sampleProducerConsumerTest class from pulsar client.
Generated a public key and the private key 
created a Pulsarclient object
--------------------------------------------------------------------------------------------------
client = PulsarClient.builder()
					.serviceUrl("pulsar+ssl:xxxxxxxxxxxxxxxxx:6651/")
					.tlsTrustCertsFilePath("src/main/resources/ca.cert.pem")
					.enableTls(true)
					.authentication("org.apache.pulsar.client.impl.auth.AuthenticationTls", authParams).build();

Producer<byte[]> producer = client.newProducer()
					.topic("persistent://tenant/namespace/nonprod-topic-1")
					.cryptoKeyReader(new RawFileKeyReader("src/main/resources/test_ecdsa_pubkey.pem", "src/main/resources/test_ecdsa_privkey.pem"))
					.addEncryptionKey("src/main/resources/test_ecdsa_pubkey.pem")
					.enableBatching(false)
					.create();

String message = "Test Messages";
			int i = 2;
			while(true) {
				i = i + 1;
				message = message + " Mesage # " + i;

				producer.send(message.getBytes());
				System.out.println("Printing the Messages " + message);
				producer.flush();
				if (i == 100) {
					break;
				}
			}
			producer.close();
			client.close();

To Reproduce Steps to reproduce the behavior:

1. Go to ' create a producer class in java. add the serviceUrl, generate public key, generate private key, use certificates for tls authentication, and make the topic as encryption enabled'
2. Click on ' run the sample producer'
3. Scroll down to ' console'
4. See error 
'org.apache.pulsar.client.api.PulsarClientException: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: java.lang.NoSuchMethodError: 'org.apache.pulsar.shade.io.netty.buffer.ByteBuf org.apache.pulsar.client.api.MessageCrypto.encrypt(java.util.Set, org.apache.pulsar.client.api.CryptoKeyReader, java.util.function.Supplier, org.apache.pulsar.shade.io.netty.buffer.ByteBuf)'

Expected behavior send message encrypted messages using ecdsa public key and private key,

Desktop (please complete the following information):

  • OS: [e.g. iOS] : I am using macOs Mojave version(10.14.6) -Pulsar-client version: 2.5.1

Additional context here are my dependecies i used

<dependency>
			<groupId>org.apache.pulsar</groupId>
			<artifactId>pulsar-io-netty</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.pulsar</groupId>
			<artifactId>pulsar-client-messagecrypto-bc</artifactId>
			<version>2.5.1</version>
		</dependency>
		
		<dependency>
			<groupId>org.apache.pulsar</groupId>
			<artifactId>pulsar-client</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.pulsar</groupId>
			<artifactId>pulsar-client-admin</artifactId>
			<version>2.5.1</version>
		</dependency>

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 20 (13 by maintainers)

Commits related to this issue

Most upvoted comments

Not sure how you got those errors. With 2.5.1 I get: Class not found for org.apache.pulsar.client.impl.crypto.MessageCryptoBc Which can be resolved by adding the following dependency compile group: ‘org.apache.pulsar’, name: ‘pulsar-client-messagecrypto-bc’, version: ‘2.5.1’