[ 
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]

Reply via email to