|
11 | 11 | import com.beust.jcommander.Parameter; |
12 | 12 | import com.beust.jcommander.ParameterException; |
13 | 13 | import de.rub.nds.tlsattacker.core.certificate.CertificateKeyPair; |
| 14 | +import de.rub.nds.tlsattacker.core.certificate.PemUtil; |
14 | 15 | import de.rub.nds.tlsattacker.core.config.Config; |
| 16 | +import de.rub.nds.tlsattacker.core.crypto.keys.CustomPrivateKey; |
15 | 17 | import de.rub.nds.tlsattacker.core.exceptions.ConfigurationException; |
| 18 | +import de.rub.nds.tlsattacker.core.util.CertificateUtils; |
16 | 19 | import de.rub.nds.tlsattacker.core.util.JKSLoader; |
17 | 20 | import de.rub.nds.tlsattacker.transport.ConnectionEndType; |
18 | 21 | import de.rub.nds.tlsattacker.util.KeystoreHandler; |
| 22 | +import java.io.File; |
19 | 23 | import java.io.IOException; |
20 | 24 | import java.security.KeyStore; |
21 | 25 | import java.security.KeyStoreException; |
|
32 | 36 |
|
33 | 37 | public class CertificateDelegate extends Delegate { |
34 | 38 |
|
| 39 | + @Parameter(names = "-cert", description = "PEM encoded certificate file") |
| 40 | + private String certificate = null; |
| 41 | + |
| 42 | + @Parameter(names = "-key", description = "PEM encoded private key") |
| 43 | + private String key = null; |
| 44 | + |
35 | 45 | @Parameter(names = "-keystore", description = "Java Key Store (JKS) file to use as a certificate") |
36 | 46 | private String keystore = null; |
37 | 47 |
|
@@ -68,12 +78,56 @@ public void setAlias(String alias) { |
68 | 78 | this.alias = alias; |
69 | 79 | } |
70 | 80 |
|
| 81 | + public String getCertificate() { |
| 82 | + return certificate; |
| 83 | + } |
| 84 | + |
| 85 | + public void setCertificate(String certificate) { |
| 86 | + this.certificate = certificate; |
| 87 | + } |
| 88 | + |
| 89 | + public String getKey() { |
| 90 | + return key; |
| 91 | + } |
| 92 | + |
| 93 | + public void setKey(String key) { |
| 94 | + this.key = key; |
| 95 | + } |
| 96 | + |
71 | 97 | @Override |
72 | 98 | public void applyDelegate(Config config) { |
73 | 99 | Map<String, String> mandatoryParameters = new HashMap<>(); |
74 | 100 | mandatoryParameters.put("keystore", keystore); |
75 | 101 | mandatoryParameters.put("password", password); |
76 | 102 | mandatoryParameters.put("alias", alias); |
| 103 | + |
| 104 | + PrivateKey privateKey = null; |
| 105 | + if (key != null) { |
| 106 | + LOGGER.debug("Loading private key"); |
| 107 | + try { |
| 108 | + privateKey = PemUtil.readPrivateKey(new File(key)); |
| 109 | + CustomPrivateKey customPrivateKey = CertificateUtils.parseCustomPrivateKey(privateKey); |
| 110 | + customPrivateKey.adjustInConfig(config, ConnectionEndType.CLIENT); |
| 111 | + customPrivateKey.adjustInConfig(config, ConnectionEndType.SERVER); |
| 112 | + |
| 113 | + } catch (IOException ex) { |
| 114 | + LOGGER.warn("Could not read private key", ex); |
| 115 | + } |
| 116 | + } |
| 117 | + if (certificate != null) { |
| 118 | + LOGGER.debug("Loading ceritificate"); |
| 119 | + try { |
| 120 | + Certificate cert = PemUtil.readCertificate(new File(certificate)); |
| 121 | + if (privateKey != null) { |
| 122 | + config.setDefaultExplicitCertificateKeyPair(new CertificateKeyPair(cert, privateKey)); |
| 123 | + } else { |
| 124 | + config.setDefaultExplicitCertificateKeyPair(new CertificateKeyPair(cert)); |
| 125 | + } |
| 126 | + config.setAutoSelectCertificate(false); |
| 127 | + } catch (Exception ex) { |
| 128 | + LOGGER.warn("Could not read certificate", ex); |
| 129 | + } |
| 130 | + } |
77 | 131 | List<String> missingParameters = new ArrayList<>(); |
78 | 132 | for (String p : mandatoryParameters.keySet()) { |
79 | 133 | if (mandatoryParameters.get(p) == null) { |
@@ -102,7 +156,6 @@ public void applyDelegate(Config config) { |
102 | 156 | } |
103 | 157 | KeyStore store = KeystoreHandler.loadKeyStore(keystore, password); |
104 | 158 | Certificate cert = JKSLoader.loadTLSCertificate(store, alias); |
105 | | - PrivateKey privateKey = null; |
106 | 159 | privateKey = (PrivateKey) store.getKey(alias, password.toCharArray()); |
107 | 160 | CertificateKeyPair pair = new CertificateKeyPair(cert, privateKey); |
108 | 161 | pair.adjustInConfig(config, type); |
|
0 commit comments