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 ****** \
|
--pin ****** \
|
||||||
[--add-to-remote]
|
[--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 {
|
public interface YubikeyCaConstant {
|
||||||
String NAME = "yubikey-ca";
|
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 me.hatter.tools.yubikeyca.hatterink.CertificateUtil;
|
||||||
|
|
||||||
import java.security.KeyPair;
|
import java.security.KeyPair;
|
||||||
|
import java.security.PrivateKey;
|
||||||
|
import java.security.PublicKey;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
@@ -49,8 +51,8 @@ public class YubikeyCaMain {
|
|||||||
log.error("Intermediate CA id is required.");
|
log.error("Intermediate CA id is required.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (StringUtil.isEmpty(args.keypairType)) {
|
if (StringUtil.isEmpty(args.keypairType) && StringUtil.isEmpty(args.certSlot)) {
|
||||||
log.error("Keypair type is required.");
|
log.error("Keypair type or cert slot is required.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (args.issueServerCa && (args.dnsNames == null || args.dnsNames.length == 0)) {
|
if (args.issueServerCa && (args.dnsNames == null || args.dnsNames.length == 0)) {
|
||||||
@@ -58,20 +60,28 @@ public class YubikeyCaMain {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PKType pkType = getPkTypeFromArgs(args);
|
|
||||||
if (pkType == null) return;
|
|
||||||
|
|
||||||
final X509Certificate interCertificate = CertificateUtil.getCertificate(args.pin, args.intermediateCaId);
|
final X509Certificate interCertificate = CertificateUtil.getCertificate(args.pin, args.intermediateCaId);
|
||||||
|
|
||||||
final PivMeta signPivMeta = CardCliUtil.getPivPublicKey(args.signSlot);
|
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 String cardCliCmd = CardCliUtil.getCardCliCmd();
|
||||||
final CertificateAuthority ca = CertificateAuthority.instance()
|
final CertificateAuthority ca = CertificateAuthority.instance()
|
||||||
.subject(args.subject)
|
.subject(args.subject)
|
||||||
.signCert(interCertificate)
|
.signCert(interCertificate)
|
||||||
.certPubKey(keyPair.getPublic())
|
.certPubKey(publicKey)
|
||||||
.validYears(validYears(args, 2))
|
.validYears(validYears(args, 2))
|
||||||
.customerSigner(new CardCliPivCustomerSigner(
|
.customerSigner(new CardCliPivCustomerSigner(
|
||||||
args.pin, args.signSlot, signPivMeta.getAlgorithm(), cardCliCmd));
|
args.pin, args.signSlot, signPivMeta.getAlgorithm(), cardCliCmd));
|
||||||
@@ -85,7 +95,10 @@ public class YubikeyCaMain {
|
|||||||
cert = ca.createClientCert();
|
cert = ca.createClientCert();
|
||||||
}
|
}
|
||||||
final String certPem = X509CertUtil.serializeX509CertificateToPEM(cert);
|
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);
|
log.info("Issued CA: \n" + certPem);
|
||||||
if (args.addToRemote) {
|
if (args.addToRemote) {
|
||||||
@@ -108,6 +121,7 @@ public class YubikeyCaMain {
|
|||||||
|
|
||||||
final X509Certificate rootCertificate = CertificateUtil.getCertificate(args.pin, args.rootCaId);
|
final X509Certificate rootCertificate = CertificateUtil.getCertificate(args.pin, args.rootCaId);
|
||||||
|
|
||||||
|
final PivMeta signPivMeta = CardCliUtil.getPivPublicKey(args.signSlot);
|
||||||
final PivMeta certPivMeta = CardCliUtil.getPivPublicKey(args.certSlot);
|
final PivMeta certPivMeta = CardCliUtil.getPivPublicKey(args.certSlot);
|
||||||
|
|
||||||
final String cardCliCmd = CardCliUtil.getCardCliCmd();
|
final String cardCliCmd = CardCliUtil.getCardCliCmd();
|
||||||
@@ -117,7 +131,7 @@ public class YubikeyCaMain {
|
|||||||
.certPubKey(certPivMeta.getPublicKey())
|
.certPubKey(certPivMeta.getPublicKey())
|
||||||
.validYears(validYears(args, 10))
|
.validYears(validYears(args, 10))
|
||||||
.customerSigner(new CardCliPivCustomerSigner(
|
.customerSigner(new CardCliPivCustomerSigner(
|
||||||
args.pin, args.signSlot, certPivMeta.getAlgorithm(), cardCliCmd))
|
args.pin, args.signSlot, signPivMeta.getAlgorithm(), cardCliCmd))
|
||||||
.createIntermediateCert();
|
.createIntermediateCert();
|
||||||
final String intermediateCaPem = X509CertUtil.serializeX509CertificateToPEM(intermediateCa);
|
final String intermediateCaPem = X509CertUtil.serializeX509CertificateToPEM(intermediateCa);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user