¿Es posible inscribirse en nombre si solo se conoce la clave pública del cliente?

0

Tengo el siguiente escenario: tengo muchos dispositivos integrados que deberían hablar con otro. Para habilitar la confianza entre estos dispositivos, me gustaría usar certificados. Los dispositivos generan un par de llaves y envían la clave pública a una instancia central que debe actuar como agente de inscripción, solicita el certificado correspondiente a la clave pública de la CA y lo envía de vuelta al cliente.

Según mi entendimiento limitado, debería ser posible solicitar un certificado para otro usuario / máquina si

a) Estoy en posesión de un certificado de agente de inscripción, con el que firmo la solicitud

b) Tengo la clave pública que debería estar certificada por la CA.

Lamentablemente, todo lo que encontré durante mi investigación en los últimos días no parece ser posible. ¿Alguien con una comprensión más profunda que yo, por favor arroje algo de luz sobre esto?

EDIT

Para aclarar lo que quiero lograr y aún no saber si es posible, aquí están los pasos:

  1. El dispositivo crea un par de llaves
  2. El dispositivo envía la clave pública de este par a una máquina que actúa como un agente de inscripción (protegido por OTP)
  3. La máquina, que actúa como agente de inscripción, crea un csr para el Dispositivo que contiene la clave pública y lo firma con la inscripción. certificado de agente.
  4. La máquina envía el csr a la RA y entrega el certificado resultante al dispositivo.

Espero que esto aclare un poco las cosas.

Lo primero que investigué fue la automatización del proceso usando certreq, especialmente certreq -new . No veo ninguna opción para proporcionar la clave pública del dispositivo a la solicitud.

Luego miré el ejemplo en Creación de una solicitud de CMC firmada por un agente de inscripción (Firmante único) , pero no puedo ver dónde ingresa la clave pública del dispositivo en la solicitud.

Como estoy más familiarizado con el lenguaje Java, también busqué en algunos ejemplos utilizando la API bouncycastle. Todos ellos utilizaron la clave privada correspondiente a la clave pública del dispositivo para firmar la solicitud, no el certificado del agente de inscripción.

Sé que lo anterior es un caso de uso común para tarjetas inteligentes, pero no encuentro cómo se hace.

    
pregunta Frank 20.10.2016 - 08:31
fuente

1 respuesta

0

Bien, después de algunos problemas encontré que esto es posible usando CMP. Desafortunadamente, el Microsoft CA que usé al principio parece ignorar algunos estándares, así que no lo hice funcionar.

El uso de EJBCA hizo el truco. Pude hacer exactamente lo que quiero siguiendo los fragmentos de código en la documentación. El solo hecho de establecer la marca ProofOfPossession en RAVerified ayudó a lograr el comportamiento deseado. Aquí hay un codenippet usando la biblioteca de bouncycastle:

    CertificateRequestMessageBuilder msgbuilder = new CertificateRequestMessageBuilder(certReqId);
    X500Name issuerDN = new X500Name(issuerDNString);
    X500Name subjectDN = new X500Name(subjectDNString);
    msgbuilder.setIssuer(issuerDN);
    msgbuilder.setSubject(subjectDN);
    final byte[] bytes = keyPair.getPublic().getEncoded();
    System.out.println(Base64.getEncoder().encodeToString(bytes));
    final ByteArrayInputStream bIn = new ByteArrayInputStream(bytes);
    final ASN1InputStream dIn = new ASN1InputStream(bIn);
    final SubjectPublicKeyInfo keyInfo = SubjectPublicKeyInfo.getInstance((ASN1Sequence) dIn.readObject());
    dIn.close();
    msgbuilder.setPublicKey(keyInfo);
    GeneralName sender = new GeneralName(subjectDN);
    msgbuilder.setAuthInfoSender(sender);
    // RAVerified POP
    msgbuilder.setProofOfPossessionRaVerified();
    
respondido por el Frank 21.12.2016 - 09:53
fuente

Lea otras preguntas en las etiquetas