Skip to content

Commit f861cfb

Browse files
committed
CYBS-737: Covered few more cases
1 parent 5f67a84 commit f861cfb

2 files changed

Lines changed: 37 additions & 13 deletions

File tree

java/src/main/java/com/cybersource/ws/client/Identity.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public class Identity {
4141

4242
private static final String SERVER_ALIAS = "CyberSource_SJC_US";
4343

44+
private static final String CYBS_CERT_AUTH = "CyberSourceCertAuth";
45+
4446
private char[] pswd;
4547

4648
/**
@@ -67,11 +69,12 @@ private void setupJdkServerCerts() throws SignException {
6769
String subjectDN = x509Cert.getSubjectDN().getName();
6870
if (subjectDN != null) {
6971
String subjectDNrray[] = subjectDN.split("SERIALNUMBER=");
70-
if (subjectDNrray.length == 1 && subjectDNrray[0].toLowerCase().contains("CyberSourceCertAuth".toLowerCase())){
71-
name = keyAlias = "CyberSourceCertAuth";
72+
if (subjectDNrray.length == 1 && subjectDNrray[0].toLowerCase().contains(CYBS_CERT_AUTH.toLowerCase())){
73+
name = keyAlias = subjectDNrray[0].split("=")[1];
7274
}
7375
else if (subjectDNrray.length == 2 && subjectDNrray[1].toLowerCase().contains(SERVER_ALIAS.toLowerCase())) {
74-
name = SERVER_ALIAS;
76+
String subjectDName = subjectDNrray[0].split("=")[1];
77+
name = subjectDName.substring(0, subjectDName.length()-1);
7578
serialNumber = subjectDNrray[1];
7679
keyAlias = "serialNumber=" + serialNumber + ",CN=" + name;
7780
}else{
@@ -148,11 +151,12 @@ private void setUpServer() throws SignException {
148151
String subjectDN = x509Cert.getSubjectDN().getName();
149152
if (subjectDN != null) {
150153
String[] subjectDNrray = subjectDN.split("SERIALNUMBER=");
151-
if (subjectDNrray.length == 1 && subjectDNrray[0].toLowerCase().contains("CyberSourceCertAuth".toLowerCase())){
152-
name = keyAlias = "CyberSourceCertAuth";
154+
if (subjectDNrray.length == 1 && subjectDNrray[0].toLowerCase().contains(CYBS_CERT_AUTH.toLowerCase())){
155+
name = keyAlias = subjectDNrray[0].split("=")[1];
153156
}
154157
else if (subjectDNrray.length == 2 && subjectDNrray[0].toLowerCase().contains(SERVER_ALIAS.toLowerCase())) {
155-
name = SERVER_ALIAS;
158+
String subjectDName = subjectDNrray[0].split("=")[1];
159+
name = subjectDName.substring(0, subjectDName.length()-1);
156160
serialNumber = subjectDNrray[1];
157161
keyAlias = "serialNumber=" + serialNumber + ",CN=" + name;
158162
}else{

java/src/main/java/com/cybersource/ws/client/SecurityUtil.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.cybersource.ws.client;
22

3+
import org.apache.commons.lang3.StringUtils;
34
import org.apache.ws.security.WSConstants;
45
import org.apache.ws.security.WSEncryptionPart;
56
import org.apache.ws.security.WSSecurityException;
@@ -36,7 +37,7 @@ public class SecurityUtil {
3637
private static MessageHandlerKeyStore localKeyStoreHandler = null;
3738

3839
//mapping between IdentityName and Identity
39-
private static ConcurrentHashMap<String, Identity> identities = new ConcurrentHashMap<String, Identity>();
40+
private static ConcurrentHashMap<String, Identity> identities = new ConcurrentHashMap<>();
4041

4142
// By default signature algorithm is set to null and during WSSecSignature build() Signature algorithm will set to "http://www.w3.org/2000/09/xmldsig#rsa-sha1" .
4243
private static final String SIGNATURE_ALGORITHM = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
@@ -147,7 +148,7 @@ private static void readAndStoreCertificateAndPrivateKey(MerchantConfig merchant
147148
while (enumKeyStore.hasMoreElements()) {
148149
KeyStore.PrivateKeyEntry keyEntry = null;
149150
merchantKeyAlias = (String) enumKeyStore.nextElement();
150-
if (merchantKeyAlias.toLowerCase().contains(merchantConfig.getKeyAlias().toLowerCase())){
151+
if (merchantKeyAlias.contains(merchantConfig.getKeyAlias())){
151152
try {
152153
keyEntry = (KeyStore.PrivateKeyEntry) merchantKeyStore.getEntry
153154
(merchantKeyAlias, new KeyStore.PasswordProtection(merchantConfig.getKeyPassword().toCharArray()));
@@ -202,8 +203,8 @@ public static Document handleMessageCreation(Document signedDoc, String merchant
202203
WSSecEncrypt encrBuilder = new WSSecEncrypt();
203204
//Set the user name to get the encryption certificate.
204205
//The public key of this certificate is used, thus no password necessary. The user name is a keystore alias usually.
205-
encrBuilder.setUserInfo(identities.get(SERVER_ALIAS).getKeyAlias());
206-
206+
String serverAlias = getServerAlias();
207+
encrBuilder.setUserInfo(identities.get(serverAlias).getKeyAlias());
207208
/*This is to reference a public key or certificate when signing or encrypting a SOAP message.
208209
*The following valid values for these configuration items are:
209210
*IssuerSerial (default),DirectReference[BST],X509KeyIdentifier,Thumbprint,SKIKeyIdentifier,KeyValue (signature only),EncryptedKeySHA1 (encryption only)
@@ -228,8 +229,8 @@ public static Document handleMessageCreation(Document signedDoc, String merchant
228229
// encrypted using the public key of the receiver
229230
signedEncryptedDoc = encrBuilder.build(signedDoc, localKeyStoreHandler, secHeader);
230231
} catch (WSSecurityException e) {
231-
logger.log(Logger.LT_EXCEPTION, "Failed while encrypting signed requeest for , '" + merchantId + "'" + " with " + SERVER_ALIAS);
232-
throw new SignEncryptException("Failed while encrypting signed requeest for , '" + merchantId + "'" + " with " + SERVER_ALIAS, e);
232+
logger.log(Logger.LT_EXCEPTION, "Failed while encrypting signed requeest for , '" + merchantId + "'" + " with " + serverAlias);
233+
throw new SignEncryptException("Failed while encrypting signed requeest for , '" + merchantId + "'" + " with " + serverAlias, e);
233234
}
234235
encrBuilder.prependToHeader(secHeader);
235236
return signedEncryptedDoc;
@@ -384,7 +385,7 @@ private static void loadJavaKeystore(MerchantConfig merchantConfig, Logger logge
384385
identities.put(identity.getName(), identity);
385386
}
386387
}
387-
java.security.cert.Certificate serverCert = keystore.getCertificate(SERVER_ALIAS);
388+
java.security.cert.Certificate serverCert = keystore.getCertificate(getServerAlias());
388389
if (serverCert == null) {
389390
throw new SignException("Missing Server Certificate ");
390391
}
@@ -421,4 +422,23 @@ private static void loadJavaKeystore(MerchantConfig merchantConfig, Logger logge
421422
}
422423

423424
}
425+
426+
private static String getServerAlias() {
427+
String serverAlias = SERVER_ALIAS;
428+
if(!identities.containsKey(serverAlias)) {
429+
if(identities.containsKey(serverAlias.toLowerCase())) {
430+
serverAlias = serverAlias.toLowerCase();
431+
} else if(identities.containsKey(serverAlias.toUpperCase())) {
432+
serverAlias = serverAlias.toUpperCase();
433+
} else {
434+
for(String identityKey :identities.keySet()) {
435+
if(identityKey.equalsIgnoreCase(serverAlias)) {
436+
serverAlias = identityKey;
437+
break;
438+
}
439+
}
440+
}
441+
}
442+
return serverAlias;
443+
}
424444
}

0 commit comments

Comments
 (0)