@@ -59,15 +59,18 @@ private static final class X509CertificateHolder
5959 {
6060 final X509Certificate certificate ;
6161 final Predicate <String > isClientOnly ;
62+ final Predicate <String > isServerOnly ;
6263 final JcaX509CertificateHolder certificateHolder ;
6364
6465 final List <X509CertificateHolder > children = new ArrayList <>();
6566 X509CertificateHolder parent ;
6667
67- X509CertificateHolder (X509Certificate certificate , Predicate <String > isClientOnly )
68+ X509CertificateHolder (X509Certificate certificate , Predicate <String > isClientOnly ,
69+ Predicate <String > isServerOnly )
6870 {
6971 this .certificate = certificate ;
7072 this .isClientOnly = isClientOnly ;
73+ this .isServerOnly = isServerOnly ;
7174
7275 try
7376 {
@@ -106,6 +109,12 @@ boolean isClientOnly()
106109 : getChildren ().stream ().allMatch (X509CertificateHolder ::isClientOnly );
107110 }
108111
112+ boolean isServerOnly ()
113+ {
114+ return getChildren ().isEmpty () ? isServerOnly .test (getSubjectCommonName ())
115+ : getChildren ().stream ().allMatch (X509CertificateHolder ::isServerOnly );
116+ }
117+
109118 X500Name getSubject ()
110119 {
111120 return certificateHolder .getSubject ();
@@ -151,22 +160,26 @@ ZonedDateTime getNotBefore()
151160 private final Path projectBasedir ;
152161 private final Path certFolder ;
153162 private final List <String > clientOnlyCaCommonNames ;
163+ private final List <String > serverOnlyCaCommonNames ;
154164
155- public DefaultCaFilesGenerator (Path projectBasedir , Path certFolder , List <String > clientOnlyCaCommonNames )
156- throws MojoExecutionException
165+ public DefaultCaFilesGenerator (Path projectBasedir , Path certFolder , List <String > clientOnlyCaCommonNames ,
166+ List < String > serverOnlyCaCommonNames ) throws MojoExecutionException
157167 {
158168 this .projectBasedir = projectBasedir ;
159169 this .certFolder = certFolder ;
160170 this .clientOnlyCaCommonNames = clientOnlyCaCommonNames ;
171+ this .serverOnlyCaCommonNames = serverOnlyCaCommonNames ;
161172
162173 if (projectBasedir == null )
163174 throw new MojoExecutionException ("projectBasedir not defined" );
164175 if (certFolder == null )
165176 throw new MojoExecutionException ("certFolder not defined" );
166177 if (!Files .isReadable (certFolder ))
167178 throw new MojoExecutionException ("certFolder '" + certFolder .toString () + "' not readable" );
168- if (clientOnlyCaCommonNames == null || clientOnlyCaCommonNames .isEmpty ())
169- throw new MojoExecutionException ("clientOnlyCaCommonNames not defined or empty" );
179+ if (clientOnlyCaCommonNames == null )
180+ throw new MojoExecutionException ("clientOnlyCaCommonNames not defined" );
181+ if (serverOnlyCaCommonNames == null )
182+ throw new MojoExecutionException ("serverOnlyCaCommonNames not defined" );
170183 }
171184
172185 public void createFiles (Stream <Path > clientIssuingCas , Stream <Path > clientCaChains , Stream <Path > serverRootCas )
@@ -186,7 +199,7 @@ public void createFiles(Stream<Path> clientIssuingCas, Stream<Path> clientCaChai
186199 if (iToWrite .isEmpty () && cToWrite .isEmpty () && sWrite .isEmpty ())
187200 return ;
188201
189- List <X509CertificateHolder > certificates = readCertificates (certFolder , clientOnlyCaCommonNames );
202+ List <X509CertificateHolder > certificates = readCertificates ();
190203
191204 try
192205 {
@@ -215,14 +228,13 @@ private Predicate<Path> isDirectory(String logMessage)
215228 };
216229 }
217230
218- private List <X509CertificateHolder > readCertificates (Path certFolder , List <String > clientOnlyCaCommonNames )
219- throws IOException
231+ private List <X509CertificateHolder > readCertificates () throws IOException
220232 {
221233 List <X509CertificateHolder > certificates = new ArrayList <>();
222234 try (DirectoryStream <Path > directoryStream = Files .newDirectoryStream (certFolder ,
223235 entry -> entry .getFileName ().toString ().endsWith (".pem" )))
224236 {
225- directoryStream .forEach (readCertificate (certificates , clientOnlyCaCommonNames ));
237+ directoryStream .forEach (readCertificate (certificates ));
226238 }
227239
228240 Map <X500Name , X509CertificateHolder > certificatesBySubject = certificates .stream ()
@@ -232,16 +244,15 @@ private List<X509CertificateHolder> readCertificates(Path certFolder, List<Strin
232244 return certificates ;
233245 }
234246
235- private Consumer <? super Path > readCertificate (List <X509CertificateHolder > certificates ,
236- List <String > clientOnlyCaCommonNames )
247+ private Consumer <? super Path > readCertificate (List <X509CertificateHolder > certificates )
237248 {
238249 return file ->
239250 {
240251 try
241252 {
242253 logger .info ("Reading certificate from {}" , projectBasedir .relativize (file ));
243254 X509CertificateHolder certificate = new X509CertificateHolder (PemReader .readCertificate (file ),
244- clientOnlyCaCommonNames ::contains );
255+ clientOnlyCaCommonNames ::contains , serverOnlyCaCommonNames :: contains );
245256
246257 if (!certificate .isCa ())
247258 throw new RuntimeException ("Certificate in " + file .toString () + " is not a CA certificate" );
@@ -274,6 +285,7 @@ private Consumer<? super Path> readCertificate(List<X509CertificateHolder> certi
274285 private Consumer <Path > writeClientIssuingCas (List <X509CertificateHolder > certificates , String logMessage )
275286 {
276287 List <X509CertificateHolder > issuingCas = certificates .stream ().filter (X509CertificateHolder ::isIssuingCa )
288+ .filter (Predicate .not (X509CertificateHolder ::isServerOnly ))
277289 .sorted (Comparator .comparing (X509CertificateHolder ::getSubjectCommonName )).toList ();
278290
279291 return folder -> issuingCas .forEach (writeCert (folder , logMessage ));
@@ -282,6 +294,7 @@ private Consumer<Path> writeClientIssuingCas(List<X509CertificateHolder> certifi
282294 private Consumer <Path > writeClientCaChains (List <X509CertificateHolder > certificates , String logMessage )
283295 {
284296 List <X509CertificateHolder > caChains = certificates .stream ().filter (X509CertificateHolder ::isRoot )
297+ .filter (Predicate .not (X509CertificateHolder ::isServerOnly ))
285298 .sorted (Comparator .comparing (X509CertificateHolder ::getSubjectCommonName )).flatMap (childern ()).toList ();
286299
287300 return folder -> caChains .forEach (writeCert (folder , logMessage ));
0 commit comments