È possibile iscriversi per conto se è nota solo la chiave pubblica del client?

0

Ho il seguente scenario: ho molti dispositivi embedded che dovrebbero parlare con un altro. Per abilitare la fiducia tra questi dispositivi vorrei utilizzare i certificati. I dispositivi generano una coppia di chiavi e inviano la chiave pubblica a un'istanza centrale che dovrebbe agire come agente di registrazione, richiedere il certificato corrispondente per la chiave pubblica dalla CA e inviarlo al client.

A mia comprensione limitata dovrebbe essere possibile richiedere un certificato per un altro utente / macchina se

a) Sono in possesso di un certificato di agente di registrazione, con il quale firmo la richiesta

b) Ho la chiave pubblica che dovrebbe essere certificata dalla CA.

Sfortunatamente tutto ciò che ho trovato durante la mia ricerca negli ultimi giorni non sembra possibile. Qualcuno con una comprensione più profonda di me può far luce su questo?

Modifica

Per rendere più chiaro ciò che voglio ottenere e ancora non so se è possibile, ecco i passaggi:

  1. Il dispositivo crea una coppia di tasti
  2. Il dispositivo invia la chiave pubblica di questa coppia a una macchina che funge da agente di registrazione (protetto da OTP)
  3. La macchina, che funge da agente di registrazione, crea un csr per il dispositivo contenente la chiave pubblica e lo firma con l'iscrizione certificato dell'agente.
  4. La macchina invia csr all'AR e consegna il certificato risultante al dispositivo.

Spero che questo chiarisca un po 'le cose.

La prima cosa che ho cercato è stata l'automazione del processo utilizzando certreq, in particolare certreq -new . Non vedo alcuna opzione per fornire la chiave pubblica del dispositivo alla richiesta.

Poi ho esaminato l'esempio Creazione di una richiesta CMC con firma agente (Single Signer) , ma non riesco a vedere dove viene inserita la chiave pubblica del dispositivo nella richiesta.

Essendo più familiare con il linguaggio Java, ho anche cercato in alcuni esempi di utilizzare l'API di bouncycastle. Tutti hanno utilizzato la chiave privata corrispondente alla chiave pubblica del dispositivo per firmare la richiesta, non il certificato dell'agente di registrazione.

So che quanto sopra è un caso comune per le smartcard, ma non riesco a trovare come è fatto.

    
posta Frank 20.10.2016 - 08:31
fonte

1 risposta

0

Ok, dopo un po 'di difficoltà ho scoperto che questo è possibile usando CMP. Sfortunatamente la CA Microsoft che ho usato all'inizio sembra ignorare alcuni standard, quindi non ho potuto farlo funzionare.

L'utilizzo di EJBCA ha fatto il trucco. Sono stato in grado di fare esattamente quello che voglio seguendo i frammenti di codice nella documentazione. L'impostazione del flag ProofOpPossession su RAVerified ha consentito di ottenere il comportamento desiderato. Ecco un codesnippet che utilizza la libreria 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();
    
risposta data 21.12.2016 - 09:53
fonte

Leggi altre domande sui tag