[
https://issues.apache.org/jira/browse/JAMES-4226?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18111947#comment-18111947
]
Benoit Tellier commented on JAMES-4226:
---------------------------------------
It's a BouncyCastle behaviour change, not a James DKIM change. 3.8.2 shipped BC
1.70, 3.9.0 ships BC ≥ 1.81. BC hardened PemReader (1.78+): the -----END ...
----- marker must now start at column 0 of its line. So an indented -----END
PRIVATE KEY----- is no longer recognised, the reader runs to EOF and throws
-----END PRIVATE KEY----- not found. The -----BEGIN line is unaffected because
commons-configuration trims the element value, which is why parsing gets far
enough to know the type (PRIVATE KEY) before failing.
un-indent the END line (body lines are trim()-ed, so only the END marker
matters)
{code:java}
<privateKey>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpWOJIU5PKIeMa
...
+1xIWFWk4dVXbiVmwC1gWXE=
-----END PRIVATE KEY-----
</privateKey>
{code}
Even better: Use a separated file
{code:java}
<privateKeyFilepath>conf://dkim-signing.pem</privateKeyFilepath>
{code}
Keep us updated so we can close the ticket.
Have a nice weekend
Regards,
Benoit
> Problem during reading: -----END PRIVATE KEY----- not found
> -----------------------------------------------------------
>
> Key: JAMES-4226
> URL: https://issues.apache.org/jira/browse/JAMES-4226
> Project: James Server
> Issue Type: Bug
> Components: Mailet Contributions
> Affects Versions: 3.9.0
> Environment: Linux 857155.cloud4box.ru 7.0.0-22-generic #22-Ubuntu
> SMP PREEMPT_DYNAMIC Mon May 25 15:54:34 UTC 2026 x86_64 GNU/Linux
> openjdk 21.0.12 2026-07-21
> OpenJDK Runtime Environment (build 21.0.12+8-1-26.04-Ubuntu)
> OpenJDK 64-Bit Server VM (build 21.0.12+8-1-26.04-Ubuntu, mixed mode, sharing)
> Reporter: Oleg Kurchenko
> Priority: Blocker
>
> on start
> {code:java}
> 05-сент.-2026 14:40:39.218 ERROR [main]
> org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.parseConfiguration:327
> - Unable to init mailet org.apache.james.jdkim.mailets.DKIMSign
> jakarta.mail.MessagingException: Problem during reading: -----END PRIVATE
> KEY----- not found
> at org.apache.james.jdkim.mailets.DKIMSign.init(DKIMSign.java:150)
> ~[james-server-mailet-dkim-3.9.0.jar:3.9.0]
> at org.apache.mailet.base.GenericMailet.init(GenericMailet.java:227)
> ~[apache-mailet-base-3.9.0.jar:3.9.0]
> at
> org.apache.james.container.spring.bean.factory.mailetcontainer.MailetLoaderBeanFactory.getMailet(MailetLoaderBeanFactory.java:45)
> ~[james-server-spring-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.parseConfiguration(AbstractStateMailetProcessor.java:323)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.init(AbstractStateMailetProcessor.java:118)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.impl.MailetProcessorImpl.init(MailetProcessorImpl.java:196)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.impl.CompositeProcessorImpl.createMailProcessor(CompositeProcessorImpl.java:72)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.lib.AbstractStateCompositeProcessor.init(AbstractStateCompositeProcessor.java:177)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.impl.CompositeProcessorImpl.init(CompositeProcessorImpl.java:60)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
> ~[?:?]
> at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
> at
> org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMethod.invoke(InitDestroyAnnotationBeanPostProcessor.java:457)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:401)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:219)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:429)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1222)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1188)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1123)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:95)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.apache.james.container.spring.context.JamesServerApplicationContext.<init>(JamesServerApplicationContext.java:43)
> [james-server-spring-3.9.0.jar:3.9.0]
> at
> org.apache.james.app.spring.JamesAppSpringMain.init(JamesAppSpringMain.java:81)
> [james-server-spring-app-3.9.0.jar:3.9.0]
> at
> org.apache.james.app.spring.JamesAppSpringMain.main(JamesAppSpringMain.java:57)
> [james-server-spring-app-3.9.0.jar:3.9.0]
> Caused by: java.io.IOException: -----END PRIVATE KEY----- not found
> at org.bouncycastle.util.io.pem.PemReader.loadObject(Unknown Source)
> ~[bcprov-jdk18on-1.81.jar:?]
> at org.bouncycastle.util.io.pem.PemReader.readPemObject(Unknown Source)
> ~[bcprov-jdk18on-1.81.jar:?]
> at org.bouncycastle.openssl.PEMParser.readObject(Unknown Source)
> ~[bcpkix-jdk18on-1.81.jar:?]
> at
> org.apache.james.jdkim.mailets.DKIMSign.extractPrivateKey(DKIMSign.java:208)
> ~[james-server-mailet-dkim-3.9.0.jar:3.9.0]
> at org.apache.james.jdkim.mailets.DKIMSign.init(DKIMSign.java:144)
> ~[james-server-mailet-dkim-3.9.0.jar:3.9.0]
> ... 31 more
> 05-сент.-2026 14:40:39.240 ERROR [main]
> org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.parseConfiguration:329
> - Caused by nested exception:
> java.io.IOException: -----END PRIVATE KEY----- not found
> at org.bouncycastle.util.io.pem.PemReader.loadObject(Unknown Source)
> ~[bcprov-jdk18on-1.81.jar:?]
> at org.bouncycastle.util.io.pem.PemReader.readPemObject(Unknown Source)
> ~[bcprov-jdk18on-1.81.jar:?]
> at org.bouncycastle.openssl.PEMParser.readObject(Unknown Source)
> ~[bcpkix-jdk18on-1.81.jar:?]
> at
> org.apache.james.jdkim.mailets.DKIMSign.extractPrivateKey(DKIMSign.java:208)
> ~[james-server-mailet-dkim-3.9.0.jar:3.9.0]
> at org.apache.james.jdkim.mailets.DKIMSign.init(DKIMSign.java:144)
> ~[james-server-mailet-dkim-3.9.0.jar:3.9.0]
> at org.apache.mailet.base.GenericMailet.init(GenericMailet.java:227)
> ~[apache-mailet-base-3.9.0.jar:3.9.0]
> at
> org.apache.james.container.spring.bean.factory.mailetcontainer.MailetLoaderBeanFactory.getMailet(MailetLoaderBeanFactory.java:45)
> ~[james-server-spring-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.parseConfiguration(AbstractStateMailetProcessor.java:323)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor.init(AbstractStateMailetProcessor.java:118)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.impl.MailetProcessorImpl.init(MailetProcessorImpl.java:196)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.impl.CompositeProcessorImpl.createMailProcessor(CompositeProcessorImpl.java:72)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.lib.AbstractStateCompositeProcessor.init(AbstractStateCompositeProcessor.java:177)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> org.apache.james.mailetcontainer.impl.CompositeProcessorImpl.init(CompositeProcessorImpl.java:60)
> ~[james-server-mailetcontainer-impl-3.9.0.jar:3.9.0]
> at
> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
> ~[?:?]
> at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
> at
> org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMethod.invoke(InitDestroyAnnotationBeanPostProcessor.java:457)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:401)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:219)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:429)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
> ~[spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1222)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1188)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1123)
> [spring-beans-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:95)
> [spring-context-6.2.8.jar:6.2.8]
> at
> org.apache.james.container.spring.context.JamesServerApplicationContext.<init>(JamesServerApplicationContext.java:43)
> [james-server-spring-3.9.0.jar:3.9.0]
> at
> org.apache.james.app.spring.JamesAppSpringMain.init(JamesAppSpringMain.java:81)
> [james-server-spring-app-3.9.0.jar:3.9.0]
> at
> org.apache.james.app.spring.JamesAppSpringMain.main(JamesAppSpringMain.java:57)
> [james-server-spring-app-3.9.0.jar:3.9.0] {code}
> but in config (work with 3.8.2)
> {code:java}
> <mailet match="All" class="org.apache.james.jdkim.mailets.DKIMSign">
> <signatureTemplate>v=1; s=james; d=*******.ru;
> h=Message-ID:Date:Subject:From:To:MIME-Version:Content-Type; a=rsa-sha256;
> bh=; b=;</signatureTemplate>
> <privateKey>
> -----BEGIN PRIVATE
> KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpWOJIU5PKIeMa
> ......................
> +1xIWFWk4dVXbiVmwC1gWXE=
> -----END PRIVATE KEY-----
> </privateKey>
> </mailet>
> {code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]