|
| 1 | +/** |
| 2 | + * |
| 3 | + */ |
| 4 | +package com.venafi.vcert.sdk.vcertTknClient; |
| 5 | + |
| 6 | +import static org.assertj.core.api.Assertions.assertThat; |
| 7 | +import static org.junit.Assert.assertTrue; |
| 8 | + |
| 9 | +import java.io.IOException; |
| 10 | +import java.io.StringReader; |
| 11 | +import java.net.SocketException; |
| 12 | +import java.net.UnknownHostException; |
| 13 | +import java.security.NoSuchAlgorithmException; |
| 14 | +import java.security.cert.CertificateException; |
| 15 | +import java.security.cert.X509Certificate; |
| 16 | +import java.util.ArrayList; |
| 17 | +import java.util.List; |
| 18 | + |
| 19 | +import org.apache.commons.codec.digest.DigestUtils; |
| 20 | +import org.bouncycastle.util.io.pem.PemHeader; |
| 21 | +import org.bouncycastle.util.io.pem.PemObject; |
| 22 | +import org.bouncycastle.util.io.pem.PemReader; |
| 23 | +import org.junit.jupiter.api.DisplayName; |
| 24 | +import org.junit.jupiter.api.Test; |
| 25 | +import org.junit.jupiter.api.extension.RegisterExtension; |
| 26 | + |
| 27 | +import com.venafi.vcert.sdk.TestUtils; |
| 28 | +import com.venafi.vcert.sdk.VCertException; |
| 29 | +import com.venafi.vcert.sdk.VCertTknClient; |
| 30 | +import com.venafi.vcert.sdk.certificate.CertificateRequest; |
| 31 | +import com.venafi.vcert.sdk.certificate.CsrOriginOption; |
| 32 | +import com.venafi.vcert.sdk.certificate.CustomField; |
| 33 | +import com.venafi.vcert.sdk.certificate.DataFormat; |
| 34 | +import com.venafi.vcert.sdk.certificate.ImportRequest; |
| 35 | +import com.venafi.vcert.sdk.certificate.ImportResponse; |
| 36 | +import com.venafi.vcert.sdk.certificate.PEMCollection; |
| 37 | +import com.venafi.vcert.sdk.certificate.RenewalRequest; |
| 38 | +import com.venafi.vcert.sdk.certificate.RevocationRequest; |
| 39 | +import com.venafi.vcert.sdk.connectors.ZoneConfiguration; |
| 40 | + |
| 41 | +/** |
| 42 | + * @author Marcos E. Albornoz Abud |
| 43 | + * |
| 44 | + */ |
| 45 | +public class VCertTknClientCertAT { |
| 46 | + |
| 47 | + @RegisterExtension |
| 48 | + public static final VCertTknClientCertResource clientResource = new VCertTknClientCertResource(); |
| 49 | + |
| 50 | + @Test |
| 51 | + void requestCertificate() throws VCertException, SocketException, UnknownHostException { |
| 52 | + VCertTknClient client = clientResource.client(); |
| 53 | + ZoneConfiguration zoneConfiguration = clientResource.zoneConfiguration(); |
| 54 | + |
| 55 | + CertificateRequest certificateRequest = client.generateRequest(zoneConfiguration, clientResource.certificateRequest()); |
| 56 | + CertificateRequest csrRequestOnly = new CertificateRequest().csr(certificateRequest.csr()); |
| 57 | + assertThat(client.requestCertificate(csrRequestOnly, zoneConfiguration)).isNotNull(); |
| 58 | + } |
| 59 | + |
| 60 | + @Test |
| 61 | + void retrieveCertificate() throws VCertException, SocketException, UnknownHostException { |
| 62 | + VCertTknClient client = clientResource.client(); |
| 63 | + ZoneConfiguration zoneConfiguration = clientResource.zoneConfiguration(); |
| 64 | + CertificateRequest certificateRequest = clientResource.certificateRequest() |
| 65 | + //.keyType(KeyType.ECDSA).keyCurve(EllipticCurve.EllipticCurveP521) |
| 66 | + //.keyType(KeyType.RSA).keyLength(2048) |
| 67 | + //.dataFormat(DataFormat.LEGACY) |
| 68 | + //.keyPassword("newtiran000!") |
| 69 | + //.csrOrigin(CsrOriginOption.ServiceGeneratedCSR) |
| 70 | + ; |
| 71 | + |
| 72 | + certificateRequest = client.generateRequest(zoneConfiguration, certificateRequest); |
| 73 | + String certificateId = client.requestCertificate(certificateRequest, zoneConfiguration); |
| 74 | + |
| 75 | + assertThat(certificateId).isNotNull(); |
| 76 | + |
| 77 | + PEMCollection pemCollection = client.retrieveCertificate(certificateRequest); |
| 78 | + |
| 79 | + assertThat(pemCollection.certificate()).isNotNull(); |
| 80 | + assertThat(pemCollection.privateKey()).isNotNull(); |
| 81 | + } |
| 82 | + |
| 83 | + @Test |
| 84 | + void renewCertificate() throws VCertException, UnknownHostException, SocketException, |
| 85 | + CertificateException, NoSuchAlgorithmException { |
| 86 | + |
| 87 | + VCertTknClient client = clientResource.client(); |
| 88 | + ZoneConfiguration zoneConfiguration = clientResource.zoneConfiguration(); |
| 89 | + CertificateRequest certificateRequest = client.generateRequest(zoneConfiguration, clientResource.certificateRequest()); |
| 90 | + String certificateId = client.requestCertificate(certificateRequest, zoneConfiguration); |
| 91 | + assertThat(certificateId).isNotNull(); |
| 92 | + |
| 93 | + PEMCollection pemCollection = client.retrieveCertificate(certificateRequest); |
| 94 | + X509Certificate cert = (X509Certificate) pemCollection.certificate(); |
| 95 | + |
| 96 | + String thumbprint = DigestUtils.sha1Hex(cert.getEncoded()).toUpperCase(); |
| 97 | + |
| 98 | + CertificateRequest certificateRequestToRenew = new CertificateRequest() |
| 99 | + .subject(certificateRequest.subject()) |
| 100 | + .dnsNames(certificateRequest.dnsNames()) |
| 101 | + .ipAddresses(certificateRequest.ipAddresses()) |
| 102 | + .keyType(certificateRequest.keyType()) |
| 103 | + .keyLength(certificateRequest.keyLength()); |
| 104 | + client.generateRequest(zoneConfiguration, certificateRequestToRenew); |
| 105 | + |
| 106 | + String renewRequestId = client.renewCertificate( |
| 107 | + new RenewalRequest().request(certificateRequestToRenew).thumbprint(thumbprint)); |
| 108 | + |
| 109 | + assertThat(renewRequestId).isNotNull(); |
| 110 | + } |
| 111 | + |
| 112 | + @Test |
| 113 | + void revokeCertificate() throws VCertException, SocketException, UnknownHostException { |
| 114 | + VCertTknClient client = clientResource.client(); |
| 115 | + ZoneConfiguration zoneConfiguration = clientResource.zoneConfiguration(); |
| 116 | + |
| 117 | + CertificateRequest certificateRequest = client.generateRequest(zoneConfiguration, clientResource.certificateRequest()); |
| 118 | + String certificateId = client.requestCertificate(certificateRequest, zoneConfiguration); |
| 119 | + assertThat(certificateId).isNotNull(); |
| 120 | + |
| 121 | + // just wait for the certificate issuance |
| 122 | + client.retrieveCertificate(certificateRequest); |
| 123 | + |
| 124 | + RevocationRequest revocationRequest = new RevocationRequest(); |
| 125 | + revocationRequest.reason("key-compromise"); |
| 126 | + revocationRequest.certificateDN(certificateRequest.pickupId()); |
| 127 | + |
| 128 | + client.revokeCertificate(revocationRequest); |
| 129 | + } |
| 130 | + |
| 131 | + @Test |
| 132 | + @DisplayName("VCertTknClient - Create a cerfiticate that contais custom fields and validate if certifcate were created correctly") |
| 133 | + void createCertificateValidateValidityHours() throws UnknownHostException, VCertException { |
| 134 | + |
| 135 | + //Custom fields |
| 136 | + List<CustomField> customFields = new ArrayList<CustomField>(); |
| 137 | + customFields.add(new CustomField("custom", "java-test")); |
| 138 | + customFields.add(new CustomField("cfList", "item2")); |
| 139 | + customFields.add(new CustomField("cfListMulti", "tier1")); |
| 140 | + customFields.add(new CustomField("cfListMulti", "tier2")); |
| 141 | + |
| 142 | + VCertTknClient client = clientResource.client(); |
| 143 | + ZoneConfiguration zoneConfiguration = clientResource.zoneConfiguration(); |
| 144 | + CertificateRequest certificateRequest = clientResource.certificateRequest().customFields(customFields); |
| 145 | + |
| 146 | + certificateRequest = client.generateRequest(zoneConfiguration, clientResource.certificateRequest()); |
| 147 | + |
| 148 | + // Submit the certificate request |
| 149 | + client.requestCertificate(certificateRequest, zoneConfiguration); |
| 150 | + |
| 151 | + // Retrieve PEM collection from Venafi |
| 152 | + PEMCollection pemCollection = client.retrieveCertificate(certificateRequest); |
| 153 | + |
| 154 | + |
| 155 | + //At this moment certificate, must be created, it will fail if some custom fields aren't supported or specified on tpp |
| 156 | + //so is enough to validate if certificate is created. |
| 157 | + assertTrue(pemCollection.certificate() != null); |
| 158 | + |
| 159 | + } |
| 160 | + |
| 161 | + @Test |
| 162 | + void importCertificate() throws VCertException { |
| 163 | + final String cert = "-----BEGIN CERTIFICATE-----\n" |
| 164 | + + "MIIDdjCCAl6gAwIBAgIRAPqSZQ04IjWgO2rwIDRcOY8wDQYJKoZIhvcNAQENBQAw\n" |
| 165 | + + "gYAxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARVdGFoMRcwFQYDVQQHDA5TYWx0IExh\n" |
| 166 | + + "a2UgQ2l0eTEPMA0GA1UECgwGVmVuYWZpMRswGQYDVQQLDBJOT1QgRk9SIFBST0RV\n" |
| 167 | + + "Q1RJT04xGzAZBgNVBAMMElZDZXJ0IFRlc3QgTW9kZSBDQTAeFw0xODA5MTIxMzUw\n" |
| 168 | + + "MzNaFw0xODEyMTExMzUwMzNaMCQxIjAgBgNVBAMTGWltcG9ydC52ZW5hZmkuZXhh\n" |
| 169 | + + "bXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQChjQk0jSE5\n" |
| 170 | + + "ktVdH8bAM0QCpGs1rOOVMmRkMc7d4hQ6bTlFlIypMq9t+1O2Z8i4fiKDS7vSBmBo\n" |
| 171 | + + "WBgN9e0fbAnKEvBIcNLBS4lmwzRDxDCrNV3Dr5s+yJtUw9V2XBwiXbtW7qs5+c0O\n" |
| 172 | + + "y7a2S/5HudXUlAuXf7SF4MboMMpHRg+UkyA4j0peir8PtmlJjlYBt3lZdaeLlD6F\n" |
| 173 | + + "EIlIVQFZ6ulUF/kULhxhTUl2yNUUzJ/bqJlhFU6pkL+GoW1lnaZ8FYXwA1EKYyRk\n" |
| 174 | + + "DYL581eqvIBJY9tCNWbOdU1r+5wR4OOKe/WWWhcDC6nL/M8ZYhfQg1nHoD58A8Dk\n" |
| 175 | + + "H4AAt8A3EZpdAgMBAAGjRjBEMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB\n" |
| 176 | + + "/wQCMAAwHwYDVR0jBBgwFoAUzqRFDvLX0mz4AjPb45tLGavm8AcwDQYJKoZIhvcN\n" |
| 177 | + + "AQENBQADggEBABa4wqh+A63O5PHrdUCBSmQs9ve/oIXj561VBmqXkTHLrtKtbtcA\n" |
| 178 | + + "yvsMi8RD8BibBAsUCljkCmLoQD/XeQFtsPlMAxisSMYhChh58008CIYDR8Nf/qoe\n" |
| 179 | + + "YfzdMB/3VWCqTn9KGF8aMKeQvbFvuqmbtdCv//eYe6mNe2fa/x6PSdGMi4BPmjUC\n" |
| 180 | + + "PmBT4p1iwMtu8LnL4UM4awjmmExR4X4rafcyGEbf0D/CRfhDLSwxvrrVcWd6TMMY\n" |
| 181 | + + "HPZ/pw//+UrVLgEEsyM2zwf+LokbszPBvPAtHMJtr7Pnq2MQtEEkLfPqOWG3ol1H\n" |
| 182 | + + "t+4v2LIW1q4GkwOUjPqgyIaJC5jj5pH9/g8=\n" + "-----END CERTIFICATE-----"; |
| 183 | + |
| 184 | + final String pk = "-----BEGIN RSA PRIVATE KEY-----\n" |
| 185 | + + "MIIEpAIBAAKCAQEAoY0JNI0hOZLVXR/GwDNEAqRrNazjlTJkZDHO3eIUOm05RZSM\n" |
| 186 | + + "qTKvbftTtmfIuH4ig0u70gZgaFgYDfXtH2wJyhLwSHDSwUuJZsM0Q8QwqzVdw6+b\n" |
| 187 | + + "PsibVMPVdlwcIl27Vu6rOfnNDsu2tkv+R7nV1JQLl3+0heDG6DDKR0YPlJMgOI9K\n" |
| 188 | + + "Xoq/D7ZpSY5WAbd5WXWni5Q+hRCJSFUBWerpVBf5FC4cYU1JdsjVFMyf26iZYRVO\n" |
| 189 | + + "qZC/hqFtZZ2mfBWF8ANRCmMkZA2C+fNXqryASWPbQjVmznVNa/ucEeDjinv1lloX\n" |
| 190 | + + "Awupy/zPGWIX0INZx6A+fAPA5B+AALfANxGaXQIDAQABAoIBAE7of6WOhbsEcHkz\n" |
| 191 | + + "CzZYFBEiVEd8chEu8wBJn9ybD/xV21KUM3x1iGC1EPeYi98ppRvygwQcHzz4Qo+X\n" |
| 192 | + + "HsJpWAK+62TGzvqhNbTfBglPq+IEiA8MGE07WTu3B+3vIcLbe6UDoNkJndJrSIyU\n" |
| 193 | + + "Y9iO+dYClgLi2r9FwoIpSrQzkWqlB3edle4Nq1WABtWTOSDYysz1gk0KrLmQQfXP\n" |
| 194 | + + "CPiwkL0SjB+sfbOiVX0B2liV2oxJ5VZWNo/250wFcvrcYrgTNtEVNMXtpN0tnRMH\n" |
| 195 | + + "NPwnY+B9WGu/NVhtvOcOTPHq9xQhbmBCS1axikizCaIqEOyegdeDJ4ASJnVybfCA\n" |
| 196 | + + "KzjoCpUCgYEAwOmeEvzSP8hCKtLPU8QDBA1y+mEvZMwBY4qr3hfqv3qa0QmFvxkk\n" |
| 197 | + + "7Ubmy2oFOoUnVgnhRzAf/bajbkz4ScUgd2JrUdIEhNNVwDn/llnS/UHBlZY++BtW\n" |
| 198 | + + "mvyon9ObXgPNPoHcJqzrqARu8PPJQEsZ+xjxM/gyif3prn6Uct6R8B8CgYEA1mHd\n" |
| 199 | + + "Astwht39z16FoX9rQRGgx64Z0nesfTjl+4mkypz6ukkcfU1GjobqEG3k666+OJk1\n" |
| 200 | + + "SRs8s20Pahrh21LO5x/QtvChhZ+nIedqlhBlNH9uUJI9ChbUN0luetiSPT8F5aqg\n" |
| 201 | + + "gZMY13K5icAQ+98EcNwl7ZhVPq0BvLlbqTWi9gMCgYEAjtVqoQxob6lKtIJZ19+t\n" |
| 202 | + + "i/aZRyFmAe+6p4UpM8vpl9SjhFrUmGV5neV9ROc+79FfCqlOD3NmfGgaIbUDsTsv\n" |
| 203 | + + "irVoWLBzgBUpzKYkw6HGQpXJS4RvIyy6tw6Tm6MFylpuQPXNlyU5ZrHBos4eGGiC\n" |
| 204 | + + "2BPjo2MFqH5D41r9dv+sdmkCgYEAtSJYx3y2pe04/xYhGFP9fivzyeMrRC4DWoZR\n" |
| 205 | + + "oxcoWl0KZ41QefppzBDoAVuo2Q17AX1JjWxq/DsAlCkEffhYguXZxkhIYQuE/lt2\n" |
| 206 | + + "LjbKG/IzdfYphrXFNrVfmIIWBZOTWvqwxOpRSfBQHbhfYUCMkwMfNMHJ/LvWxOtk\n" |
| 207 | + + "K/L6rpsCgYB6p9RU2kXexAh9kUpbGqVeJBoIh6ArXHgepESE/7dPw26D0DM0mef0\n" |
| 208 | + + "X1MasxN3JF7ZsSGfcCLXnICSJHuNTy9WztqF3hUbQwYd9vmZxtzAo5/fK4DVAaXS\n" |
| 209 | + + "ZtIVl/CH/az0xqLKWIlmWOip9SfUVlZdgege+PlQtRqoFVOsH8+MEg==\n" |
| 210 | + + "-----END RSA PRIVATE KEY-----"; |
| 211 | + |
| 212 | + ImportRequest importRequest = new ImportRequest(); |
| 213 | + importRequest.certificateData(cert); |
| 214 | + importRequest.privateKeyData(pk); |
| 215 | + importRequest.policyDN(clientResource.zoneConfiguration().zoneId()); |
| 216 | + |
| 217 | + |
| 218 | + ImportResponse response = clientResource.client().importCertificate(importRequest); |
| 219 | + assertThat(response).isNotNull(); |
| 220 | + assertThat(response.certificateDN()).isNotNull(); |
| 221 | + assertThat(response.certificateVaultId()).isGreaterThan(0); |
| 222 | + assertThat(response.privateKeyVaultId()).isGreaterThan(0); |
| 223 | + } |
| 224 | + |
| 225 | + @Test |
| 226 | + void privateKeyPKCSTest() throws VCertException, UnknownHostException, IOException { |
| 227 | + VCertTknClient client = clientResource.client(); |
| 228 | + ZoneConfiguration zoneConfiguration = clientResource.zoneConfiguration(); |
| 229 | + |
| 230 | + //By default the DataFormat of the CertificateRequest is PKCS8 |
| 231 | + CertificateRequest certificateRequest = clientResource.certificateRequest() |
| 232 | + .csrOrigin(CsrOriginOption.ServiceGeneratedCSR) |
| 233 | + .keyPassword(TestUtils.KEY_PASSWORD); |
| 234 | + |
| 235 | + certificateRequest = client.generateRequest(zoneConfiguration, certificateRequest); |
| 236 | + String pickupId = client.requestCertificate(certificateRequest, zoneConfiguration); |
| 237 | + assertThat(pickupId).isNotNull(); |
| 238 | + |
| 239 | + //Retrieving the PemCollection |
| 240 | + PEMCollection pemCollectionRSAPrivateKeyPKCS8 = client.retrieveCertificate(certificateRequest); |
| 241 | + |
| 242 | + //getting the PrivateKey as PEM which should be a RSA Private Key in PKCS8 Encrypted |
| 243 | + String privateKeyPKCS8AsEncryptedPem = pemCollectionRSAPrivateKeyPKCS8.pemPrivateKey(); |
| 244 | + |
| 245 | + PemObject privateKeyPKCS8AsPemObject = new PemReader(new StringReader(privateKeyPKCS8AsEncryptedPem)).readPemObject(); |
| 246 | + |
| 247 | + //evaluating that the private Key is in PKCS8 Encrypted |
| 248 | + assertThat(pemCollectionRSAPrivateKeyPKCS8.privateKey()).isNotNull(); |
| 249 | + assertTrue(privateKeyPKCS8AsPemObject.getType().equals(TestUtils.PEM_HEADER_PKCS8_ENCRYPTED)); |
| 250 | + |
| 251 | + //changing to data format Legacy in order to get the PrivateKey in PKCS1 |
| 252 | + certificateRequest.dataFormat(DataFormat.LEGACY); |
| 253 | + |
| 254 | + //Retrieving the PemCollection |
| 255 | + PEMCollection pemCollectionRSAPrivateKey = client.retrieveCertificate(certificateRequest); |
| 256 | + |
| 257 | + //getting the PrivateKey as PEM which should be a RSA Private Key Encrypted |
| 258 | + String privateKeyRSAAsEncryptedPem = pemCollectionRSAPrivateKey.pemPrivateKey(); |
| 259 | + |
| 260 | + PemObject privateKeyRSAAsPemObject = new PemReader(new StringReader(privateKeyRSAAsEncryptedPem)).readPemObject(); |
| 261 | + |
| 262 | + //evaluating that the private Key is in PKCS1 Encrypted |
| 263 | + assertThat(pemCollectionRSAPrivateKey.privateKey()).isNotNull(); |
| 264 | + assertTrue(privateKeyRSAAsPemObject.getHeaders().stream().anyMatch(header -> TestUtils.PEM_RSA_PRIVATE_KEY_ENCRYPTED_HEADER_VALUE.equals(((PemHeader)header).getValue()))); |
| 265 | + } |
| 266 | + |
| 267 | +} |
0 commit comments