feat: v0.2.0, support client ca from piv card
This commit is contained in:
@@ -58,3 +58,13 @@ $ java -jar yubikey-ca-java.jar --issue-client-code-ca \
|
||||
--pin ****** \
|
||||
[--add-to-remote]
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```shell
|
||||
$ java -jar yubikey-ca-java.jar --issue-client-code-ca \
|
||||
--sign-slot 89 --cert-slot 90 --subject 'CN=Hatter Signing CA' --valid-years 10 \
|
||||
--intermediate-ca-id 44 \
|
||||
--pin ****** \
|
||||
[--add-to-remote]
|
||||
```
|
||||
|
||||
@@ -2,5 +2,5 @@ package me.hatter.tools.yubikeyca;
|
||||
|
||||
public interface YubikeyCaConstant {
|
||||
String NAME = "yubikey-ca";
|
||||
String VERSION = "0.1.1";
|
||||
String VERSION = "0.2.0";
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@ import me.hatter.tools.yubikeyca.cardcli.PivMeta;
|
||||
import me.hatter.tools.yubikeyca.hatterink.CertificateUtil;
|
||||
|
||||
import java.security.KeyPair;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.PublicKey;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -49,8 +51,8 @@ public class YubikeyCaMain {
|
||||
log.error("Intermediate CA id is required.");
|
||||
return;
|
||||
}
|
||||
if (StringUtil.isEmpty(args.keypairType)) {
|
||||
log.error("Keypair type is required.");
|
||||
if (StringUtil.isEmpty(args.keypairType) && StringUtil.isEmpty(args.certSlot)) {
|
||||
log.error("Keypair type or cert slot is required.");
|
||||
return;
|
||||
}
|
||||
if (args.issueServerCa && (args.dnsNames == null || args.dnsNames.length == 0)) {
|
||||
@@ -58,20 +60,28 @@ public class YubikeyCaMain {
|
||||
return;
|
||||
}
|
||||
|
||||
final PKType pkType = getPkTypeFromArgs(args);
|
||||
if (pkType == null) return;
|
||||
|
||||
final X509Certificate interCertificate = CertificateUtil.getCertificate(args.pin, args.intermediateCaId);
|
||||
|
||||
final PivMeta signPivMeta = CardCliUtil.getPivPublicKey(args.signSlot);
|
||||
|
||||
final KeyPair keyPair = KeyPairTool.instance(pkType).generateKeyPair().getKeyPair();
|
||||
final PublicKey publicKey;
|
||||
PrivateKey privateKey = null;
|
||||
if (StringUtil.isEmpty(args.certSlot)) {
|
||||
final PKType pkType = getPkTypeFromArgs(args);
|
||||
if (pkType == null) return;
|
||||
final KeyPair keyPair = KeyPairTool.instance(pkType).generateKeyPair().getKeyPair();
|
||||
publicKey = keyPair.getPublic();
|
||||
privateKey = keyPair.getPrivate();
|
||||
} else {
|
||||
final PivMeta certPivMeta = CardCliUtil.getPivPublicKey(args.certSlot);
|
||||
publicKey = certPivMeta.getPublicKey();
|
||||
}
|
||||
|
||||
final String cardCliCmd = CardCliUtil.getCardCliCmd();
|
||||
final CertificateAuthority ca = CertificateAuthority.instance()
|
||||
.subject(args.subject)
|
||||
.signCert(interCertificate)
|
||||
.certPubKey(keyPair.getPublic())
|
||||
.certPubKey(publicKey)
|
||||
.validYears(validYears(args, 2))
|
||||
.customerSigner(new CardCliPivCustomerSigner(
|
||||
args.pin, args.signSlot, signPivMeta.getAlgorithm(), cardCliCmd));
|
||||
@@ -85,7 +95,10 @@ public class YubikeyCaMain {
|
||||
cert = ca.createClientCert();
|
||||
}
|
||||
final String certPem = X509CertUtil.serializeX509CertificateToPEM(cert);
|
||||
final String privateKeyPem = KeyUtil.serializePrivateKeyToPEM(keyPair.getPrivate());
|
||||
String privateKeyPem = null;
|
||||
if (privateKey != null) {
|
||||
privateKeyPem = KeyUtil.serializePrivateKeyToPEM(privateKey);
|
||||
}
|
||||
|
||||
log.info("Issued CA: \n" + certPem);
|
||||
if (args.addToRemote) {
|
||||
@@ -108,6 +121,7 @@ public class YubikeyCaMain {
|
||||
|
||||
final X509Certificate rootCertificate = CertificateUtil.getCertificate(args.pin, args.rootCaId);
|
||||
|
||||
final PivMeta signPivMeta = CardCliUtil.getPivPublicKey(args.signSlot);
|
||||
final PivMeta certPivMeta = CardCliUtil.getPivPublicKey(args.certSlot);
|
||||
|
||||
final String cardCliCmd = CardCliUtil.getCardCliCmd();
|
||||
@@ -117,7 +131,7 @@ public class YubikeyCaMain {
|
||||
.certPubKey(certPivMeta.getPublicKey())
|
||||
.validYears(validYears(args, 10))
|
||||
.customerSigner(new CardCliPivCustomerSigner(
|
||||
args.pin, args.signSlot, certPivMeta.getAlgorithm(), cardCliCmd))
|
||||
args.pin, args.signSlot, signPivMeta.getAlgorithm(), cardCliCmd))
|
||||
.createIntermediateCert();
|
||||
final String intermediateCaPem = X509CertUtil.serializeX509CertificateToPEM(intermediateCa);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user