This is an automated email from the ASF dual-hosted git repository.

exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 481046f  NIFI-8286 Extended CertificateUtils to allow parsing of CNs 
conforming to RFC5280
481046f is described below

commit 481046f5be89831517952d1d930a189a8425cfe4
Author: Janosch Woschitz <[email protected]>
AuthorDate: Tue Mar 2 17:18:54 2021 +0100

    NIFI-8286 Extended CertificateUtils to allow parsing of CNs conforming to 
RFC5280
    
    This closes #4866
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../apache/nifi/security/util/CertificateUtils.java | 21 +++++++++++++++++++++
 .../nifi/security/util/CertificateUtilsTest.groovy  |  9 +++++++++
 2 files changed, 30 insertions(+)

diff --git 
a/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/CertificateUtils.java
 
b/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/CertificateUtils.java
index 0e4d387..2f2ec87 100644
--- 
a/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/CertificateUtils.java
+++ 
b/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/CertificateUtils.java
@@ -149,6 +149,27 @@ public final class CertificateUtils {
                     username = StringUtils.substring(dn, cnIndex + 
cnPattern.length());
                 }
             }
+
+            /*
+                https://tools.ietf.org/html/rfc5280#section-4.1.2.6
+
+                Legacy implementations exist where an electronic mail address 
is
+                embedded in the subject distinguished name as an emailAddress
+                attribute [RFC2985].  The attribute value for emailAddress is 
of type
+                IA5String to permit inclusion of the character '@', which is 
not part
+                of the PrintableString character set.  emailAddress attribute 
values
+                are not case-sensitive (e.g., "[email protected]" is the 
same as
+                "[email protected]").
+             */
+            final String emailPattern = "/emailAddress=";
+            final int index = StringUtils.indexOfIgnoreCase(username, 
emailPattern);
+            if (index >= 0) {
+                String[] dnParts = username.split(emailPattern);
+                if (dnParts.length > 0) {
+                    // only use the actual CN
+                    username = dnParts[0];
+                }
+            }
         }
 
         return username;
diff --git 
a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy
 
b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy
index 03ab118..6155a9a 100644
--- 
a/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy
+++ 
b/nifi-commons/nifi-security-utils/src/test/groovy/org/apache/nifi/security/util/CertificateUtilsTest.groovy
@@ -60,6 +60,7 @@ import java.util.concurrent.Future
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.atomic.AtomicBoolean
 
+import static org.junit.Assert.assertEquals
 import static org.junit.Assert.assertTrue
 
 @RunWith(JUnit4.class)
@@ -75,6 +76,7 @@ class CertificateUtilsTest extends GroovyTestCase {
     private static final String PROVIDER = "BC"
 
     private static final String SUBJECT_DN = "CN=NiFi Test 
Server,OU=Security,O=Apache,ST=CA,C=US"
+    private static final String SUBJECT_DN_LEGACY_EMAIL_ATTR_RFC2985 = 
"CN=NiFi Test 
Server/[email protected],OU=Security,O=Apache,ST=CA,C=US"
     private static final String ISSUER_DN = "CN=NiFi Test 
CA,OU=Security,O=Apache,ST=CA,C=US"
     private static final List<String> SUBJECT_ALT_NAMES = ["127.0.0.1", 
"nifi.nifi.apache.org"]
 
@@ -647,6 +649,13 @@ class CertificateUtilsTest extends GroovyTestCase {
         assert(extensions.equivalent(sanExtensions))
     }
 
+    @Test
+    void testExtractUserNameFromDN() {
+        String expected = "NiFi Test Server"
+        assertEquals(CertificateUtils.extractUsername(SUBJECT_DN), expected)
+        
assertEquals(CertificateUtils.extractUsername(SUBJECT_DN_LEGACY_EMAIL_ATTR_RFC2985),
 expected)
+    }
+
     // Using this directly from tls-toolkit results in a dependency loop, so 
it's added here for testing purposes.
     private static Extensions 
createDomainAlternativeNamesExtensions(List<String> domainAlternativeNames, 
String requestedDn) throws IOException {
         List<GeneralName> namesList = new ArrayList<>()

Reply via email to