phax / as2-lib Goto Github PK
View Code? Open in Web Editor NEWA generic Java AS2 library, servlet and server
A generic Java AS2 library, servlet and server
Hi Philip,
I would like to know what the correct value for mdnoptions when mdn needs to be signed and not signed.
In my code when mdn not signed I set the protocol algorithm to null and set protocol imprtance and mic algorithm importance to optional while in signed mdn I set all importance to required and set the protocol algorithm.
Is it the correct behaviour?
Thanks,
Itay
On some Unix derivates in certain cases VerySecureRandom (based on SecureRandom) takes forever to initialize.
https://www.cigital.com/blog/issues-when-using-java-securerandom/ claims that it "there is not enough entropy in the system" it blocks.
As SecureRandom cannot be totally avoided (e.g. https SSLContext), it should at least be configurable that it should only be used when necessary.
This is similar to #16; the scenario is repeated failure to send a message.
The final exception isn't too interesting; but anyway:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.helger.as2lib.processor.ProcessorException._getMessage(ProcessorException.java:63)
at com.helger.as2lib.processor.ProcessorException.<init>(ProcessorException.java:74)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:151)
at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:148)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:731)
The problem seems to be the recursive chain of calls: AS2SenderModule -> DefaultMessageProcessor -> ResenderModule -> DefaultMessageProcessor -> AS2SenderModule -> ...
.
Each time the exception is caught in AS2SenderModule, wrapped, stashed and rethrown if the next attempt (doResend
) fails again; then caught again in DefaultMessageProcessor
and rethrown as a ProcessorException.
This is the length of getStackAsString()
in ProcessorException::_getMessage
:
trace length: 11065
trace length: 20294
trace length: 40436
trace length: 80638
trace length: 161126
trace length: 322018
trace length: 643886
trace length: 1287538
trace length: 2574926
trace length: 5149618
trace length: 10299086
trace length: 20597938
trace length: 41195726
trace length: 82391218
trace length: 164782286
I don't see a "good" way to avoid the geometric increase; for our usage the following works, but aborting early might not be correct in the general case.
--- a/as2-lib/src/main/java/com/helger/as2lib/processor/DefaultMessageProcessor.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/processor/DefaultMessageProcessor.java
@@ -141,6 +141,9 @@ public class DefaultMessageProcessor extends AbstractMessageProcessor
bModuleFound = true;
aModule.handle (sAction, aMsg, aOptions);
}
+ catch (final ProcessorException ex) {
+ throw ex;
+ }
catch (final OpenAS2Exception ex)
{
aCauses.add (ex);
As pointed out by issue #12 binary is the default CTE. Make sure to use it consistently through out the code
Hi,
Implementing AS2, we want to validate a partnership's data before the first actual send. Can the library help with such a test?
Thank you for your help,
Ziv
I have currently implemented the AS2 Servlet in a test suite where we are performing regression testing of our integration platform. I'm wondering which parameters are existing for generating a better dynamic filename? I'm specifically interested in the AS2 Filename and AS2 Subject. Example from the readme below. Is there a list of "variables" that can be used in the "as2-servlet-configuration.xml" file?
<module classname="com.helger.as2lib.processor.storage.MessageFileModule" filename="%home%/inbox/$date.yyyy$/$date.MM$/$msg.sender.as2_id$-$msg.receiver.as2_id$-$msg.headers.message-id$" header="%home%/inbox/msgheaders/$date.yyyy$/$date.MM$/$msg.sender.as2_id$-$msg.receiver.as2_id$-$msg.headers.message-id$" protocol="as2" tempdir="%home%/temp"/>
Hi Philip, We will need to use the FIPS version of BC package. For this, we need to give a different provider name. I thought to add to ph-bc a static function to allow the user to change the provider to FIPS, and add a function to get the provider name, as it is needed in BCCryptoHelper.java:403.
What do you think?
Thanks, Ziv
Hello Philip,
first of, great work on this project!
I hope you can help me with a problem I encountered.
I have been testing your library against another AS2 product called RSSBUS. This product comes default with 4 test files of which 1 causes a "org.bouncycastle.cms.CMSSignerDigestMismatchException: message-digest attribute value does not match calculated value" authentication error every time. The other 3 default test files are processed fine.
I reproduced the issue in your latest standalone server version (2.2.3-SNAPSHOT) and used the default (certs.p12) certificates for the test. It seems that any uploaded test file that has linefeeds without carriage returns causes this exception.
I am running as2-server in an IDE on Windows.
Any help would be appreciated.
Kind regards,
Martijn
I'm currently investigating if our home build AS2 software (written in C, not well maintained but which used to be Drummond Certified) can be replaced by some other piece of java based software. AS2-lib being one of the options (running/changing OpenAS2 into running on a servlet container instead of monolithic being the other)
I tried to setup a partnership with our existing AS2 environment to see if at least that would work. Exchanging messages without MDN's works, with non-signed MDN's too, but when sending signed MDN's from AS2-lib to our server, I got "Integrity check failed" errors, after due investigation, I came to the conclusion that there is a very close relation to #13.
The signed MDN contains a Content-Transfer-Encoding of "7bit" which is a difference with the MDN's I got from our production environment, where in most cases the CTE is just absent.
------=_Part_2_1271687676.1532374720099
Content-Type: multipart/report; report-type=disposition-notification;
boundary="----=_Part_0_900626805.1532374720037"
------=_Part_0_900626805.1532374720037
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
The message sent to Recipient KukelsAS2ID on Mon, 23 Jul 2018 19:38:35 GMT with Subject Goodmorning New AS2 has been received, the EDI Interchange was successfully decrypted and it's integrity was verified. In addition, the sender of the message, Sender ealxs00149 at Location 10.19.26.51 was authenticated as the originator of the message. An error occurred while storing the data to the file system.
Processor 'DefaultMessageProcessor' threw exception:
com.helger.peppol.sbdh.read.PeppolSBDHDocumentReadException: [invalid-sender-authority] The "Sender/Identifier/Authority" attribute has an invalid value: EAN.UCC
...
[34 elements omitted -- com.helger.as2lib.processor.AbstractMessageProcessor.executeAction(AbstractMessageProcessor.java:160)]
------=_Part_0_900626805.1532374720037
Content-Type: message/disposition-notification
Content-Transfer-Encoding: 7bit
Reporting-UA: ph-OpenAS2 [email protected]:8080
Original-Recipient: rfc822; KukelsAS2ID
Final-Recipient: rfc822; KukelsAS2ID
Original-Message-ID: <[email protected]>
Disposition: automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error
Received-Content-MIC: 3o35W1rw8RtitY+FH1uLVC2alh8=, sha1
------=_Part_0_900626805.1532374720037--
------=_Part_2_1271687676.1532374720099
Content-Type: application/pkcs7-signature; name=smime.p7s; smime-type=signed-data
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature
MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIAwggOsMIIC
...
Py7xs78B6moSz0E/UvASr7mc9QAAAAAAAA==
------=_Part_2_1271687676.1532374720099--
Since the specs only menion a CTE being absent or set to 8bit or binary, I tried finding where the 7bit was set. The bodyparts are created and added to the parent MimePart in
Both do not have a Content-Transfer-Encoding set at that time, but in the resulting signed bodypart, they do, with a value of "7bit". Debugging where this came from I found that java-mail is adding the CTE based on the actual content
In javax.mail.internet.MimeBodyPart
the DataHandler is passed on and used to retrieve the enconding from it.
if (part.getHeader("Content-Transfer-Encoding") == null)
setEncoding(part, MimeUtility.getEncoding(dh));
And in MimeUtility.getEncoding(...)
/*
* Try to pick the most efficient means of determining the
* encoding. If this DataHandler was created using a DataSource,
* the getEncoding(DataSource) method is typically faster. If
* the DataHandler was created with an object, this method is
* much faster. To distinguish the two cases, we use a heuristic.
* A DataHandler created with an object will always have a null name.
* A DataHandler created with a DataSource will usually have a
* non-null name.
*
* XXX - This is actually quite a disgusting hack, but it makes
* a common case run over twice as fast.
*/
if (dh.getName() != null)
return getEncoding(dh.getDataSource());
I expected the DispositionDataContentHandler
to be used here but it is not a DataHandler (the default java mail DataHandler is used) and then "7bit" is set due to the content all being ASCII characters.
The only way I got things quickly working is by explicitly setting
aTextPart.setHeader(CHttpHeader.CONTENT_TRANSFER_ENCODING, "binary");
and
aReportPart.setHeader(CHttpHeader.CONTENT_TRANSFER_ENCODING, "binary");
in AS2Helper.java
Yes, using the 'AS2 default' would be better and maybe even retrieve it from the partnership if declared there, but I want to be sure it is something that needs to be 'fixed' on hte AS2-Lib side or that it is a bug in our software that was never noticed since everybody participating in the expesive (both in cost and time) Drummond certifications did not send MDN in this format.
The links to www.peppol.eu are broken, they probably need the http://
prefix.
Hi Philip,
I saw in code whem using async mdn we store the mic in mdmpendinginfo folder and in the file we set the mic and mdmpending file.
My question what are you doing with this file beacuse the file isnt created and you are trying to delete him when mic is matched.
Another issuewhen you delete mdmpendinginfo file you print to log the directory from mdmpending and not from mdmpendinginfo.
Thanks,
Itay
Hi Philip,
It seems that the issue with large files comes from HttpUrlConnection. The OutputStream that is obtained from it stores all data in memory and only at the end writes it to the socket. I would like to add the possibility to work with Apache HttpClient that supports streaming without holding all data in memory.
What do you think?
Thanks,
Ziv
If an exception occurs while receiving an MDN, the error is just logged but not thrown out of the module. The calling code has no way to know that there was an error.
I suggest extracting the relevant code (AS2SenderModule, lines 659-664) into a protected method. or calling an overridable no-op method from the catch block
.
Hello helger first of all i would like to thank you for the great work your doing. and i might use your work in the near future and create GUI to work with server.
When checking out out a project it comes with 80 or so warnings,
1st warning is about adding a serialize id to the classes. could you please add automatic generated id's? right now i have to add it myself with every revision update.
second is about dead code. maby add suppression warnings?
third warning: XML files changelog and findbugs-exlusion. could oyu add to it to suppress no grammer contrainst warnings
kind regards,
Hi Philip,
using your library sometimes we have this error:
com.helger.as2lib.exception.OpenAS2Exception OpenAS2 WrappedOpenAS2Exception terminated: java.net.SocketTimeoutException: Read timed out; sources: {message=[AS2Message@0x107cf2de: data=javax.mail.internet.MimeBodyPart@6fbf0b80; MDN=null]}: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1536)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
at com.helger.as2lib.processor.sender.AS2SenderModule._sendViaHTTP(AS2SenderModule.java:635)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:706)
at com.helger.as2lib.client.AS2Client.sendSynchronous(AS2Client.java:318)
at com.helger.peppol.as2client.AS2ClientBuilder.sendSynchronous(AS2ClientBuilder.java:983)
at com.jpeppol.as2sender.service.As2SenderService.process(As2SenderService.java:250)
But the file is received correctly.
Did you experience this?
thanks in advance
Fiorenzo Pizza
It would be nice to support easy dumping of the sent AS2/HTTP request. I have seen corresponding code doing this, but the code is currently "locked" by this flag (https://github.com/phax/as2-lib/blob/master/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java#L105)
When sending a message and the AS2 ID and the key alias are not the same, the reverse partnership that is created when receiving a synchronous MDN uses the message recipient's (or MDN sender's) AS2 ID as the certificate alias instead of the KeyAlias
from the AS2ClientSettings
and the lookup fails.
I hope this makes sense, I'm not entirely sure if I'm using it correctly.
Hi Philip,
When working with not mdn you don't need to calculare mic.
Is It redundant?
Thanks,
Itay
Hi Philip,
I think the headers are not written to the MDN message. I think it is around the line
aMDN.headers ().addAllHeaders (aConn.getHeaderFields ());
in AS2SenderModule#receiveSyncMDN
.
What do you think?
How can i make connection to the endpoints using a proxy?
I cannot set the proxy at JVM level, because not all http connection must go through the same proxy.
After a little bot of digging in the classes i found in
AbstractHttpSenderModule.getConnection( ....)
the line
final HttpURLConnection aConn = (HttpURLConnection) aUrlObj.openConnection ();
I know i can add a proxy object to the openConnection method.
Is there an elegant way of overriding this method?
Are there more places where this method is used (the openconnection) one?
Hi Philip,
When working with sync mdn and the mic that returned from the server doesn't match the mic calculated in the client the as2 lib only print that the mic isn't matched without throwing exception.
Is it desired behaviour?
Thanks,
Itay
Hi,
We consider to use as2-lib and I have a few questions:
Hi Philip,
We need to add AES256 and SHA-2. I will add them and issue a pull request. OK with you?
Thanks,
Ziv
This is a very minor issue, but it somehow feels strange this way.
Partnership.getAllAttributes()
returns IStringMap
whereas getAllSenderIDs()
and getAllReceiverIDs
return StringMap
. I'd say they should all return IStringMap
.
But maybe the methods should be deprecated altogether and replaced by getters and setters for each property, but I guess that's a separate issue.
Source: phax/as2-server#18 by @stetskevych
using
SHA256
produces
"com.helger.as2lib.exception.OpenAS2Exception: The signing algorithm 'SHA256' is not supported!"
changing tosha-256
fixes it
also true for 3DES -> 3des
I have run into a problem with a partner rejecting a message with an "unsupported mic-algorithms" error.
The mime content starts like this:
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-1;
boundary="----=_Part_1_1009538009.1460639689958"
This seems to be caused by an old change in bouncycastle:
RFC 5751 changed the definition of the micalg parameters defined in RFC 3851. The SMIMESignedGenerator is now up to date with the latest micalg parameter set and a constructor has been added to allow the old micalg parameter set to be used.
https://www.rfc-editor.org/errata_search.php?rfc=4130
https://www.drummondgroup.com/images/pdf/AS2-1Q14_Issues_Resolved.pdf
The latest version of the sending participants Crypto API uses RFC 5751 which has
micalg=sha-1 by default when signing data. The receiving participant required the older
RFC 3851 micalg=sha1. The sending participant modified their code to accommodate
the receiving participant as described in the following note. All other participants
accepted either sha1 or sha-1. Note from Crypto API vendor: between RFC 3851 and
RFC 5751 the values used in the micalg parameter for signed messages changed. We
will accept both, but the default is now to use RFC 5751. In the event you are dealing
with an RFC 3851 based system you will also need to use a constructor that sets the
micalgs table and call it with RFC3851_MICALGS.
As I understand it sending "sha-1" is correct (in general); the only solution for compat with old software appears to be an additional flag (per partnership) to switch to old micalg names?
The following is minimally tested and seems to work for me:
diff --git a/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java b/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java
index 65670e0..b1b784f 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/crypto/BCCryptoHelper.java
@@ -413,7 +413,8 @@ public final class BCCryptoHelper implements ICryptoHelper
@Nonnull final X509Certificate aX509Cert,
@Nonnull final PrivateKey aPrivateKey,
@Nonnull final ECryptoAlgorithmSign eAlgorithm,
- final boolean bIncludeCertificateInSignedContent) throws GeneralSecurityException,
+ final boolean bIncludeCertificateInSignedContent,
+ final boolean rfc3851MicAlgs) throws GeneralSecurityException,
SMIMEException,
MessagingException,
OperatorCreationException
@@ -454,7 +455,9 @@ public final class BCCryptoHelper implements ICryptoHelper
// aSignedAttrs.add (new SMIMEEncryptionKeyPreferenceAttribute (issAndSer));
// create the generator for creating an smime/signed message
- final SMIMESignedGenerator aSGen = new SMIMESignedGenerator ();
+ final SMIMESignedGenerator aSGen = rfc3851MicAlgs
+ ? new SMIMESignedGenerator(SMIMESignedGenerator.RFC3851_MICALGS)
+ : new SMIMESignedGenerator ();
// aSGen.addSigner (aPrivKey, aX509Cert, aSignDigest.getId ());
// add a signer to the generator - this specifies we are using SHA1 and
diff --git a/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java b/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java
index dcfadae..cfe1aed 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/crypto/ICryptoHelper.java
@@ -186,7 +186,8 @@ public interface ICryptoHelper
@Nonnull X509Certificate aCert,
@Nonnull PrivateKey aKey,
@Nonnull ECryptoAlgorithmSign eAlgorithm,
- boolean bIncludeCertificateInSignedContent) throws Exception;
+ boolean bIncludeCertificateInSignedContent,
+ boolean rfc3851MicAlgs) throws Exception;
/**
* Verify the specified Mime Body part against the part certificate
diff --git a/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java b/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java
index 6853dfe..698e762 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/partner/CPartnershipIDs.java
@@ -81,6 +81,9 @@ public final class CPartnershipIDs
* (using the value of the <code>getID()</code> method)
*/
public static final String PA_ENCRYPT = "encrypt";
+
+ public static final String PA_RFC3851_MICALGS = "rfc3851_micalgs";
+
/**
* Set this to the signature digest algorithm to sign sent messages, check
* {@link com.helger.as2lib.crypto.ECryptoAlgorithmSign} constants for values
diff --git a/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java b/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java
index 110a1d4..311cf12 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/partner/Partnership.java
@@ -788,6 +788,16 @@ public class Partnership implements Serializable
{
return setAttribute (CPartnershipIDs.PA_DISABLE_DECOMPRESS, Boolean.toString (bValue));
}
+
+ public boolean isRfc3851MicAlgs()
+ {
+ return m_aAttributes.getAttributeAsBoolean(CPartnershipIDs.PA_RFC3851_MICALGS, false);
+ }
+
+ public EChange setRfc3851MicAlgs(final boolean bValue)
+ {
+ return setAttribute (CPartnershipIDs.PA_RFC3851_MICALGS, Boolean.toString(bValue));
+ }
/**
* @return A copy of all contained attributes. Never <code>null</code>.
diff --git a/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java b/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java
index eb59d0d..c20649f 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/processor/sender/AS2SenderModule.java
@@ -348,7 +348,8 @@ public class AS2SenderModule extends AbstractHttpSenderModule
// Main signing
aDataBP = AS2Helper.getCryptoHelper ()
- .sign (aDataBP, aSenderCert, aSenderKey, eSignAlgorithm, bIncludeCertificateInSignedContent);
+ .sign (aDataBP, aSenderCert, aSenderKey, eSignAlgorithm, bIncludeCertificateInSignedContent,
+ aPartnership.isRfc3851MicAlgs());
if (s_aLogger.isDebugEnabled ())
s_aLogger.debug ("Signed data with " +
diff --git a/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java b/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java
index d32105a..9271938 100644
--- a/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java
+++ b/as2-lib/src/main/java/com/helger/as2lib/util/AS2Helper.java
@@ -118,7 +118,8 @@ public final class AS2Helper
@Nonnull final IMessageMDN aMdn,
final boolean bSignMDN,
final boolean bIncludeCertificateInSignedContent,
- @Nullable final ECryptoAlgorithmSign eMICAlg) throws Exception
+ @Nullable final ECryptoAlgorithmSign eMICAlg,
+ final boolean rfc3851MicAlgs) throws Exception
{
ValueEnforcer.notNull (aSession, "AS2Session");
ValueEnforcer.notNull (aMdn, "MDN");
@@ -175,7 +176,7 @@ public final class AS2Helper
aSenderCert,
aSenderKey,
eMICAlg,
- bIncludeCertificateInSignedContent);
+ bIncludeCertificateInSignedContent, rfc3851MicAlgs);
aMdn.setData (aSignedReport);
}
catch (final CertificateNotFoundException ex)
@@ -322,7 +323,8 @@ public final class AS2Helper
}
}
- createMDNData (aSession, aMDN, bSignMDN, bIncludeCertificateInSignedContent, aDispositionOptions.getFirstMICAlg ());
+ createMDNData (aSession, aMDN, bSignMDN, bIncludeCertificateInSignedContent, aDispositionOptions.getFirstMICAlg (),
+ aMsg.getPartnership().isRfc3851MicAlgs());
aMDN.updateMessageID ();
Validation of the SMIME signature fails when the body includes a certificate chain and the signing cert is not first in the list.
The validation code is simply using the first certificate. It should examine the signature and use the certificate that matches that.
The usage of the AS2Client should be explained in the basic README. Request by Marek
If I create a partnership with a wrong AS2 url and try to send a request, the handler logs some errors but returns instead of throwing an exception.
The logs contain
14:03:44.172 [qtp596512129-61] ERROR c.h.a.p.sender.AS2SenderModule - Error URL 'http://as2test:8080/as2/brokenurl' - HTTP 404 Not Found
14:03:44.172 [qtp596512129-61] ERROR c.h.a.p.sender.AS2SenderModule - Http Response Error Not Found
14:03:44.172 [qtp596512129-61] INFO c.h.a.exception.OpenAS2Exception - OpenAS2Exception terminated: Not Found
Maybe AS2SenderModule._resend(IMessage, OpenAS2Exception, int)
should rethrow the exception.
Hi Philip,
You made a change to support BCFIPS provider in BCCryptoHelper class however there 2 places you left with calling to BC Provider explicit and not via the new parameter m_sSecurityProviderName.
In decrypt method you are using BouncyCastleProvider.PROVIDER_NAME instead of m_sSecurityProviderName
if (bLargeFileOn)
{
aDecryptedDataBodyPart = SMIMEUtil.toMimeBodyPart (aRecipient.getContentStream (new JceKeyTransEnvelopedRecipient (aPrivateKey).setProvider (BouncyCastleProvider.PROVIDER_NAME)));
}
else
{
final byte [] aDecryptedData = aRecipient.getContent (new JceKeyTransEnvelopedRecipient (aPrivateKey).setProvider (BouncyCastleProvider.PROVIDER_NAME));
if (s_aDumpDecryptedDirectory != null)
{
_dumpDecrypted (aDecryptedData);
}
aDecryptedDataBodyPart = SMIMEUtil.toMimeBodyPart (aDecryptedData);
}
return aDecryptedDataBodyPart;
}
Could you please modify those changes and push them to 4.2.0
Another question is when 4.2.0 should be released?
Thanks a lot,
Itay
Hi there,
I've setup the AS2ReceiveServlet servlet in my web.xml, and created the required config.xml and other files.
I'm getting the following exception after hitting the AS2ReceiveServlet via a browser GET request (http://localhost:8080/test-web/as2/HttpReceiver): "java.lang.IllegalStateException: No global scope object has been set!" (see stacktrace below). Do you have any idea how to resolve this issue?
NOTE: This exception occurs prior to loading the configuration file from web.xml init parameter.
Thanks,
Yusuf
Caused by: java.lang.IllegalStateException: No global scope object has been set!
at com.helger.scope.mgr.ScopeManager.getGlobalScope(ScopeManager.java:158)
at com.helger.scope.singleton.AbstractGlobalSingleton._getStaticScope(AbstractGlobalSingleton.java:48)
at com.helger.scope.singleton.AbstractGlobalSingleton.getGlobalSingleton(AbstractGlobalSingleton.java:65)
at com.helger.xservlet.servletstatus.ServletStatusManager.getInstance(ServletStatusManager.java:66)
at com.helger.xservlet.AbstractXServlet.<init>(AbstractXServlet.java:181)
at com.helger.as2servlet.AS2ReceiveServlet.<init>(AS2ReceiveServlet.java:32)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:119)
at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:92)
at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:78)
at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)
at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:116)
at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:180)
at org.jboss.as.weld.injection.WeldInjectionContext.produce(WeldInjectionContext.java:46)
at org.jboss.as.weld.injection.WeldManagedReferenceFactory.create(WeldManagedReferenceFactory.java:55)
at org.jboss.as.ee.component.ComponentInstantiatorInterceptor.processInvocation(ComponentInstantiatorInterceptor.java:67)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
at org.jboss.as.ee.component.AroundConstructInterceptorFactory$1.processInvocation(AroundConstructInterceptorFactory.java:26)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.weld.injection.WeldInjectionContextInterceptor.processInvocation(WeldInjectionContextInterceptor.java:43)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)
at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161)
... 44 more
I'm getting the following error when trying to receive a message using as2-servlet:
ERROR [com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler] (default task-8) Error decrypting [<MY-JUNIT-TEST-CASE-phax-as2-lib-31072018232014+0200-1843@OpenAS2B_OID_OpenAS2A_OID>]: JCE cannot authenticate the provider BC
I've tried a number of options found online without any success. Any ideas on how to resolve this?
Thanks!
Yusuf
When sending the message the encryption is done by a private key residing in a keystore.
The as2-lib needs this keystore to be writeable. In a production environment this is not
acceptable for 2 reasons.
Please make a keystore as a copy in the /tmp folder or move the keystore to memory
Version: AS2-LIB 4.1.1-SNAPSHOT from 'master'
In AS2Client in the buildPartnership
the AS2MDNTo is always set, so an MDN is always requested. You cannot unset it or populate the partnership in a different way
aPartnership.setAS2MDNTo (aSettings.getSenderAS2ID ());
So it is effectively impossible to not request an MDN (Yes, I know it is strange but there is one case configured like that live with a customer (yes for a test system, but still)
If I comment out the line above in the code
Maybe an additional method where the partnership is explicitly passed on, not via the settings would be a good addition.
Hi Philip,
Looking at the headers of the message, I do not see the "Disposition-notification-to=[email protected]" header. I thought it should be included in the message to signal that an MDN is required.
Thanks,
Ziv
hi, I'm not sure if this is an issue or a misunderstanding on my part.
I've created a signed and encrypted AS/2 request message with openssl (pem files manually extracted from the certs.p12 keystore)
Create signed s/mime message:
openssl smime -sign -in GETMSG.msg -out GETMSG_SIGNED.msg -signer openas2a_private.pem
Encrypt s/mime message
openssl smime -encrypt -in GETMSG_SIGNED.msg -out GETMSG_ENC.msg -des3 openas2b_public.pem
The GETMSG_ENC.msg now contains HTTP headers and signed base64 content - manually remove the headers.
Send with cURL
curl -i -X POST \
-H "Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=\"smime.p7m\"" \
-H "Content-Disposition: attachment; filename=\"smime.p7m\"" \
-H "Content-Transfer-Encoding: base64" \
-H "MIME-Version: 1.0" \
-H "AS2-TO: openas2a_alias" \
-H "AS2-FROM: openas2b_alias" \
-H "AS2-VERSION: 1.1" \
-H "MESSAGE-ID: <OpenPEPPOL-20102017154649+0200-9154@openas2a_alias_openas2b_alias>" \
-H "Disposition-Notification-To: dummy" \
-H "DISPOSITION-NOTIFICATION-OPTIONS: signed-receipt-protocol=required, pkcs7-signature; signed-receipt-micalg=required, sha1" \
--data-binary @GETMSG_ENC.msg \
http://localhost:8080/as2ReaderService-1.0-SNAPSHOT/as2
The result hits a problem in BCCryptoHelper.decrypt(...) , when creating the new SMIMEEnveloped
org.bouncycastle.cms.CMSException: Malformed content.
at org.bouncycastle.cms.CMSUtils.readContentInfo(Unknown Source)
at org.bouncycastle.cms.CMSUtils.readContentInfo(Unknown Source)
at org.bouncycastle.cms.CMSEnvelopedData.<init>(Unknown Source)
at org.bouncycastle.mail.smime.SMIMEEnveloped.<init>(Unknown Source)
at com.helger.as2lib.crypto.BCCryptoHelper.decrypt(BCCryptoHelper.java:413)
at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.decrypt(AS2ReceiverHandler.java:168)
at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.handleIncomingMessage(AS2ReceiverHandler.java:476)
at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.handeIncomingMessage(AbstractAS2ReceiveXServletHandler.java:180)
at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.onRequest(AbstractAS2ReceiveXServletHandler.java:217)
at com.helger.xservlet.AbstractXServlet._invokeHandler(AbstractXServlet.java:344)
at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:524)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:579)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DERApplicationSpecific
at org.bouncycastle.asn1.ASN1Sequence.getInstance(Unknown Source)
at org.bouncycastle.asn1.cms.ContentInfo.getInstance(Unknown Source)
... 35 more
Exception in SMIMEEnveloped:Malformed content.
cause:java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DERApplicationSpecific
It seems that the code has passed the base64-encoded content directly into the SMIMEEnveloped method, while it expect the content to already base64-decoded.
Is there an extra HTTP header that I need to provide on the cURL call to ensure the content is decoded before sending to SMIMEEnveloped ?
This is rather a question than an actual issue.
I wonder if the Partner-related methods and classes (e.g. PartnerMap
) should be moved to XMLPartnershipFactory
. AFAICT, the whole "Partner" concept is currently local to the XML configuration, the rest of the code seems to work with complete Partnerships.
I'm asking because I have created a custom IPartnershipFactory that stores partnerships in a MongoDB collection (I could contribute the code if you're interested) and was confused that I had to implement all those methods but they were never called from anywhere.
Hi Philip,
When sending a message with no encryption, signature, or compression, the call
aSecuredMimePart.getInputStream() (AS2SenderModule:682) fails with Exception javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/xml.
Thanks, Ziv
I created an AS2 client based on the file https://github.com/phax/as2-lib/blob/master/as2-lib/src/test/java/com/helger/as2lib/supplementary/main/MainSendToMendelsonTest.java and is working for a Mendelson server that I setup on another computer. I am able to successfully send files to that local AS2 server and receive the MDNs successfully through this code.
However, using the same code to send a message to a external AS2 server on the internet, I am unable to do so. I get an exception
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - MIC IS NOT MATCHED, original mic: 'IpjGylckS2ovHgk995aA3SU2Jlw=, sha1' return mic: 'null' [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
Also, I tried sending that file to the same external AS2 server from Mendelson AS2 and that worked like a charm. Now, I am wondering what I am doing wrong in my code that I get the exception above.
Source Code :
package com.cts.as2client;
/**
* The following code was written based on the original source found in the link below:
* Original Author: Philip Helger
* https://github.com/phax/as2-lib/blob/master/as2-lib/src/test/java/com/helger/as2lib/supplementary/main/MainSendToMendelsonTest.java
*/
/**
* The FreeBSD Copyright
* Copyright 1994-2008 The FreeBSD Project. All rights reserved.
* Copyright (C) 2013-2018 Philip Helger philip[at]helger[dot]com
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD PROJECT OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation
* are those of the authors and should not be interpreted as representing
* official policies, either expressed or implied, of the FreeBSD Project.
*/
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import org.glassfish.jersey.internal.util.Base64;
import com.helger.as2lib.client.AS2Client;
import com.helger.as2lib.client.AS2ClientRequest;
import com.helger.as2lib.client.AS2ClientResponse;
import com.helger.as2lib.client.AS2ClientSettings;
import com.helger.as2lib.crypto.ECompressionType;
import com.helger.as2lib.crypto.ECryptoAlgorithmCrypt;
import com.helger.as2lib.crypto.ECryptoAlgorithmSign;
import com.helger.as2lib.disposition.DispositionOptions;
import com.helger.as2lib.util.cert.AS2KeyStoreHelper;
import com.helger.commons.mime.CMimeType;
import com.helger.security.keystore.EKeyStoreType;
/**
* Class to send an AS2 messages to AS2 server.
*/
public final class JavaAS2Client
{
static
{
if (true)
System.setProperty ("org.slf4j.simpleLogger.defaultLogLevel", "TRACE");
}
public static void main(String [] args) throws Exception
{
String aResponse = null;
// aResponse = sendFileToAS2Server
// (
// "C:/mendelson/nginx/nginx-1.13.10/conf/javaAS2ClientTestStore.pfx"
// , "test"
// , "javaAS2"
// , "[email protected]"
// , "javaas2clienttest.org"
// , "AS2 test message from JavaAS2Client"
// , "YW1vZWJhIHBhcmFtb2VjaXVtIGV1Z2xpbmEgaHlkcmEgYmFjdGVyaWE="
// //, new File("C:/mendelson/nginx/nginx-1.13.10/conf/ACK3_SUCCESS_Single_Report.xml")
// , "DIGEST_SHA1"
// , "foodsafetyAS2"
// , "foodsafety-vm.cloudapp.net"
// , "https://foodsafety-vm.cloudapp.net:7090/as2/HttpReceiver"
// , "C:/mendelson/nginx/nginx-1.13.10/conf/foodsafety_sha1_1024.cer"
// );
aResponse = sendFileToAS2Server
(
"C:/mendelson/javaAS2client/Certificates/FDA/CognizantMedvantageFDA.Private.Key.pfx"
, "ctstest"
, "788157159_CTS_AS2"
, "[email protected]"
, "Cognizant.MedvantageFDA.net"
, "AS2 test message from JavaAS2Client"
, "YW1vZWJhIHBhcmFtb2VjaXVtIGV1Z2xpbmEgaHlkcmEgYmFjdGVyaWE="
//, new File("C:/mendelson/nginx/nginx-1.13.10/conf/ACK3_SUCCESS_Single_Report.xml")
, "DIGEST_SHA1"
, "ZZFDATST"
, "FDA ESG Administrators"
, "https://esgtest.fda.gov:4080/exchange/ZZFDAAS2TST"
, "C:/mendelson/javaAS2client/Certificates/FDA/ESGsign_encryptioncert.cer"
);
if (aResponse != null)
{
System.out.println("Response received = " + aResponse);
String search = null;
int start = -1, end = -1;
search = "responseAsStringBase64";
start = aResponse.indexOf(search) + search.length() + 5;
end = aResponse.indexOf("\"", start);
System.out.println("Response decoded = " + Base64.decodeAsString(aResponse.substring(start, end)));
search = "mdnTextBase64";
start = aResponse.indexOf(search) + search.length() + 5;
end = aResponse.indexOf("\"", start);
System.out.println("MDN Text decoded = " + Base64.decodeAsString(aResponse.substring(start, end)));
}
else
System.out.println("null response");
}
public static String sendFileToAS2Server
(
String clientKeyStoreFilePath
, String clientKeyStoreRawPassword
, String clientAS2PartnerName
, String clientAS2ServerEmailAddress
, String clientAS2PrivateKeyAlias
, String clientAS2RequestDescription
, String clientAS2RequestDataAsBase64
, String clientAS2SignatureAlgorithm
, String serverAS2PartnerName
, String serverAS2PublicKeyAlias
, String serverAS2URL
, String serverAS2PublicKeyFilePath
) throws Exception
{
AS2ClientSettings aSettings = initAS2ClientSettings
(
clientKeyStoreFilePath
, clientKeyStoreRawPassword
, clientAS2PartnerName
, clientAS2ServerEmailAddress
, clientAS2PrivateKeyAlias
, clientAS2SignatureAlgorithm
, serverAS2PartnerName
, serverAS2PublicKeyAlias
, serverAS2URL
, serverAS2PublicKeyFilePath
);
// Build client request
final AS2ClientRequest aRequest = new AS2ClientRequest (clientAS2RequestDescription);
aRequest.setData (Base64.decodeAsString(clientAS2RequestDataAsBase64), StandardCharsets.ISO_8859_1);
// //SVN-ADDEDFORFDATEST
// aRequest.setFilename("test.xml");
aRequest.setContentType (CMimeType.TEXT_PLAIN.getAsString());
HashMap <String, String> hmAS2Response = sendAS2Request(aSettings, aRequest);
return hashMapToJsonString(hmAS2Response);
}
public static String sendFileToAS2Server
(
String clientKeyStoreFilePath
, String clientKeyStoreRawPassword
, String clientAS2PartnerName
, String clientAS2ServerEmailAddress
, String clientAS2PrivateKeyAlias
, String clientAS2RequestDescription
, File clientAS2RequestDataFilePath
, String clientAS2SignatureAlgorithm
, String serverAS2PartnerName
, String serverAS2PublicKeyAlias
, String serverAS2URL
, String serverAS2PublicKeyFilePath
) throws Exception
{
AS2ClientSettings aSettings = initAS2ClientSettings
(
clientKeyStoreFilePath
, clientKeyStoreRawPassword
, clientAS2PartnerName
, clientAS2ServerEmailAddress
, clientAS2PrivateKeyAlias
, clientAS2SignatureAlgorithm
, serverAS2PartnerName
, serverAS2PublicKeyAlias
, serverAS2URL
, serverAS2PublicKeyFilePath
);
// Build client request
final AS2ClientRequest aRequest = new AS2ClientRequest (clientAS2RequestDescription);
aRequest.setData (clientAS2RequestDataFilePath, StandardCharsets.ISO_8859_1);
// //SVN-ADDEDFORFDATEST
// aRequest.setFilename(clientAS2RequestDataFilePath.getName());
aRequest.setContentType (CMimeType.TEXT_PLAIN.getAsString());
HashMap <String, String> hmAS2Response = sendAS2Request(aSettings, aRequest);
return hashMapToJsonString(hmAS2Response);
}
public static AS2ClientSettings initAS2ClientSettings
(
String clientKeyStoreFilePath
, String clientKeyStoreRawPassword
, String clientAS2PartnerName
, String clientAS2ServerEmailAddress
, String clientAS2PrivateKeyAlias
, String clientAS2SignatureAlgorithm
, String serverAS2PartnerName
, String serverAS2PublicKeyAlias
, String serverAS2URL
, String serverAS2PublicKeyFilePath
) throws Exception
{
// Start client configuration
final AS2ClientSettings aSettings = new AS2ClientSettings ();
// This PFX file should contain the client AS2's private key pair and the server AS2's public key
aSettings.setKeyStore (EKeyStoreType.PKCS12, new File (clientKeyStoreFilePath), clientKeyStoreRawPassword);
//SVN-ADDEDFORFDATEST
aSettings.customHeaders().addHeader("X-Cyclone-Metadata-FdaSubmissionType", "GWTEST");
aSettings.customHeaders().addHeader("X-Cyclone-Metadata-FdaCenter", "ConnectTest");
// sender - This java program, which is an AS2 client
aSettings.setSenderData (clientAS2PartnerName, clientAS2ServerEmailAddress, clientAS2PrivateKeyAlias);
// receiver - The AS2 server that receives the file sent
aSettings.setReceiverData
(
serverAS2PartnerName // AS2 id of the AS2 Server
, serverAS2PublicKeyAlias // Key alias of the server's public key,
// imported into the client's keystore
// (here javaAS2ClientTestStore.pfx)
, serverAS2URL // URL of the AS2 server
);
// public key exported from the AS2 server
// and sent to the client computer, for encryption
final X509Certificate aReceiverCertificate = AS2KeyStoreHelper.readX509Certificate (serverAS2PublicKeyFilePath);
aSettings.setReceiverCertificate (aReceiverCertificate);
// AS2 stuff
aSettings.setPartnershipName (aSettings.getSenderAS2ID () + "_" + aSettings.getReceiverAS2ID ());
// When a signed message is used, the algorithm for MIC and message must be identical
final ECryptoAlgorithmSign eSignAlgo = ECryptoAlgorithmSign.valueOf(clientAS2SignatureAlgorithm);
//final ECryptoAlgorithmSign eSignAlgo = ECryptoAlgorithmSign.DIGEST_SHA256;
aSettings.setMDNOptions
(
new DispositionOptions ()
.setMICAlg (eSignAlgo)
.setMICAlgImportance (DispositionOptions.IMPORTANCE_REQUIRED)
.setProtocol (DispositionOptions.SIGNED_RECEIPT_MICALG)
.setProtocolImportance (DispositionOptions.IMPORTANCE_REQUIRED)
);
aSettings.setEncryptAndSign (ECryptoAlgorithmCrypt.CRYPT_3DES, eSignAlgo);
aSettings.setCompress (ECompressionType.ZLIB, false);
aSettings.setMessageIDFormat ("JavaAS2Client_phaxAS2Lib-$date.ddMMuuuuHHmmssZ$-$rand.1234$@$msg.sender.as2_id$_$msg.receiver.as2_id$");
aSettings.setRetryCount (1);
aSettings.setConnectTimeoutMS (600_000);
aSettings.setReadTimeoutMS (600_000);
return aSettings;
}
public static HashMap <String, String> sendAS2Request(AS2ClientSettings aSettings, AS2ClientRequest aRequest)
{
// Send message
final AS2ClientResponse aResponse = new AS2Client ()
.setHttpProxy (null)
.sendSynchronous (aSettings, aRequest);
// Process Response
HashMap <String, String> hmAS2Response = new HashMap<String, String>();
if (aResponse.hasException())
{
StringWriter stackTrace = new StringWriter();
aResponse.getException().printStackTrace(new PrintWriter(stackTrace));
hmAS2Response.put("exceptionAsStringBase64", Base64.encodeAsString(stackTrace.toString()));
}
else
{
hmAS2Response.put("originalMessageID", (String) nvl(aResponse.getOriginalMessageID(), "NULL_RECD"));
hmAS2Response.put("mdnMessageID", (String) nvl(aResponse.getMDNMessageID(), "NULL_RECD"));
hmAS2Response.put("mdnDisposition", (String) nvl(aResponse.getMDNDisposition(), "NULL_RECD"));
hmAS2Response.put("mdnTextBase64", Base64.encodeAsString((String) nvl(aResponse.getMDNText(), "NULL_RECD")));
hmAS2Response.put("responseAsStringBase64", Base64.encodeAsString((String) nvl(aResponse.getAsString(), "NULL_RECD")));
}
return hmAS2Response;
}
public static Object nvl(Object objCheck, Object objReturn)
{
if (objCheck == null)
return objReturn;
return objCheck;
}
public static String hashMapToJsonString(HashMap<String, String> map)
{
String jsonString = null;
for (String key : map.keySet())
{
String keyValue = '"' + key + '"' + " : " + '"' + map.get(key) + '"';
jsonString = (jsonString == null) ? keyValue : jsonString + ", " + keyValue;
}
return "{ " + jsonString + " }";
}
}
Log Messages
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.time.ZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.chrono.ChronoZonedDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.time.OffsetDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'class java.time.LocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Timestamp' to 'interface java.time.chrono.ChronoLocalDateTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Date' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.time.LocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.time.chrono.ChronoLocalDate'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.GregorianCalendar' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.ZonedDateTime' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.OffsetDateTime' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.util.Date' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'class java.time.LocalTime'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.time.temporal.Temporal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.sql.Time' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDateTime' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalDate' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.LocalTime' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.YearMonth' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Year' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.util.GregorianCalendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'class java.util.Calendar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.time.Instant' to 'interface java.lang.Cloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.MonthDay'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.YearMonth'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.Year'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.Duration'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.temporal.TemporalAmount'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.time.Period'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface java.time.chrono.ChronoPeriod'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class java.time.Month'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class java.lang.Enum'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface java.time.temporal.TemporalAdjuster'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface java.time.temporal.TemporalAccessor'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class java.time.DayOfWeek'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.commons.typeconvert.IOTypeConverterRegistrar
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.lang.String'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'interface java.lang.CharSequence'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.net.URI'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.io.File' to 'class java.net.URL'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class java.io.File'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class java.net.URL'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.lang.String'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface java.lang.CharSequence'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.io.File'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class java.net.URI'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.io.File'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.net.URI'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.net.URL'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAssignableSourceFixedDestination with type ASSIGNABLE_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class com.helger.commons.io.resource.ClassPathResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.lang.IHasClassLoader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IReadableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IResourceBase'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasInputStreamAndReader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasInputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class com.helger.commons.io.resource.ClassPathResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.lang.IHasClassLoader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IReadableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IResourceBase'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasInputStreamAndReader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasInputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class com.helger.commons.io.resource.FileSystemResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IReadWriteResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.resource.IWritableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasOutputStreamAndWriter'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'interface com.helger.commons.io.IHasOutputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class com.helger.commons.io.resource.FileSystemResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IReadWriteResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.resource.IWritableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasOutputStreamAndWriter'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'interface com.helger.commons.io.IHasOutputStream'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class com.helger.commons.io.resource.URLResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URL' to 'class com.helger.commons.io.resource.URLResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'class com.helger.commons.io.resource.URLResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.resource.IReadableResource'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.resource.IResourceBase'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.IHasInputStreamAndReader'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.net.URI' to 'interface com.helger.commons.io.IHasInputStream'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.commons.typeconvert.LocaleTypeConverterRegistrar
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.String' to 'class java.util.Locale'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.commons.typeconvert.MutableTypeConverterRegistrar
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'class java.math.BigDecimal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigDecimal' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'class com.helger.commons.mutable.MutableBigDecimal'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigDecimal' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'class java.math.BigInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBigInteger' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'class com.helger.commons.mutable.MutableBigInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.math.BigInteger' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'class java.lang.Boolean'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableBoolean' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'class com.helger.commons.mutable.MutableBoolean'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Boolean' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'class java.lang.Byte'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableByte' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'class com.helger.commons.mutable.MutableByte'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Byte' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'class java.lang.Character'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableChar' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'class com.helger.commons.mutable.MutableChar'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Character' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'class java.lang.Double'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableDouble' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class com.helger.commons.mutable.MutableDouble'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Double' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'class java.lang.Float'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableFloat' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class com.helger.commons.mutable.MutableFloat'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Float' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'class java.lang.Integer'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableInt' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class com.helger.commons.mutable.MutableInt'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Integer' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'class java.lang.Long'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableLong' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'class com.helger.commons.mutable.MutableLong'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Long' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'class java.lang.Short'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'class java.lang.Number'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.mutable.MutableShort' to 'interface java.lang.Comparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'class com.helger.commons.mutable.MutableShort'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'class com.helger.commons.mutable.AbstractMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'class com.helger.commons.mutable.AbstractMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.IMutableNumeric'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.INumber'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.IMutableObject'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.traits.IGenericImplTrait'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.lang.ICloneable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.compare.IComparable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class java.lang.Short' to 'interface com.helger.commons.mutable.IMutableInteger'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleFixedSourceAnyDestination with type FIXED_SRC_ANY_DST
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter rule TypeConverterRuleAnySourceFixedDestination with type ANY_SRC_FIXED_DST
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - Calling registerTypeConverter on com.helger.mail.config.TypeConverterRegistrar_ph_mail
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'class com.helger.commons.email.EmailAddress'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'interface com.helger.commons.email.IEmailAddress'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class javax.mail.internet.InternetAddress' to 'interface com.helger.commons.name.IHasDisplayName'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'class javax.mail.internet.InternetAddress'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'class javax.mail.Address'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'class java.lang.Object'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'interface java.io.Serializable'
[main] TRACE com.helger.commons.typeconvert.TypeConverterRegistry - Registered type converter from 'class com.helger.commons.email.EmailAddress' to 'interface java.lang.Cloneable'
[main] DEBUG com.helger.commons.typeconvert.TypeConverterRegistry - 772 type converters and 90 rules registered
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - Connecting to https://esgtest.fda.gov:4080/exchange/ZZFDAAS2TST [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] INFO com.helger.commons.ws.TrustManagerTrustAll - checkServerTrusted ([[
[
Version: V3
Subject: CN=esgtest.fda.gov, O=US Dept of Health and Human Services, L=Rockville, ST=Maryland, C=US
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
Key: Sun RSA public key, 2048 bits
modulus: 26409645288072701685708252283552198223498845611725200609755740624137536448254583927263516302206825663359835877366947508397562478771854330112768468404204218646721940101008831157216559587018218996277705710684825971653832578751114215113605869986712576535332758046714100060480896544508932543054628863001228951853095653365058690860811265776630400588805096499610772203015157957988730690067495538956821204723914150011103723587187690627740048054158215126598468835180795138671881933572486518495389384190921489473869426023299262768290119823952935390155295718121764919749671918403970618298307670826490325329912099059045633915901
public exponent: 65537
Validity: [From: Mon Oct 30 13:51:21 UTC 2017,
To: Sat Nov 23 14:21:20 UTC 2019]
Issuer: CN=Entrust Certification Authority - L1K, OU="(c) 2012 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
SerialNumber: [ 8a9f7bc8 d36bf291 00000000 50debe6d]
Certificate Extensions: 9
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: ocsp
accessLocation: URIName: http://ocsp.entrust.net
,
accessMethod: caIssuers
accessLocation: URIName: http://aia.entrust.net/l1k-chain256.cer
]
]
[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 82 A2 70 74 DD BC 53 3F CF 7B D4 F7 CD 7F A7 60 ..pt..S?.......`
0010: C6 0A 4C BF ..L.
]
]
[3]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:false
PathLen: undefined
]
[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://crl.entrust.net/level1k.crl]
]]
[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [2.16.840.1.114028.10.1.5]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 1A 68 74 74 70 3A 2F 2F 77 77 77 2E 65 6E 74 ..http://www.ent
0010: 72 75 73 74 2E 6E 65 74 2F 72 70 61 rust.net/rpa
]] ]
[CertificatePolicyId: [2.23.140.1.2.2]
[] ]
]
[6]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
serverAuth
clientAuth
]
[7]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_Encipherment
]
[8]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: esgtest.fda.gov
]
[9]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 9C 7A 6F E8 22 A3 4C 69 4B 04 4B 1C A2 F5 2B 16 .zo.".LiK.K...+.
0010: 57 23 5D 19 W#].
]
]
]
Algorithm: [SHA256withRSA]
Signature:
0000: C7 73 AC 4F 03 11 31 6D 38 F2 58 D9 03 E1 63 5A .s.O..1m8.X...cZ
0010: 58 87 BD F7 7E AF E7 9E 03 D0 47 53 63 07 F6 EE X.........GSc...
0020: 68 D0 29 50 8E FB 61 C9 63 C9 23 CB 1B A8 CF A3 h.)P..a.c.#.....
0030: 7B F5 7A 83 8B B0 EC 37 8C 08 47 81 74 65 5A F6 ..z....7..G.teZ.
0040: 37 31 11 A0 BE D6 B1 83 36 57 A0 3F F8 75 50 A6 71......6W.?.uP.
0050: 02 C1 61 63 92 E5 A7 23 D6 C9 B5 6C 3A D1 C0 27 ..ac...#...l:..'
0060: CC B0 F3 12 E3 34 82 B1 48 49 BD D6 91 81 9E 53 .....4..HI.....S
0070: 5C F8 02 83 7D 93 1D D6 26 4C BD 31 36 EB 38 16 \.......&L.16.8.
0080: 49 24 68 8D 2E F1 7F 60 AC 4C D4 75 C4 C1 55 9D I$h....`.L.u..U.
0090: A5 68 AD 91 96 9D 08 01 CC 22 49 63 82 63 80 4C .h......."Ic.c.L
00A0: CD DB 2A A0 98 F3 6D EF 45 76 64 BC 1B B3 94 A2 ..*...m.Evd.....
00B0: F8 7F 03 A6 FF C1 A7 4D 6D 33 41 EC D6 85 BE 30 .......Mm3A....0
00C0: 5C 75 2F A4 67 27 0A C0 B4 28 65 BB 8B 7C F6 B4 \u/.g'...(e.....
00D0: D5 A9 AD 21 63 FD 5D B5 33 23 48 BD 8B EE B1 79 ...!c.].3#H....y
00E0: 11 E7 A6 6F 96 F1 81 EE 3D A4 60 B5 3E 17 52 24 ...o....=.`.>.R$
00F0: 45 B1 2E 79 5D 91 BE BC 5A 3A E9 9E 8B 66 E2 58 E..y]...Z:...f.X
], [
[
Version: V3
Subject: CN=Entrust Certification Authority - L1K, OU="(c) 2012 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
Key: Sun RSA public key, 2048 bits
modulus: 27551307444371019689131110149769219990039807338613156351862185174382854411507882869594323045972646206522091223412845084662697963738056329694954757733127615230544144867691820621020457350209413744664435391268026938568271273767754233391180191225380975610419044223872547759974221165383368362204707920992085265752716511977418428433352003666603687066036036809314076495340047097056540549930002295830214871821901801683045861508207035810803683518154876258099914890430271432879895190838085378353306026330728201860966695131162987330349622401592098379219672966523107482097898903654925215411696318757332545538679817537243386206491
public exponent: 65537
Validity: [From: Mon Oct 05 19:13:56 UTC 2015,
To: Thu Dec 05 19:43:56 UTC 2030]
Issuer: CN=Entrust Root Certification Authority - G2, OU="(c) 2009 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
SerialNumber: [ 0ee94cc3 00000000 51d37785]
Certificate Extensions: 7
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: ocsp
accessLocation: URIName: http://ocsp.entrust.net
]
]
[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 6A 72 26 7A D0 1E EF 7D E7 3B 69 51 D4 6C 8D 9F jr&z.....;iQ.l..
0010: 90 12 66 AB ..f.
]
]
[3]: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:0
]
[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://crl.entrust.net/g2ca.crl]
]]
[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [2.5.29.32.0]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 1A 68 74 74 70 3A 2F 2F 77 77 77 2E 65 6E 74 ..http://www.ent
0010: 72 75 73 74 2E 6E 65 74 2F 72 70 61 rust.net/rpa
]] ]
]
[6]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
[7]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 82 A2 70 74 DD BC 53 3F CF 7B D4 F7 CD 7F A7 60 ..pt..S?.......`
0010: C6 0A 4C BF ..L.
]
]
]
Algorithm: [SHA256withRSA]
Signature:
0000: 39 D5 8E 98 83 61 C8 2C 63 D3 70 1D 19 30 CB F6 9....a.,c.p..0..
0010: 09 AC CC 69 D5 C9 DC 37 41 F2 32 0F EF 74 C3 58 ...i...7A.2..t.X
0020: F6 78 27 09 34 08 95 92 2F D7 DF B8 A3 FD 0E 81 .x'.4.../.......
0030: E9 A4 9C D3 3F 4D 68 2B 15 31 0A 15 CC 52 04 93 ....?Mh+.1...R..
0040: E8 93 50 C3 D9 B1 E2 E1 68 B7 3A 09 74 F1 34 58 ..P.....h.:.t.4X
0050: 0A 3F 77 98 40 B8 E6 68 FF 5D E4 C8 46 C5 EC 81 [email protected].]..F...
0060: D7 C9 82 18 5C 83 CE 71 D8 BC BF AC 99 02 93 DB ....\..q........
0070: 94 98 84 D2 9C A6 B5 FE 5C BB F0 4A AF 21 AC C2 ........\..J.!..
0080: 3F 49 24 67 D6 2E 8E CF AC CC 64 15 18 72 E5 6C ?I$g......d..r.l
0090: 77 D3 52 A8 B9 DD 8D AC 00 4A 35 19 D4 6F 73 A3 w.R......J5..os.
00A0: 75 EF 6B 64 C3 E0 8D 83 12 A1 8A E7 0E 86 4D D8 u.kd..........M.
00B0: B4 20 1B BE 6A A5 8C 4B 68 66 E3 2B C7 58 0B FB . ..j..Khf.+.X..
00C0: 56 10 D4 91 FB 1D D3 31 58 10 8C 44 E3 75 7B 10 V......1X..D.u..
00D0: 9D B5 38 B1 F6 AA CA 81 64 6C E8 F2 E2 81 55 97 ..8.....dl....U.
00E0: 51 7F E1 C2 27 50 A2 C9 3C 5B 00 43 F6 5B B9 D5 Q...'P..<[.C.[..
00F0: A5 FC FF 07 50 40 67 07 B0 55 F0 B7 7E 6E 2D CC [email protected].
], [
[
Version: V3
Subject: CN=Entrust Root Certification Authority - G2, OU="(c) 2009 Entrust, Inc. - for authorized use only", OU=See www.entrust.net/legal-terms, O="Entrust, Inc.", C=US
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
Key: Sun RSA public key, 2048 bits
modulus: 23545767790267846087020216328652375341530866026192217463317405594910218314123159568888460497267501687940934346981754258614432514248455478810313157154214138578842767759163979536305859476265307686116748146371797434166143379656079822969790429567552761570863643046057291809190478531977203100009678850846269337262832775419535844414491425351658902840388933458673579532971478290411639120918504262738267963831253623767536425274517686015410328746042499987144667039641594899862629160973434220831909420079304090908018145960484024335529733348176737696982633769639849884581132755009947068081018826110609706967697922262932941743217
public exponent: 65537
Validity: [From: Mon Sep 22 17:14:57 UTC 2014,
To: Mon Sep 23 01:31:53 UTC 2024]
Issuer: CN=Entrust Root Certification Authority, OU="(c) 2006 Entrust, Inc.", OU=www.entrust.net/CPS is incorporated by reference, O="Entrust, Inc.", C=US
SerialNumber: [ 51d34044]
Certificate Extensions: 7
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: ocsp
accessLocation: URIName: http://ocsp.entrust.net
]
]
[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 68 90 E4 67 A4 A6 53 80 C7 86 66 A4 F1 F7 4B 43 h..g..S...f...KC
0010: FB 84 BD 6D ...m
]
]
[3]: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:1
]
[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://crl.entrust.net/rootca1.crl]
]]
[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [2.5.29.32.0]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 1A 68 74 74 70 3A 2F 2F 77 77 77 2E 65 6E 74 ..http://www.ent
0010: 72 75 73 74 2E 6E 65 74 2F 43 50 53 rust.net/CPS
]] ]
]
[6]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
[7]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 6A 72 26 7A D0 1E EF 7D E7 3B 69 51 D4 6C 8D 9F jr&z.....;iQ.l..
0010: 90 12 66 AB ..f.
]
]
]
Algorithm: [SHA256withRSA]
Signature:
0000: 69 33 83 FC 28 7A 6F 7D EF 9D 55 EB C5 3E 7A 9D i3..(zo...U..>z.
0010: 75 B3 CC C3 38 36 D9 34 A2 28 68 18 EA 1E 69 D3 u...86.4.(h...i.
0020: BD E7 D0 77 DA B8 00 83 4E 4A CF 6F D1 F1 C1 22 ...w....NJ.o..."
0030: 3F 74 E4 F7 98 49 9E 9B B6 9E E1 DB 98 77 2D 56 ?t...I.......w-V
0040: 34 B1 A8 3C D9 FD C0 CD C7 BF 05 03 D4 02 C5 F1 4..<............
0050: E5 C6 DA 08 A5 13 C7 62 23 11 D1 61 30 1D 60 84 .......b#..a0.`.
0060: 45 EF 79 A8 C6 26 93 A4 B7 CD 34 B8 69 C5 13 F6 E.y..&....4.i...
0070: 91 B3 C9 45 73 76 B6 92 F6 76 0A 5B E1 03 47 B7 ...Esv...v.[..G.
0080: E9 29 4C 91 32 23 37 4A 9C 35 D8 78 FD 1D 1F E4 .)L.2#7J.5.x....
0090: 83 89 24 80 AD B7 F9 CF E4 5D A5 D4 71 C4 85 5B ..$......]..q..[
00A0: 70 1F DB 3F 1C 01 EB 1A 45 26 31 14 CC 65 BF 67 p..?....E&1..e.g
00B0: DE CA CC 33 65 E5 41 91 D7 37 BE 41 1A 96 9D E6 ...3e.A..7.A....
00C0: 8A 97 9D A7 CE AC 4E 9A 3D BD 01 A0 6A D9 4F 22 ......N.=...j.O"
00D0: 00 8B 44 D5 69 62 7B 2E EB CC BA E7 92 7D 69 67 ..D.ib........ig
00E0: 3D FC B8 7C DE 41 87 D0 69 EA BA 0A 18 7A 1A 95 =....A..i....z..
00F0: 43 B3 79 71 28 76 6D A1 FB 57 4A EC 4D C8 0E 10 C.yq(vm..WJ.M...
], [
[
Version: V3
Subject: CN=Entrust Root Certification Authority, OU="(c) 2006 Entrust, Inc.", OU=www.entrust.net/CPS is incorporated by reference, O="Entrust, Inc.", C=US
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
Key: Sun RSA public key, 2048 bits
modulus: 23049197224710113590772544035103433278481817674493882011447342834437521939051768037777212700992378980195921282446936121554158364416908288069326476596859155882566673978444887949728617315810731530565469331622778409966087591257255114642101890934133193460653279618791020470236538122347487563173039818616304559198218202536315405577676472315795560540193000101878682158853566414134229236728954663196113800150132822629817679485490182404418400673058073844967527388560195880858402422047483008658534964509529966280511092808510110509164093311927186336350002098847973301828089965319406146060814149283619496543832009520752545683659
public exponent: 65537
Validity: [From: Mon Nov 27 20:23:42 UTC 2006,
To: Fri Nov 27 20:53:42 UTC 2026]
Issuer: CN=Entrust Root Certification Authority, OU="(c) 2006 Entrust, Inc.", OU=www.entrust.net/CPS is incorporated by reference, O="Entrust, Inc.", C=US
SerialNumber: [ 456b5054]
Certificate Extensions: 6
[1]: ObjectId: 1.2.840.113533.7.65.0 Criticality=false
Extension unknown: DER encoded OCTET string =
0000: 04 10 30 0E 1B 08 56 37 2E 31 3A 34 2E 30 03 02 ..0...V7.1:4.0..
0010: 04 90 ..
[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 68 90 E4 67 A4 A6 53 80 C7 86 66 A4 F1 F7 4B 43 h..g..S...f...KC
0010: FB 84 BD 6D ...m
]
]
[3]: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
[4]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
[5]: ObjectId: 2.5.29.16 Criticality=false
PrivateKeyUsage: [
From: Mon Nov 27 20:23:42 UTC 2006, To: Fri Nov 27 20:53:42 UTC 2026]
[6]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 68 90 E4 67 A4 A6 53 80 C7 86 66 A4 F1 F7 4B 43 h..g..S...f...KC
0010: FB 84 BD 6D ...m
]
]
]
Algorithm: [SHA1withRSA]
Signature:
0000: 93 D4 30 B0 D7 03 20 2A D0 F9 63 E8 91 0C 05 20 ..0... *..c....
0010: A9 5F 19 CA 7B 72 4E D4 B1 DB D0 96 FB 54 5A 19 ._...rN......TZ.
0020: 2C 0C 08 F7 B2 BC 85 A8 9D 7F 6D 3B 52 B3 2A DB ,.........m;R.*.
0030: E7 D4 84 8C 63 F6 0F CB 26 01 91 50 6C F4 5F 14 ....c...&..Pl._.
0040: E2 93 74 C0 13 9E 30 3A 50 E3 B4 60 C5 1C F0 22 ..t...0:P..`..."
0050: 44 8D 71 47 AC C8 1A C9 E9 9B 9A 00 60 13 FF 70 D.qG........`..p
0060: 7E 5F 11 4D 49 1B B3 15 52 7B C9 54 DA BF 9D 95 ._.MI...R..T....
0070: AF 6B 9A D8 9E E9 F1 E4 43 8D E2 11 44 3A BF AF .k......C...D:..
0080: BD 83 42 73 52 8B AA BB A7 29 CF F5 64 1C 0A 4D ..BsR....)..d..M
0090: D1 BC AA AC 9F 2A D0 FF 7F 7F DA 7D EA B1 ED 30 .....*.........0
00A0: 25 C1 84 DA 34 D2 5B 78 83 56 EC 9C 36 C3 26 E2 %...4.[x.V..6.&.
00B0: 11 F6 67 49 1D 92 AB 8C FB EB FF 7A EE 85 4A A7 ..gI.......z..J.
00C0: 50 80 F0 A7 5C 4A 94 2E 5F 05 99 3C 52 41 E0 CD P...\J.._..<RA..
00D0: B4 63 CF 01 43 BA 9C 83 DC 8F 60 3B F3 5A B4 B4 .c..C.....`;.Z..
00E0: 7B AE DA 0B 90 38 75 EF 81 1D 66 D2 F7 57 70 36 .....8u...f..Wp6
00F0: B3 BF FC 28 AF 71 25 85 5B 13 FE 1E 7F 5A B4 3C ...(.q%.[....Z.<
]], RSA)
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - transferred 2257 bytes in 0.044 seconds at 50.95 KBps [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] DEBUG com.helger.as2lib.processor.sender.AS2SenderModule - Receiving synchronous MDN for message [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] DEBUG com.helger.commons.http.HttpHeaderMap - Adding HTTP header: 'Connection' = 'close'
[main] DEBUG com.helger.commons.http.HttpHeaderMap - Adding HTTP header: 'Set-Cookie' = 'BIGipServerPreProd-Extranet-ESG3-4080=390638346.55315.0000; path=/'
[main] DEBUG com.helger.commons.http.HttpHeaderMap - Adding HTTP header: 'Set-Cookie' = 'BIGipServerPreProd-Extranet-ESG3-5080=911321866.55315.0000; path=/'
[main] TRACE com.helger.as2lib.processor.sender.AS2SenderModule - Retrieved MDN stream data:
[main] INFO com.helger.as2lib.util.AS2Helper - Start parsing MDN of [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] DEBUG com.helger.as2lib.processor.DefaultMessageProcessor - DefaultMessageProcessor.handle (storemdn,[AS2Message@0x772861aa: data=javax.mail.internet.MimeBodyPart@6631cb64; MDN=[[AS2MessageMDN@0x19962194: attributes=[{}]; headers=[HttpHeaderMap@0x481e91b6: Headers={connection=[close], set-cookie=[BIGipServerPreProd-Extranet-ESG3-4080=390638346.55315.0000; path=/, BIGipServerPreProd-Extranet-ESG3-5080=911321866.55315.0000; path=/]}]; partnership=[Partnership@0x3ee69ad8: name=auto-created-dummy; senderIDs=[{as2_id=null, x509_alias=FDA ESG Administrators}]; receiverIDs=[{as2_id=null, x509_alias=Cognizant.MedvantageFDA.net}]; attributes=[{}]]]; message=<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>; data=javax.mail.internet.MimeBodyPart@7c8f9c2e; text=null]],null)
[main] DEBUG com.helger.as2lib.processor.AbstractMessageProcessor - no modules found for 'storemdn'; modules are: [[[{}]], [[{connecttimeout=600000, readtimeout=600000}]]]
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - received MDN [null] [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] INFO com.helger.as2lib.processor.sender.AS2SenderModule - MIC IS NOT MATCHED, original mic: 'IpjGylckS2ovHgk995aA3SU2Jlw=, sha1' return mic: 'null' [<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>]
[main] INFO com.helger.as2lib.exception.OpenAS2Exception - OpenAS2 OpenAS2Exception terminated: Message was sent but an error occured while receiving the MDN; sources: {message=[AS2Message@0x772861aa: data=javax.mail.internet.MimeBodyPart@6631cb64; MDN=[[AS2MessageMDN@0x19962194: attributes=[{}]; headers=[HttpHeaderMap@0x481e91b6: Headers={connection=[close], set-cookie=[BIGipServerPreProd-Extranet-ESG3-4080=390638346.55315.0000; path=/, BIGipServerPreProd-Extranet-ESG3-5080=911321866.55315.0000; path=/]}]; partnership=[Partnership@0x3ee69ad8: name=auto-created-dummy; senderIDs=[{as2_id=null, x509_alias=FDA ESG Administrators}]; receiverIDs=[{as2_id=null, x509_alias=Cognizant.MedvantageFDA.net}]; attributes=[{}]]]; message=<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>; data=javax.mail.internet.MimeBodyPart@7c8f9c2e; text=null]]}
com.helger.as2lib.exception.OpenAS2Exception: Invalid disposition type format: null
at com.helger.as2lib.disposition.DispositionType.createFromString(DispositionType.java:151)
at com.helger.as2lib.processor.sender.AS2SenderModule.receiveSyncMDN(AS2SenderModule.java:589)
at com.helger.as2lib.processor.sender.AS2SenderModule._sendViaHTTP(AS2SenderModule.java:724)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:773)
at com.helger.as2lib.client.AS2Client.sendSynchronous(AS2Client.java:382)
at com.cts.as2client.JavaAS2Client.sendAS2Request(JavaAS2Client.java:290)
at com.cts.as2client.JavaAS2Client.sendFileToAS2Server(JavaAS2Client.java:170)
at com.cts.as2client.JavaAS2Client.main(JavaAS2Client.java:94)
[main] DEBUG com.helger.as2lib.client.AS2Client - Response retrieved:
OriginalMessageID: <JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>
Response received = { "mdnDisposition" : "NULL_RECD", "responseAsStringBase64" : "Ck9yaWdpbmFsTWVzc2FnZUlEOiA8SmF2YUFTMkNsaWVudF9waGF4QVMyTGliLTE3MDUyMDE4MDkxMjM0KzAwMDAtNTYxN0A3ODgxNTcxNTlfQ1RTX0FTMl9aWkZEQVRTVD4KU2VuZGluZyBkdXJhdGlvbjogUFQxLjkyMjI1MjRTCg==", "originalMessageID" : "<JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>", "mdnTextBase64" : "TlVMTF9SRUNE", "mdnMessageID" : "NULL_RECD" }
Response decoded =
OriginalMessageID: <JavaAS2Client_phaxAS2Lib-17052018091234+0000-5617@788157159_CTS_AS2_ZZFDATST>
Sending duration: PT1.9222524S
MDN Text decoded = NULL_RECD
Request your assistance in finding the possible mistake in the code.
Thanks.
I see as2 client support https but cannot find any api, please advise any example thanks
v2.2.8 - 2016-05-09
Improved AS2 client https customization and API
Based on as2-peppol-servlet a simple non-peppol servlet component should be extracted. It should handle incoming documents like the server does.
This servlet should than be used by as2-peppol-servlet as well....
Version: AS2-LIB 4.1.1-SNAPSHOT from 'master'
I'm sending (or at least trying to send) an encrypted and signed message while at the same time not requesting an MDN and (sort of consequently) not having an 'MDNOptions' on the partnership. From our documentation, it is a valid (albeit strange) test case.
Securing the message happens in handle()
in AS2SenderModule
// compress and/or sign and/or encrypt the message if needed
final MimeBodyPart aSecuredData = secure (aMsg);
// Calculate MIC after compress/sign/crypt was handled, because the
// message data might change if compression before signing is active.
final String sMIC = calculateAndStoreMIC (aMsg);
if (LOGGER.isDebugEnabled ())
LOGGER.debug ("Setting message content type to '" + aSecuredData.getContentType () + "'");
aMsg.setContentType (aSecuredData.getContentType ());
The securing part works and in the secure(aMsg)
the signing algorithm is taken from the partnership:
final String sSignAlgorithm = aPartnership.getSigningAlgorithm ();
After the signing the MIC is calculated and this part fails with the following exception
15:33:58.042 [main] ERROR com.helger.as2lib.client.AS2Client - Error sending AS2 message com.helger.as2lib.exception.WrappedOpenAS2Exception: java.lang.NullPointerException: The value of 'DigestAlgorithm' may not be null! at com.helger.as2lib.exception.WrappedOpenAS2Exception.wrap(WrappedOpenAS2Exception.java:66) ~[classes/:na] at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:810) ~[classes/:na] at com.helger.as2lib.client.AS2Client.sendSynchronous(AS2Client.java:388) ~[classes/:na] at com.descartes.as2.AS2ClientBuilder.sendSynchronous(AS2ClientBuilder.java:954) [classes/:na] at com.descartes.as2.MainAS2TestClient.main(MainAS2TestClient.java:193) [test-classes/:na] Caused by: java.lang.NullPointerException: The value of 'DigestAlgorithm' may not be null! at com.helger.commons.ValueEnforcer.notNull(ValueEnforcer.java:277) ~[ph-commons-9.1.3.jar:9.1.3] at com.helger.as2lib.crypto.BCCryptoHelper.calculateMIC(BCCryptoHelper.java:252) ~[classes/:na] at com.helger.as2lib.processor.sender.AS2SenderModule.calculateAndStoreMIC(AS2SenderModule.java:257) ~[classes/:na] at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:780) ~[classes/:na] ... 3 common frames omitted
The reason being that in protected String calculateAndStoreMIC (@Nonnull final AS2Message aMsg)
Disposition options (a string here!) are being parsed to a DispositionOptions object and from that the fist mic is read.
final String sDispositionOptions = aPartnership.getAS2MDNOptions ();
final DispositionOptions aDispositionOptions = DispositionOptions.createFromString (sDispositionOptions);
. . .
final String sMIC = AS2Helper.getCryptoHelper ().calculateMIC (aMsg.getData (),
aDispositionOptions.getFirstMICAlg (),
bIncludeHeadersInMIC); (sDispositionOptions);
It looks like this is a copy/paste from an MDN related method and since it is only used in the AS2SenderModule, I think
aDispositionOptions.getFirstMICAlg (),
should be replaced by
ECryptoAlgorithmSign.getFromIDOrThrow(aPartnership.getSigningAlgorithm()),
Or an assignment, a null check like for the encryption or...
It seems like com.helger.as2lib.client.AS2Client only support AS2 message sending using synchronize MDN mode (through sendSynchronous() method). Is it possible to use this client to send AS2 in Asynchronized MDN mode instead?
I tried to read the source code and seems like async or not was controlled by aPartnership.setAS2ReceiptOption ()... what value should be set for this option value in order to support async MDN? any other changes needed?
There are some issues with 1.52 and Java 8. I can do the upgrade myself if you're okay with that.
I have this setup
final AS2Session as2Session = new AS2Session();
as2Session.setCertificateFactory(new KeyStoreServiceCertificateFactory(keyStoreService));
as2Session.setPartnershipFactory(partnershipFactory);
DefaultMessageProcessor processor = new DefaultMessageProcessor();
processor.stopActiveModules();
processor.initDynamicComponent(as2Session, new StringMap());
ImmediateResenderModule resender = new ImmediateResenderModule();
resender.initDynamicComponent(as2Session, new StringMap());
processor.addModule(resender);
final AS2SenderModule aSender = new AS2SenderModule();
aSender.initDynamicComponent(as2Session, new StringMap());
processor.addModule(aSender);
as2Session.setMessageProcessor(processor);
processor.startActiveModules();
Furthermore (in a specific test) the partnership config specifies 3 retries; and I am sending to an URL where there is no(!) server listening (I was trying to verify that retries are working by delaying listener startup).
While working on that the test fails like this:
at com.helger.as2lib.processor.sender.AS2SenderModule._sendViaHTTP(AS2SenderModule.java:566)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:647)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.resender.ImmediateResenderModule.handle(ImmediateResenderModule.java:93)
at com.helger.as2lib.processor.DefaultMessageProcessor.handle(DefaultMessageProcessor.java:142)
at com.helger.as2lib.processor.sender.AbstractSenderModule.doResend(AbstractSenderModule.java:129)
at com.helger.as2lib.processor.sender.AS2SenderModule.handle(AS2SenderModule.java:664)
The lowest line is from the actual call to "send"; the chain of bouncing from resender -> message-processor -> sender -> ... gets longer.
This seems to be caused by AbstractSenderModule::getRetryCount
. The value passed via aOptions
is ignored if checking aPartnership
yields a result; I assume aOptions should
have priority, otherwise decrementing the counter in the resender module has no effect?
This seems to work for me:
List<Integer> retryValues = new ArrayList<>();
if (aPartnership != null)
{
// Get from partnership
final String sTriesLeft = aPartnership.getAttribute (IProcessorResenderModule.OPTION_RETRIES);
if (sTriesLeft != null) {
retryValues.add(Integer.parseInt(sTriesLeft));
}
}
if ((aOptions != null) && (aOptions.get(IProcessorResenderModule.OPTION_RETRIES) != null))
{
// Provided in the options?
final String sTriesLeft = (String) aOptions.get (IProcessorResenderModule.OPTION_RETRIES);
retryValues.add(Integer.parseInt(sTriesLeft));
}
final String fromAttr = getAttributeAsString(IProcessorResenderModule.OPTION_RETRIES);
if (fromAttr != null)
{
// No. Provided as an attribute?
retryValues.add(Integer.parseInt(fromAttr));
}
if (retryValues.isEmpty())
{
// Not provided. Use default.
return IProcessorResenderModule.DEFAULT_RETRIES;
}
// Avoid returning negative values
return retryValues.stream()
.filter((v) -> v >= 0)
.min(Comparator.naturalOrder()).orElse(0);
I've noticed that the SSL configuration in AbstractHttpSenderModule is insecure, in that it does not verify certificates or hostames (using DoNothingTrustManager and HostnameVerifierAlwaysTrue).
Moreover, there seem to be no obvious way to override these when used from AS2ClientBuilder / AS2Client, since AS2Client.sendSynchronous() does instantiate an insecure AS2SenderModule directly, without any factory or configuration point.
Is this by design? Would you accept a pull request that made the AS2SenderModule configurable?
Cheers
This is a question rather than an actual issue.
I have created a custom IPartnershipFactory
that stores partnerships in a MongoDB collection. (I could contribute the code if you're interested).
I have noticed that for a local station L and a remote station R, I need two partnerships, one with sender L and recipient R and one with the parameters exchanged.
I have implemented getPartnershipByID(IStringMap, IStringMap)
to use a reverse query and create the Partnership
object in the "wrong" direction. I wonder if that should be done somewhere within the library code. because the library knows whether the message is incoming or outgoing.
[2018-03-05T19:40:42,459] [ERB] [INFO ] [ajp-nio-127.0.0.1-8009-exec-21] OpenAS2 WrappedOpenAS2Exception terminated: java.lang.NullPointerException: The value of 'MimeBodyPart' may not be null!; sources: {message=[AS2Message@0x1e28fd3b: data=null; MDN=[[AS2MessageMDN@0x63825fb4: attributes=[{REPORTING_UA=ph-OpenAS2 [email protected]:443, ORIGINAL_RECIPIENT=rfc822; APP_1000000135, FINAL_RECIPIENT=rfc822; null, ORIGINAL_MESSAGE_ID=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>, DISPOSITION=automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error}]; headers=[HttpHeaderMap@0x27aafcdb: Headers={as2-to=[APP_1000000345], as2-from=[APP_1000000135], as2-version=[1.1], date=[Mo, 05 M?r 2018 20:40:42 +0100], server=[ph-OpenAS2 4.0.0], mime-version=[1.0], subject=[Your Requested MDN Response]}]; partnership=[Partnership@0x71f6a35c: name=APP_1000000135-APP_1000000345; senderIDs=[{as2_id=APP_1000000135, x509_alias=null}]; receiverIDs=[{as2_id=APP_1000000345, x509_alias=null}]; attributes=[{sign=sha-1}]]]; message=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>; data=null; text=The message sent to Recipient null on Mon, 05 Mar 2018 19:40:39 GMT with Subject AS2 message from Databutikken Access Point has been received, but an error occured while parsing the MIME content.]]} -- com.helger.as2lib.exception.OpenAS2Exception.log(OpenAS2Exception.java:108)
java.lang.NullPointerException: The value of 'MimeBodyPart' may not be null!
at com.helger.commons.ValueEnforcer.notNull(ValueEnforcer.java:276) ~[ph-commons-9.0.1.jar:9.0.1]
at com.helger.as2lib.crypto.BCCryptoHelper.calculateMIC(BCCryptoHelper.java:256) ~[as2-lib-4.0.0.jar:4.0.0]
at com.helger.as2lib.util.AS2Helper.createMDN(AS2Helper.java:304) ~[as2-lib-4.0.0.jar:4.0.0]
at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.sendSyncMDN(AS2ReceiverHandler.java:270) [as2-lib-4.0.0.jar:4.0.0]
at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.handleIncomingMessage(AS2ReceiverHandler.java:536) [as2-lib-4.0.0.jar:4.0.0]
at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.handeIncomingMessage(AbstractAS2ReceiveXServletHandler.java:162) [as2-servlet-4.0.0.jar:4.0.0]
at at.gv.brz.erb.webapp.servlet.ERBAS2ReceiveXServletHandler.handeIncomingMessage(ERBAS2ReceiveXServletHandler.java:81) [classes/:5.0.6]
at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.onRequest(AbstractAS2ReceiveXServletHandler.java:198) [as2-servlet-4.0.0.jar:4.0.0]
at com.helger.xservlet.AbstractXServlet._invokeHandler(AbstractXServlet.java:336) [ph-xservlet-9.0.0.jar:9.0.0]
at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:520) [ph-xservlet-9.0.0.jar:9.0.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at com.helger.servlet.filter.CharacterEncodingFilter.doHttpFilter(CharacterEncodingFilter.java:183) [ph-servlet-9.0.0.jar:9.0.0]
at com.helger.servlet.filter.AbstractHttpServletFilter.doFilter(AbstractHttpServletFilter.java:66) [ph-servlet-9.0.0.jar:9.0.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.10.0.jar:2.10.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.46]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.46]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.46]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) [catalina.jar:8.0.46]
at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:877) [tomcat-coyote.jar:8.0.46]
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) [tomcat-coyote.jar:8.0.46]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539) [tomcat-coyote.jar:8.0.46]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495) [tomcat-coyote.jar:8.0.46]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.46]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]
[2018-03-05T19:40:42,470] [ERB] [INFO ] [ajp-nio-127.0.0.1-8009-exec-21] OpenAS2 DispositionException terminated: automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error; sources: {message=[AS2Message@0x1e28fd3b: data=null; MDN=[[AS2MessageMDN@0x63825fb4: attributes=[{REPORTING_UA=ph-OpenAS2 [email protected]:443, ORIGINAL_RECIPIENT=rfc822; APP_1000000135, FINAL_RECIPIENT=rfc822; null, ORIGINAL_MESSAGE_ID=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>, DISPOSITION=automatic-action/MDN-sent-automatically; processed/Error:unexpected-processing-error}]; headers=[HttpHeaderMap@0x27aafcdb: Headers={as2-to=[APP_1000000345], as2-from=[APP_1000000135], as2-version=[1.1], date=[Mo, 05 M?r 2018 20:40:42 +0100], server=[ph-OpenAS2 4.0.0], mime-version=[1.0], subject=[Your Requested MDN Response]}]; partnership=[Partnership@0x71f6a35c: name=APP_1000000135-APP_1000000345; senderIDs=[{as2_id=APP_1000000135, x509_alias=null}]; receiverIDs=[{as2_id=APP_1000000345, x509_alias=null}]; attributes=[{sign=sha-1}]]]; message=<EIZMU89AT3U4.0M6F7Q1U6K1X1@NikolayPC>; data=null; text=The message sent to Recipient null on Mon, 05 Mar 2018 19:40:39 GMT with Subject AS2 message from Databutikken Access Point has been received, but an error occured while parsing the MIME content.]]} -- com.helger.as2lib.exception.OpenAS2Exception.log(OpenAS2Exception.java:108)
javax.mail.internet.ParseException: In Content-Type string <null>, expected MIME type, got null
at javax.mail.internet.ContentType.<init>(ContentType.java:97) ~[javax.mail-1.6.0.jar:1.6.0]
at com.helger.as2lib.processor.receiver.net.AS2ReceiverHandler.handleIncomingMessage(AS2ReceiverHandler.java:362) [as2-lib-4.0.0.jar:4.0.0]
at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.handeIncomingMessage(AbstractAS2ReceiveXServletHandler.java:162) [as2-servlet-4.0.0.jar:4.0.0]
at at.gv.brz.erb.webapp.servlet.ERBAS2ReceiveXServletHandler.handeIncomingMessage(ERBAS2ReceiveXServletHandler.java:81) [classes/:5.0.6]
at com.helger.as2servlet.AbstractAS2ReceiveXServletHandler.onRequest(AbstractAS2ReceiveXServletHandler.java:198) [as2-servlet-4.0.0.jar:4.0.0]
at com.helger.xservlet.AbstractXServlet._invokeHandler(AbstractXServlet.java:336) [ph-xservlet-9.0.0.jar:9.0.0]
at com.helger.xservlet.AbstractXServlet.service(AbstractXServlet.java:520) [ph-xservlet-9.0.0.jar:9.0.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at com.helger.servlet.filter.CharacterEncodingFilter.doHttpFilter(CharacterEncodingFilter.java:183) [ph-servlet-9.0.0.jar:9.0.0]
at com.helger.servlet.filter.AbstractHttpServletFilter.doFilter(AbstractHttpServletFilter.java:66) [ph-servlet-9.0.0.jar:9.0.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.10.0.jar:2.10.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [catalina.jar:8.0.46]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.46]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.46]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) [catalina.jar:8.0.46]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.46]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) [catalina.jar:8.0.46]
at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:877) [tomcat-coyote.jar:8.0.46]
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) [tomcat-coyote.jar:8.0.46]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539) [tomcat-coyote.jar:8.0.46]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495) [tomcat-coyote.jar:8.0.46]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.46]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]
Hi Philip,
When called with empty string (""), it returns null. Everything works fine, the issue is there are some IDEs that insert code that checks that annotation, and generates exception.
Thanks,
Ziv
Currently, there's only a getter for the receiver e-mail.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.