Skip to content

Commit 1517bc8

Browse files
authored
add source addresses and extension only for user cert (#27)
1 parent 20d77d0 commit 1517bc8

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

.github/workflows/ssh-key-signer-server-docker.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ jobs:
7979
uses: docker/build-push-action@v6
8080
with:
8181
context: ${{ env.PROJECT_DIR }}/${{ env.PROJECT }}
82-
push: true
82+
push: ${{ startsWith(github.ref, 'refs/tags/v') }}
8383
platforms: linux/amd64,linux/arm64
8484
tags: ${{ steps.meta.outputs.tags }}
8585
labels: ${{ steps.meta.outputs.labels }}

server/ssh-key-signer-server/src/main/java/io/binarycodes/homelab/sshkeysigner/keymanagement/KeyService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,17 @@ public Optional<SignedPublicKeyDownload> signHostKey(final String filename, fina
154154
return signKey(SshCertificateType.HOST, filename, bytes, keyId, principals, applicationProperties.caHostValidity());
155155
}
156156

157-
private Optional<SignedPublicKeyDownload> signKey(final SshCertificateType signType, final String filename, final byte[] bytes, final String keyId, final List<String> principals, final Duration validitySeconds) {
157+
private Optional<SignedPublicKeyDownload> signKey(final SshCertificateType certType, final String filename, final byte[] bytes, final String keyId, final List<String> principals, final Duration validitySeconds) {
158158
try {
159159
final var publicKeyFileToSign = SshPublicKeyFileFactory.parse(bytes);
160160
final var keyPairToSign = SshKeyPair.getKeyPair(null, publicKeyFileToSign.toPublicKey());
161161

162-
final var signedBy = switch (signType) {
162+
final var signedBy = switch (certType) {
163163
case HOST -> readHostCAKeys();
164164
case USER -> readUserCAKeys();
165165
};
166166

167-
final var signed = SshCertManager.generateCertificate(signType, keyPairToSign, keyId, principals, validitySeconds, applicationProperties.sourceAddresses(), applicationProperties.knownExtensions(), signedBy);
167+
final var signed = SshCertManager.generateCertificate(certType, keyPairToSign, keyId, principals, validitySeconds, applicationProperties.sourceAddresses(), applicationProperties.knownExtensions(), signedBy);
168168

169169
final var signedKey = SshPublicKeyFileFactory.create(signed.getCertificate(), publicKeyFileToSign.getComment(), SshPublicKeyFileFactory.OPENSSH_FORMAT);
170170
final var signedKeyString = new String(signedKey.getFormattedKey(), StandardCharsets.UTF_8);

server/ssh-key-signer-server/src/main/java/io/binarycodes/homelab/sshkeysigner/keymanagement/SshCertManager.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,18 @@
1414
import com.sshtools.common.ssh.components.jce.OpenSshEd25519Certificate;
1515
import com.sshtools.common.ssh.components.jce.OpenSshRsaCertificate;
1616
import com.sshtools.common.util.UnsignedInteger64;
17+
import org.apache.commons.lang3.ObjectUtils;
1718

1819
import java.io.IOException;
1920
import java.time.Duration;
2021
import java.time.Instant;
2122
import java.time.ZoneOffset;
23+
import java.util.Collections;
2224
import java.util.List;
2325

2426
public 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

Comments
 (0)