Java tutorial
//package com.java2s; /* Copyright (C) 2011 [Gobierno de Espana] * This file is part of "Cliente @Firma". * "Cliente @Firma" is free software; you can redistribute it and/or modify it under the terms of: * - the GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. * - or The European Software License; either version 1.1 or (at your option) any later version. * Date: 11/01/11 * You may contact the copyright holder at: soporte.afirma5@mpt.es */ import java.security.cert.X509Certificate; import java.util.Locale; import java.util.logging.Logger; public class Main { private static final Logger LOGGER = Logger.getLogger("es.gob.afirma"); /** Obtiene el nombre común (Common Name, CN) del titular de un * certificado X.509. Si no se encuentra el CN, se devuelve la unidad organizativa * (Organization Unit, OU). * @param c * Certificado X.509 del cual queremos obtener el nombre * común * @return Nombre común (Common Name, CN) del titular de un * certificado X.509 */ public static String getCN(final X509Certificate c) { if (c == null) { return null; } return getCN(c.getSubjectX500Principal().toString()); } /** Obtiene el nombre común (Common Name, CN) de un <i>Principal</i> * X.400. Si no se encuentra el CN, se devuelve la unidad organizativa * (Organization Unit, OU). * @param principal * <i>Principal</i> del cual queremos obtener el nombre * común * @return Nombre común (Common Name, CN) de un <i>Principal</i> * X.400 */ public static String getCN(final String principal) { if (principal == null) { return null; } String rdn = getRDNvalueFromLdapName("cn", principal); //$NON-NLS-1$ if (rdn == null) { rdn = getRDNvalueFromLdapName("ou", principal); //$NON-NLS-1$ } if (rdn != null) { return rdn; } final int i = principal.indexOf('='); if (i != -1) { LOGGER.warning( "No se ha podido obtener el Common Name ni la Organizational Unit, se devolvera el fragmento mas significativo"); //$NON-NLS-1$ return getRDNvalueFromLdapName(principal.substring(0, i), principal); } LOGGER.warning("Principal no valido, se devolvera la entrada"); //$NON-NLS-1$ return principal; } /** Recupera el valor de un RDN (<i>Relative Distinguished Name</i>) de un principal. El valor de retorno no incluye * el nombre del RDN, el igual, ni las posibles comillas que envuelvan el valor. * La función no es sensible a la capitalización del RDN. Si no se * encuentra, se devuelve {@code null}. * @param rdn RDN que deseamos encontrar. * @param principal Principal del que extraer el RDN (según la <a href="http://www.ietf.org/rfc/rfc4514.txt">RFC 4514</a>). * @return Valor del RDN indicado o {@code null} si no se encuentra. */ public static String getRDNvalueFromLdapName(final String rdn, final String principal) { int offset1 = 0; while ((offset1 = principal.toLowerCase(Locale.US).indexOf(rdn.toLowerCase(), offset1)) != -1) { if (offset1 > 0 && principal.charAt(offset1 - 1) != ',' && principal.charAt(offset1 - 1) != ' ') { offset1++; continue; } offset1 += rdn.length(); while (offset1 < principal.length() && principal.charAt(offset1) == ' ') { offset1++; } if (offset1 >= principal.length()) { return null; } if (principal.charAt(offset1) != '=') { continue; } offset1++; while (offset1 < principal.length() && principal.charAt(offset1) == ' ') { offset1++; } if (offset1 >= principal.length()) { return ""; //$NON-NLS-1$ } int offset2; if (principal.charAt(offset1) == ',') { return ""; //$NON-NLS-1$ } else if (principal.charAt(offset1) == '"') { offset1++; if (offset1 >= principal.length()) { return ""; //$NON-NLS-1$ } offset2 = principal.indexOf('"', offset1); if (offset2 == offset1) { return ""; //$NON-NLS-1$ } else if (offset2 != -1) { return principal.substring(offset1, offset2); } else { return principal.substring(offset1); } } else { offset2 = principal.indexOf(',', offset1); if (offset2 != -1) { return principal.substring(offset1, offset2).trim(); } return principal.substring(offset1).trim(); } } return null; } }