Skip to content

Commit 34430a3

Browse files
mhodovaniukGrégoire Rolland
authored andcommitted
Read ca_chain from PKI response and store it in Credential (jopenlibs#56)
(cherry picked from commit be413f6)
1 parent 3357456 commit 34430a3

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

src/main/java/io/github/jopenlibs/vault/api/pki/Credential.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* final Credential options = new Credential()
1414
* .certificate(...)
1515
* .issuingCa(...)
16+
* .caChain(...)
1617
* .privateKey(...)
1718
* .privateKeyType(...)
1819
* .serialNumber(...);
@@ -23,6 +24,7 @@ public class Credential implements Serializable {
2324

2425
private String certificate;
2526
private String issuingCa;
27+
private List<String> caChain;
2628
private String privateKey;
2729
private String privateKeyType;
2830
private String serialNumber;
@@ -47,6 +49,17 @@ public Credential issuingCa(final String issuingCa) {
4749
return this;
4850
}
4951

52+
/**
53+
* @param caChain The list of intermediate and root certificates, in PEM format.
54+
* It is only included if there is in fact a chain outside of a built-in Vault CA cert being used for the issuing/signing.
55+
* @return This object, with the CA chain populated, ready for other builder
56+
* methods or immediate use.
57+
*/
58+
public Credential caChain(final List<String> caChain) {
59+
this.caChain = caChain;
60+
return this;
61+
}
62+
5063
/**
5164
* @param privateKey The private key, in PEM format
5265
* @return This object, with the private key populated, ready for other builder methods or
@@ -85,6 +98,10 @@ public String getIssuingCa() {
8598
return issuingCa;
8699
}
87100

101+
public List<String> getCaChain() {
102+
return caChain;
103+
}
104+
88105
public String getPrivateKey() {
89106
return privateKey;
90107
}

src/main/java/io/github/jopenlibs/vault/response/PkiResponse.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import io.github.jopenlibs.vault.api.Logical;
44
import io.github.jopenlibs.vault.api.pki.Credential;
55
import io.github.jopenlibs.vault.api.pki.RoleOptions;
6+
import io.github.jopenlibs.vault.json.JsonObject;
7+
import io.github.jopenlibs.vault.json.JsonValue;
68
import io.github.jopenlibs.vault.rest.RestResponse;
79
import java.util.ArrayList;
810
import java.util.List;
911
import java.util.Map;
1012
import java.util.StringTokenizer;
13+
import java.util.stream.Collectors;
1114

1215
/**
1316
* This class is a container for the information returned by Vault in PKI backend API operations
@@ -25,7 +28,7 @@ public class PkiResponse extends LogicalResponse {
2528
public PkiResponse(final RestResponse restResponse, final int retries) {
2629
super(restResponse, retries, Logical.logicalOperations.authentication);
2730
roleOptions = buildRoleOptionsFromData(this.getData());
28-
credential = buildCredentialFromData(this.getData());
31+
credential = buildCredentialFromData(this.getData(), this.getDataObject());
2932
}
3033

3134
public RoleOptions getRoleOptions() {
@@ -104,14 +107,21 @@ private RoleOptions buildRoleOptionsFromData(final Map<String, String> data) {
104107
*
105108
* @param data The <code>"data"</code> object from a Vault JSON response, converted into Java
106109
* key-value pairs.
110+
* @param dataObject The <code>"data"</code> object from a Vault JSON response.
107111
* @return A container for credential data
108112
*/
109-
private Credential buildCredentialFromData(final Map<String, String> data) {
113+
private Credential buildCredentialFromData(final Map<String, String> data, final JsonObject dataObject) {
110114
if (data == null) {
111115
return null;
112116
}
113117
final String certificate = data.get("certificate");
114118
final String issuingCa = data.get("issuing_ca");
119+
final JsonValue caChainJsonValue = dataObject != null ? dataObject.get("ca_chain") : null;
120+
final List<String> caChain = caChainJsonValue != null
121+
? caChainJsonValue.asArray().values().stream()
122+
.map(JsonValue::asString)
123+
.collect(Collectors.toList())
124+
: null;
115125
final String privateKey = data.get("private_key");
116126
final String privateKeyType = data.get("private_key_type");
117127
final String serialNumber = data.get("serial_number");
@@ -123,6 +133,7 @@ private Credential buildCredentialFromData(final Map<String, String> data) {
123133
return new Credential()
124134
.certificate(certificate)
125135
.issuingCa(issuingCa)
136+
.caChain(caChain)
126137
.privateKey(privateKey)
127138
.privateKeyType(privateKeyType)
128139
.serialNumber(serialNumber);

src/test-integration/java/io/github/jopenlibs/vault/api/AuthBackendPkiTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ public void testIssueCredentialWithCsr()
145145
final PkiResponse issueResponse = vault.pki()
146146
.issue("testRole", "test.myvault.com", null, null, "1h", CredentialFormat.PEM, csr);
147147
TestCase.assertNotNull(issueResponse.getCredential().getCertificate());
148+
TestCase.assertNotNull(issueResponse.getCredential().getCaChain());
148149
TestCase.assertNull(issueResponse.getCredential().getPrivateKey());
149150
TestCase.assertNotNull(issueResponse.getCredential().getSerialNumber());
150151
TestCase.assertNotNull(issueResponse.getCredential().getIssuingCa());

0 commit comments

Comments
 (0)