1414import com .sshtools .common .ssh .components .jce .OpenSshEd25519Certificate ;
1515import com .sshtools .common .ssh .components .jce .OpenSshRsaCertificate ;
1616import com .sshtools .common .util .UnsignedInteger64 ;
17+ import org .apache .commons .lang3 .ObjectUtils ;
1718
1819import java .io .IOException ;
1920import java .time .Duration ;
2021import java .time .Instant ;
2122import java .time .ZoneOffset ;
23+ import java .util .Collections ;
2224import java .util .List ;
2325
2426public class SshCertManager {
2527
26- public static SshCertificate generateCertificate (final SshCertificateType signType ,
28+ public static SshCertificate generateCertificate (final SshCertificateType certType ,
2729 final SshKeyPair key ,
2830 final String keyId ,
2931 final List <String > validPrincipals ,
@@ -32,19 +34,13 @@ public static SshCertificate generateCertificate(final SshCertificateType signTy
3234 final List <String > knownExtensions ,
3335 final SshKeyPair signedBy ) throws SshException , IOException , InvalidPassphraseException {
3436
35- final var type = switch (signType ) {
37+ final var type = switch (certType ) {
3638 case HOST -> SshCertificate .SSH_CERT_TYPE_HOST ;
3739 case USER -> SshCertificate .SSH_CERT_TYPE_USER ;
3840 };
3941
40- final var criticalOptions = new CriticalOption .Builder ()
41- .sourceAddress (sourceAddresses .toArray (String []::new ))
42- .build ();
43-
44- final var extensionsBuilder = new CertificateExtension .Builder ();
45- knownExtensions .forEach (extension -> extensionsBuilder .knownExtension (new NamedCertificateExtension (extension , true )));
46-
47- final var extensions = extensionsBuilder .build ();
42+ final var criticalOptions = buildCriticalOptions (certType , sourceAddresses );
43+ final var extensions = buildCertificateExtensions (certType , knownExtensions );
4844
4945 final var now = Instant .now ().atZone (ZoneOffset .UTC );
5046 final UnsignedInteger64 validAfter = new UnsignedInteger64 (now .toEpochSecond ());
@@ -53,6 +49,28 @@ public static SshCertificate generateCertificate(final SshCertificateType signTy
5349 return generateCertificate (key , 0L , type , keyId , validPrincipals , validAfter , validBefore , criticalOptions , extensions , signedBy );
5450 }
5551
52+
53+ private static List <CriticalOption > buildCriticalOptions (SshCertificateType certType , List <String > sourceAddresses ) {
54+ if (certType == SshCertificateType .HOST || ObjectUtils .isEmpty (sourceAddresses )) {
55+ return Collections .emptyList ();
56+ }
57+
58+ return new CriticalOption .Builder ()
59+ .sourceAddress (sourceAddresses .toArray (String []::new ))
60+ .build ();
61+ }
62+
63+ private static List <CertificateExtension > buildCertificateExtensions (SshCertificateType certType , List <String > knownExtensions ) {
64+ if (certType == SshCertificateType .HOST || ObjectUtils .isEmpty (knownExtensions )) {
65+ return Collections .emptyList ();
66+ }
67+
68+ final var extensionsBuilder = new CertificateExtension .Builder ();
69+ knownExtensions .forEach (extension -> extensionsBuilder .knownExtension (new NamedCertificateExtension (extension , true )));
70+ return extensionsBuilder .build ();
71+ }
72+
73+
5674 public static SshCertificate generateCertificate (final SshKeyPair key ,
5775 final long serial ,
5876 final int type ,
0 commit comments