Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Soporte para versiones modulares de Java #13

Open
dschulz opened this issue Jul 27, 2022 · 3 comments
Open

Soporte para versiones modulares de Java #13

dschulz opened this issue Jul 27, 2022 · 3 comments
Assignees
Labels
enhancement New feature or request

Comments

@dschulz
Copy link

dschulz commented Jul 27, 2022

Hola! Estoy haciendo experimentos con rshk-jsifenlib. Mi objetivo es usar en una aplicación modular con JavaFX y versiones modernas de Java. Para que eso funcione sin atar cosas con alambre es deseable que la librería

  1. tenga un descriptor de módulo
  2. declare dependencias para APIs que ya no existen en el JDK (JAX-WS, SOAP, JAXB)
  3. reemplazar código que usa APIs que, aunque todavía están presentes en JDKs nuevos, no son exportadas hacia otros módulos por defecto

(1) se soluciona agregando un module-info.java al directorio raíz de código fuente ("default package") .
Mas o menos parecido a esto:

module RshkJsifenlib {

    requires java.base;
    requires java.logging;
    requires jakarta.xml.ws;
    requires jakarta.xml.soap;
    requires java.xml.crypto;
    requires java.xml.soap;
    requires java.xml;
    requires jakarta.activation;
    
    exports com.roshka.sifen;
    exports com.roshka.sifen.core;
}

(2) se puede satisfacer a Gradle agregando esto a build.gradle:

    ...   
    implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.0'
    implementation 'jakarta.xml.ws:jakarta.xml.ws-api:4.0.0'
    implementation 'com.sun.xml.ws:jaxws-rt:4.0.0'
    implementation 'javax.xml.soap:javax.xml.soap-api:1.4.0'
    implementation 'com.sun.activation:javax.activation:1.2.0'
    ...

(3) es la parte mbore, ya que la clase com.roshka.sifen.internal.helpers.SignatureHelper usa clases del package sun.security.x509, que son internas y por defecto no se pueden usar salvo que el JVM se inicie con --add-exports java.base/sun.security.x509=ALL-UNNAMED.
Por suerte, aparentemente hay un solo método que usa las clases sun.security.x509.{X509CertImpl, GeneralName, X500Name} y posiblemente se puede modificar para que funcione sin usar dependencias externas.

El método en cuestión en com.roshka.sifen.internal.helpers.SignatureHelper reescrito (compila ok pero sin probar -- puede necesitar ajuste):

        private static List<ValidezFirmaDigital.SujetoCertificado> getCertificateSubjects(KeyInfo keyInfo) {
        List<ValidezFirmaDigital.SujetoCertificado> certificateSubjects = new ArrayList<>();

        // Get certificate from Electronic Document
        X509Certificate certificate =   X509KeySelector.getCertificate(keyInfo);
        if (certificate == null) return certificateSubjects;

        // Obtener subject principal del certificado
        try {
            String subject = certificate.getIssuerX500Principal().getName();

            certificateSubjects.add(ValidezFirmaDigital.SujetoCertificado.create(
                    getAttributeFromSubject(subject, "SERIALNUMBER"),
                    SifenUtil.coalesce(getAttributeFromSubject(subject, "CN"), getAttributeFromSubject(subject, "O"))
            ));
        } catch (Exception ignored) {
        }

        // Obtener SANs desde el certificado, si existen
        try {
            
            final Collection<List<?>> sans = certificate.getSubjectAlternativeNames(); 
            
            String altNameStr = null;
            
            if(sans != null){
                for(final List<?> san : sans){
                   if((Integer) san.get(0) == 1) // name segun rfc822
                      altNameStr = (String) san.get(1);
                   certificateSubjects.add(ValidezFirmaDigital.SujetoCertificado.create(
                        getAttributeFromSubject(altNameStr, "SERIALNUMBER"),
                        SifenUtil.coalesce(getAttributeFromSubject(altNameStr, "CN"), getAttributeFromSubject(altNameStr, "O"))
                ));
                   
                }
            }
            
        } catch (Exception ignored) {
        }

        return certificateSubjects;
    }

Les parece razonable tener una rama dedicada para este caso de uso?

Saludos!

@dschulz
Copy link
Author

dschulz commented Jul 27, 2022

Los cambios sugeridos están en la rama "jdk11" en mi fork.

Un gradle scan está acá. (gradle build -x test -x javadoc --scan)

Lo que no pude hacer hasta ahora es testear los cambios.

@martinzarza
Copy link
Contributor

Te agradezco mucho tu aporte @dschulz. Me parece muy útil e interesante, así que voy a estar creando un branch en nuestro proyecto con los cambios de tu branch para comparar las modificaciones y realizar las pruebas que faltan.

@martinzarza martinzarza added the enhancement New feature or request label Jul 27, 2022
@martinzarza martinzarza self-assigned this Jul 27, 2022
@pablo
Copy link
Collaborator

pablo commented Apr 11, 2023

Hola Diego! Realmente no tuvimos tiempo de ponernos al día. La versión 0.5.0 que sale en este mes, va a tener soporte para Java 11 y superior. El soporte para Java 8 va a quedar exclusivamente en la rama 0.2.x.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants