This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new e42f28d [CAMEL-11257] Fixed multipart parsing logic and updated tests (#2310) e42f28d is described below commit e42f28d08574e163c83fa3802d80f87700c93bda Author: William Collins <wcoll...@redhat.com> AuthorDate: Wed May 2 09:34:30 2018 -0400 [CAMEL-11257] Fixed multipart parsing logic and updated tests (#2310) --- .../component/as2/api/entity/EntityParser.java | 12 +- .../camel/component/as2/api/entity/MimeEntity.java | 25 ++- .../as2/api/entity/MultipartSignedEntity.java | 12 +- .../camel/component/as2/api/AS2MessageTest.java | 21 +- .../as2/AS2ClientManagerIntegrationTest.java | 221 ++++++++++++++++++++- 5 files changed, 261 insertions(+), 30 deletions(-) diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java index 28d0715..8b884f1 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java @@ -446,7 +446,14 @@ public final class EntityParser { applicationPkcs7SignatureEntity.setHeaders(headers); multipartSignedEntity.addPart(applicationPkcs7SignatureEntity); + // + // End Signature Body Part + + ContentType contentType = ContentType.create(AS2MimeType.MULTIPART_SIGNED, charset); + multipartSignedEntity.setContentType(contentType); + multipartSignedEntity.setContentTransferEncoding(contentTransferEncoding); return multipartSignedEntity; + } catch (Exception e) { ParseException parseException = new ParseException("failed to parse text entity"); parseException.initCause(e); @@ -560,7 +567,10 @@ public final class EntityParser { // // End Disposition Notification Body Part - + + ContentType contentType = ContentType.create(AS2MimeType.MULTIPART_REPORT, charset); + dispositionNotificationMultipartReportEntity.setContentType(contentType); + dispositionNotificationMultipartReportEntity.setContentTransferEncoding(contentTransferEncoding); return dispositionNotificationMultipartReportEntity; } catch (Exception e) { ParseException parseException = new ParseException("failed to parse text entity"); diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java index 157d8cd..6ae0687 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MimeEntity.java @@ -32,6 +32,7 @@ import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.ContentType; import org.apache.http.message.BasicHeader; import org.apache.http.message.HeaderGroup; +import org.apache.http.protocol.HTTP; import org.apache.http.util.Args; public abstract class MimeEntity extends AbstractHttpEntity { @@ -92,7 +93,11 @@ public abstract class MimeEntity extends AbstractHttpEntity { @Override public void setContentType(Header contentType) { super.setContentType(contentType); - addHeader(contentType); + if (contentType != null) { + addHeader(contentType); + } else { + removeHeaders(AS2Header.CONTENT_TYPE); + } } public String getContentEncodingValue() { @@ -106,7 +111,11 @@ public abstract class MimeEntity extends AbstractHttpEntity { @Override public void setContentEncoding(Header contentEncoding) { super.setContentEncoding(contentEncoding); - addHeader(contentEncoding); + if (contentEncoding != null) { + addHeader(contentEncoding); + } else { + removeHeaders(HTTP.CONTENT_ENCODING); + } } public String getContentTransferEncodingValue() { @@ -133,12 +142,16 @@ public abstract class MimeEntity extends AbstractHttpEntity { * The default implementation sets the value of the * {@link #contentTranferEncoding contentTransferEncoding} attribute. * - * @param contentEncoding the new Content-Transfer-Encoding header, or + * @param contentTransferEncoding the new Content-Transfer-Encoding header, or * {@code null} to unset */ - public void setContentTranserEncoding(final Header contentEncoding) { - this.contentTransferEncoding = contentEncoding; - addHeader(contentTransferEncoding); + public void setContentTranserEncoding(final Header contentTransferEncoding) { + this.contentTransferEncoding = contentTransferEncoding; + if (contentTransferEncoding != null) { + addHeader(contentTransferEncoding); + } else { + removeHeaders(AS2Header.CONTENT_TRANSFER_ENCODING); + } } /** diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MultipartSignedEntity.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MultipartSignedEntity.java index af8e098..4d7c856 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MultipartSignedEntity.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/MultipartSignedEntity.java @@ -53,16 +53,16 @@ public class MultipartSignedEntity extends MultipartMimeEntity { } public boolean isValid() { - ApplicationEDIEntity applicationEDIEntity = getSignedDataEntity(); + MimeEntity signedEntity = getSignedDataEntity(); ApplicationPkcs7SignatureEntity applicationPkcs7SignatureEntity = getSignatureEntity(); - if (applicationEDIEntity == null || applicationPkcs7SignatureEntity == null) { + if (signedEntity == null || applicationPkcs7SignatureEntity == null) { return false; } try { ByteArrayOutputStream outstream = new ByteArrayOutputStream(); - applicationEDIEntity.writeTo(outstream); + signedEntity.writeTo(outstream); CMSProcessable signedContent = new CMSProcessableByteArray(outstream.toByteArray()); byte[] signature = applicationPkcs7SignatureEntity.getSignature(); @@ -90,9 +90,9 @@ public class MultipartSignedEntity extends MultipartMimeEntity { return true; } - public ApplicationEDIEntity getSignedDataEntity() { - if (getPartCount() > 0 && getPart(0) instanceof ApplicationEDIEntity) { - return (ApplicationEDIEntity) getPart(0); + public MimeEntity getSignedDataEntity() { + if (getPartCount() > 0) { + return getPart(0); } return null; diff --git a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java index 34307db..19eb0ef 100644 --- a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java +++ b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java @@ -16,6 +16,11 @@ */ package org.apache.camel.component.as2.api; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import java.io.IOException; import java.security.KeyPair; import java.security.KeyPairGenerator; @@ -29,6 +34,7 @@ import java.util.List; import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity; import org.apache.camel.component.as2.api.entity.ApplicationEDIFACTEntity; import org.apache.camel.component.as2.api.entity.ApplicationPkcs7SignatureEntity; +import org.apache.camel.component.as2.api.entity.MimeEntity; import org.apache.camel.component.as2.api.entity.MultipartSignedEntity; import org.apache.http.HttpEntity; import org.apache.http.HttpException; @@ -58,11 +64,6 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - public class AS2MessageTest { public static final String EDI_MESSAGE = "UNB+UNOA:1+005435656:1+006415160:1+060515:1434+00000000000778'\n" @@ -340,14 +341,16 @@ public class AS2MessageTest { HttpEntity entity = ((BasicHttpEntityEnclosingRequest)request).getEntity(); assertNotNull("Request does not contain entity", entity); assertTrue("Unexpected request entity type", entity instanceof MultipartSignedEntity); - MultipartSignedEntity signedEntity = (MultipartSignedEntity)entity; - ApplicationEDIEntity ediMessageEntity = signedEntity.getSignedDataEntity(); + MultipartSignedEntity multipartSignedEntity = (MultipartSignedEntity)entity; + MimeEntity signedEntity = multipartSignedEntity.getSignedDataEntity(); + assertTrue("Signed entity wrong type", signedEntity instanceof ApplicationEDIEntity); + ApplicationEDIEntity ediMessageEntity = (ApplicationEDIEntity) signedEntity; assertNotNull("Multipart signed entity does not contain EDI message entity", ediMessageEntity); - ApplicationPkcs7SignatureEntity signatureEntity = signedEntity.getSignatureEntity(); + ApplicationPkcs7SignatureEntity signatureEntity = multipartSignedEntity.getSignatureEntity(); assertNotNull("Multipart signed entity does not contain signature entity", signatureEntity); // Validate Signature - assertTrue("Signature is invalid", signedEntity.isValid()); + assertTrue("Signature is invalid", multipartSignedEntity.isValid()); } diff --git a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java index a685145..e4074bc 100644 --- a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java +++ b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ClientManagerIntegrationTest.java @@ -17,7 +17,15 @@ package org.apache.camel.component.as2; import java.io.IOException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.SecureRandom; +import java.security.Security; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.camel.builder.RouteBuilder; @@ -29,9 +37,12 @@ import org.apache.camel.component.as2.api.AS2MessageStructure; import org.apache.camel.component.as2.api.AS2MimeType; import org.apache.camel.component.as2.api.AS2ServerConnection; import org.apache.camel.component.as2.api.AS2ServerManager; +import org.apache.camel.component.as2.api.AS2SignedDataGenerator; import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity; +import org.apache.camel.component.as2.api.entity.ApplicationPkcs7SignatureEntity; import org.apache.camel.component.as2.api.entity.DispositionNotificationMultipartReportEntity; import org.apache.camel.component.as2.api.entity.MimeEntity; +import org.apache.camel.component.as2.api.entity.MultipartSignedEntity; import org.apache.camel.component.as2.api.util.HttpMessageUtils; import org.apache.camel.component.as2.internal.AS2ApiCollection; import org.apache.camel.component.as2.internal.AS2ClientManagerApiMethod; @@ -43,7 +54,19 @@ import org.apache.http.HttpResponse; import org.apache.http.entity.ContentType; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpRequestHandler; +import org.bouncycastle.asn1.ASN1EncodableVector; +import org.bouncycastle.asn1.cms.AttributeTable; +import org.bouncycastle.asn1.cms.IssuerAndSerialNumber; +import org.bouncycastle.asn1.smime.SMIMECapabilitiesAttribute; +import org.bouncycastle.asn1.smime.SMIMECapability; +import org.bouncycastle.asn1.smime.SMIMECapabilityVector; +import org.bouncycastle.asn1.smime.SMIMEEncryptionKeyPreferenceAttribute; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.cert.jcajce.JcaCertStore; +import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoGeneratorBuilder; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; @@ -95,15 +118,65 @@ public class AS2ClientManagerIntegrationTest extends AbstractAS2TestSupport { private static final String EXPECTED_AS2_VERSION = "1.1"; private static final String EXPECTED_MDN_SUBJECT = MDN_SUBJECT_PREFIX + SUBJECT; - + private static final String[] SIGNED_RECEIPT_MIC_ALGORITHMS = new String[] {"sha1", "md5"}; + private static AS2ServerConnection serverConnection; + private static KeyPair serverSigningKP; + private static List<X509Certificate> serverCertList; + + private KeyPair issueKP; + private X509Certificate issueCert; + + private KeyPair signingKP; + private X509Certificate signingCert; + private List<X509Certificate> certList; + private AS2SignedDataGenerator gen; + + @Before + public void setUp() throws Exception { + super.setUp(); + Security.addProvider(new BouncyCastleProvider()); + + setupKeysAndCertificates(); + + // Create and populate certificate store. + JcaCertStore certs = new JcaCertStore(certList); + + // Create capabilities vector + SMIMECapabilityVector capabilities = new SMIMECapabilityVector(); + capabilities.addCapability(SMIMECapability.dES_EDE3_CBC); + capabilities.addCapability(SMIMECapability.rC2_CBC, 128); + capabilities.addCapability(SMIMECapability.dES_CBC); + + // Create signing attributes + ASN1EncodableVector attributes = new ASN1EncodableVector(); + attributes.add(new SMIMEEncryptionKeyPreferenceAttribute(new IssuerAndSerialNumber(new X500Name(signingCert.getIssuerDN().getName()), signingCert.getSerialNumber()))); + attributes.add(new SMIMECapabilitiesAttribute(capabilities)); + + for (String signingAlgorithmName : AS2SignedDataGenerator + .getSupportedSignatureAlgorithmNamesForKey(signingKP.getPrivate())) { + try { + this.gen = new AS2SignedDataGenerator(); + this.gen.addSignerInfoGenerator(new JcaSimpleSignerInfoGeneratorBuilder().setProvider("BC") + .setSignedAttributeGenerator(new AttributeTable(attributes)) + .build(signingAlgorithmName, signingKP.getPrivate(), signingCert)); + this.gen.addCertificates(certs); + break; + } catch (Exception e) { + this.gen = null; + continue; + } + } + + if (this.gen == null) { + throw new Exception("failed to create signing generator"); + } + } @Test public void plainMessageSendTest() throws Exception { final Map<String, Object> headers = new HashMap<String, Object>(); // parameter type is String - headers.put("CamelAS2.ediMessage", EDI_MESSAGE); - // parameter type is String headers.put("CamelAS2.requestUri", REQUEST_URI); // parameter type is String headers.put("CamelAS2.subject", SUBJECT); @@ -119,8 +192,6 @@ public class AS2ClientManagerIntegrationTest extends AbstractAS2TestSupport { headers.put("CamelAS2.ediMessageContentType", ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII)); // parameter type is String headers.put("CamelAS2.ediMessageTransferEncoding", null); - // parameter type is String - headers.put("CamelAS2.signingAlgorithmName", null); // parameter type is java.security.cert.Certificate[] headers.put("CamelAS2.signingCertificateChain", null); // parameter type is java.security.PrivateKey @@ -130,7 +201,7 @@ public class AS2ClientManagerIntegrationTest extends AbstractAS2TestSupport { // parameter type is String[] headers.put("CamelAS2.signedReceiptMicAlgorithms", null); - final org.apache.http.protocol.HttpCoreContext result = requestBodyAndHeaders("direct://SEND", null, headers); + final org.apache.http.protocol.HttpCoreContext result = requestBodyAndHeaders("direct://SEND", EDI_MESSAGE, headers); assertNotNull("send result", result); LOG.debug("send: " + result); @@ -167,8 +238,85 @@ public class AS2ClientManagerIntegrationTest extends AbstractAS2TestSupport { secondPart.getContentTypeValue()); } + @Test + public void multipartSignedMessageTest() throws Exception { + final Map<String, Object> headers = new HashMap<String, Object>(); + // parameter type is String + headers.put("CamelAS2.requestUri", REQUEST_URI); + // parameter type is String + headers.put("CamelAS2.subject", SUBJECT); + // parameter type is String + headers.put("CamelAS2.from", FROM); + // parameter type is String + headers.put("CamelAS2.as2From", AS2_NAME); + // parameter type is String + headers.put("CamelAS2.as2To", AS2_NAME); + // parameter type is org.apache.camel.component.as2.api.AS2MessageStructure + headers.put("CamelAS2.as2MessageStructure", AS2MessageStructure.SIGNED); + // parameter type is org.apache.http.entity.ContentType + headers.put("CamelAS2.ediMessageContentType", ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII)); + // parameter type is String + headers.put("CamelAS2.ediMessageTransferEncoding", null); + // parameter type is java.security.cert.Certificate[] + headers.put("CamelAS2.signingCertificateChain", certList.toArray(new Certificate[0])); + // parameter type is java.security.PrivateKey + headers.put("CamelAS2.signingPrivateKey", signingKP.getPrivate()); + // parameter type is String + headers.put("CamelAS2.dispositionNotificationTo", "mr...@example.com"); + // parameter type is String[] + headers.put("CamelAS2.signedReceiptMicAlgorithms", SIGNED_RECEIPT_MIC_ALGORITHMS); + + final org.apache.http.protocol.HttpCoreContext result = requestBodyAndHeaders("direct://SEND", EDI_MESSAGE, headers); + + assertNotNull("send result", result); + LOG.debug("send: " + result); + HttpRequest request = result.getRequest(); + assertNotNull("Request", request); + assertTrue("Request does not contain body", request instanceof HttpEntityEnclosingRequest); + HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity(); + assertNotNull("Request body", entity); + assertTrue("Request body does not contain EDI entity", entity instanceof MultipartSignedEntity); + + MimeEntity signedEntity = ((MultipartSignedEntity)entity).getSignedDataEntity(); + assertTrue("Signed entity wrong type", signedEntity instanceof ApplicationEDIEntity); + ApplicationEDIEntity ediMessageEntity = (ApplicationEDIEntity) signedEntity; + String ediMessage = ediMessageEntity.getEdiMessage(); + assertEquals("EDI message is different", EDI_MESSAGE, ediMessage); + + HttpResponse response = result.getResponse(); + assertNotNull("Response", response); + String contentTypeHeaderValue = HttpMessageUtils.getHeaderValue(response, AS2Header.CONTENT_TYPE); + ContentType responseContentType = ContentType.parse(contentTypeHeaderValue); + assertEquals("Unexpected response type", AS2MimeType.MULTIPART_SIGNED, responseContentType.getMimeType()); + assertEquals("Unexpected mime version", AS2Constants.MIME_VERSION, HttpMessageUtils.getHeaderValue(response, AS2Header.MIME_VERSION)); + assertEquals("Unexpected AS2 version", EXPECTED_AS2_VERSION, HttpMessageUtils.getHeaderValue(response, AS2Header.AS2_VERSION)); + assertEquals("Unexpected MDN subject", EXPECTED_MDN_SUBJECT, HttpMessageUtils.getHeaderValue(response, AS2Header.SUBJECT)); + assertEquals("Unexpected MDN from", MDN_FROM, HttpMessageUtils.getHeaderValue(response, AS2Header.FROM)); + assertEquals("Unexpected AS2 from", AS2_NAME, HttpMessageUtils.getHeaderValue(response, AS2Header.AS2_FROM)); + assertEquals("Unexpected AS2 to", AS2_NAME, HttpMessageUtils.getHeaderValue(response, AS2Header.AS2_TO)); + assertNotNull("Missing message id", HttpMessageUtils.getHeaderValue(response, AS2Header.MESSAGE_ID)); + + HttpEntity responseEntity = response.getEntity(); + assertNotNull("Response entity", responseEntity); + assertTrue("Unexpected response entity type", responseEntity instanceof MultipartSignedEntity); + MultipartSignedEntity responseSignedEntity = (MultipartSignedEntity) responseEntity; + MimeEntity responseSignedDataEntity = responseSignedEntity.getSignedDataEntity(); + assertTrue("Signed entity wrong type", responseSignedDataEntity instanceof DispositionNotificationMultipartReportEntity); + DispositionNotificationMultipartReportEntity reportEntity = (DispositionNotificationMultipartReportEntity)responseSignedDataEntity; + assertEquals("Unexpected number of body parts in report", 2, reportEntity.getPartCount()); + MimeEntity firstPart = reportEntity.getPart(0); + assertEquals("Unexpected content type in first body part of report", ContentType.create(AS2MimeType.TEXT_PLAIN, AS2Charset.US_ASCII).toString(), firstPart.getContentTypeValue()); + MimeEntity secondPart = reportEntity.getPart(1); + assertEquals("Unexpected content type in second body part of report", + ContentType.create(AS2MimeType.MESSAGE_DISPOSITION_NOTIFICATION, AS2Charset.US_ASCII).toString(), + secondPart.getContentTypeValue()); + ApplicationPkcs7SignatureEntity signatureEntity = responseSignedEntity.getSignatureEntity(); + assertNotNull("Signature Entity", signatureEntity); + } + @BeforeClass public static void setupTest() throws Exception { + setupServerKeysAndCertificates(); receiveTestMessages(); } @@ -196,15 +344,72 @@ public class AS2ClientManagerIntegrationTest extends AbstractAS2TestSupport { return new RouteBuilder() { public void configure() { // test route for send - from("direct://SEND").to("as2://" + PATH_PREFIX + "/send"); + from("direct://SEND").to("as2://" + PATH_PREFIX + "/send?inBody=ediMessage"); } }; } + + private static void setupServerKeysAndCertificates() throws Exception { + Security.addProvider(new BouncyCastleProvider()); + + // + // set up our certificates + // + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC"); + + kpg.initialize(1024, new SecureRandom()); + + String issueDN = "O=Punkhorn Software, C=US"; + KeyPair issueKP = kpg.generateKeyPair(); + X509Certificate issueCert = Utils.makeCertificate( + issueKP, issueDN, issueKP, issueDN); + + // + // certificate we sign against + // + String signingDN = "CN=William J. Collins, E=punkhor...@gmail.com, O=Punkhorn Software, C=US"; + serverSigningKP = kpg.generateKeyPair(); + X509Certificate signingCert = Utils.makeCertificate( + serverSigningKP, signingDN, issueKP, issueDN); + + serverCertList = new ArrayList<X509Certificate>(); + + serverCertList.add(signingCert); + serverCertList.add(issueCert); + } private static void receiveTestMessages() throws IOException { serverConnection = new AS2ServerConnection("1.1", "AS2ClientManagerIntegrationTest Server", - "server.example.com", 8888, null, null); + "server.example.com", 8888, serverCertList.toArray(new Certificate[0]), serverSigningKP.getPrivate()); serverConnection.listen("/", new RequestHandler()); } + + private void setupKeysAndCertificates() throws Exception { + // + // set up our certificates + // + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC"); + + kpg.initialize(1024, new SecureRandom()); + + String issueDN = "O=Punkhorn Software, C=US"; + issueKP = kpg.generateKeyPair(); + issueCert = Utils.makeCertificate( + issueKP, issueDN, issueKP, issueDN); + + // + // certificate we sign against + // + String signingDN = "CN=William J. Collins, E=punkhor...@gmail.com, O=Punkhorn Software, C=US"; + signingKP = kpg.generateKeyPair(); + signingCert = Utils.makeCertificate( + signingKP, signingDN, issueKP, issueDN); + + certList = new ArrayList<X509Certificate>(); + + certList.add(signingCert); + certList.add(issueCert); + + } } -- To stop receiving notification emails like this one, please contact davscl...@apache.org.