2009-05-01 13 views
12

Sto provando a utilizzare la classe HttpListener in un'applicazione C# per fare in modo che un mini server web serva il contenuto su SSL. Per fare questo ho bisogno di utilizzare lo strumento httpcfg. Ho un file .pfx con la mia coppia di chiavi pubbliche e private. Se impongo manualmente questa coppia di chiavi usando mmc nell'archivio locale, tutto funziona correttamente. Tuttavia, se imposto questa coppia di chiavi a livello di codice utilizzando la classe X509Store, non riesco a collegarmi al mio mini server web. Si noti che in entrambi i metodi il certificato viene importato nell'archivio MY in LocalMachine. Stranamente, sono in grado di visualizzare il certificato in mmc dopo averlo importato a livello di codice e quando lo visualizzo, l'interfaccia utente indica che è disponibile anche una chiave privata per questo certificato.Importazione certificato con chiave privata programmaticamente

Scavando un po 'più a fondo, mi accorgo che quando imposto manualmente la coppia di chiavi, posso vedere un nuovo file visualizzato in C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys, ma uno non viene visualizzato durante l'importazione programmatica. In una nota correlata, quando elimino un certificato importato manualmente, non rimuove il file della chiave privata corrispondente dalla directory menzionata in precedenza.

In definitiva, la mia domanda è questa: quando aggiungo il certificato al negozio, dove viene archiviata la chiave privata e perché non è accessibile alla classe HttpListener (HttpApi)?

Si noti che questa domanda è un po 'legato, ma non credo che permissioning è il problema dal momento che questo è tutto stato fatto come lo stesso utente di Windows: How to set read permission on the private key file of X.509 certificate from .NET

risposta

28

Ok, l'ho capito. Ha a che fare con i parametri di archiviazione delle chiavi per l'oggetto certificato. Per chiunque altro incontri questo problema, assicurati di costruire gli oggetti X509Certificate2 che stai aggiungendo allo store usando i flag X509KeyStorageFlags.PersistKeySet e X509KeyStorageFlags.MachineKeySet. Ciò imporrà la chiave privata a persistere nella posizione del set di chiavi della macchina richiesta da HttpApi (HttpListener esegue il wrapping di questo).

+0

Si prega di contrassegnare questa come risposta – Developer

+0

Purtroppo devo aspettare 48 ore prima di poterlo fare a quel punto, probabilmente mi dimenticherò di farlo. :( – Jason

+6

Ho perso circa 30 minuti cercando di capire perché "X509KeyStorageFlags.MachineKeySet & X509KeyStorageFlags.PersistKeySet" non funzionava. Ovviamente, dovrebbe essere "X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet." Abbastanza ovvio, nel caso in cui qualcun altro prova la stessa stupida cosa che ho fatto. –

0

E' questo uno SSL 2 modo? In caso affermativo, hai inviato un file di richiesta certificato SSL generato sul tuo computer? Questo file di richiesta certificato verrà utilizzato per creare SSL e insieme formano una coppia di chiavi pubblica privata.

Hai provato anche ad assegnare l'autorizzazione cert per l'account utente che viene utilizzato per eseguire l'app Web? È possibile farlo utilizzando lo strumento Microsoft WSE 3.0.

+0

Sto solo utilizzando una coppia di chiavi auto-generata per il test al momento, quindi c'è questa richiesta di certificazione coinvolta. Non ho ancora giocato con permessi relativi a nulla, poiché tutto questo viene fatto come lo stesso utente (importare ed eseguire il server web). Non c'è IIS o altro. – Jason

+0

Questo dovrebbe aver letto "non c'è nessuna richiesta di certificazione coinvolta". – Jason

0

Non è esattamente la risposta alla tua domanda, ma qui per riferimento di altri andando su questa strada:

Here è un collegamento a una chat MS che dà esempio di codice C# per fare ciò che httpcfg fa, eliminando così la necessità per lo strumento sulla distribuzione.

+0

Grazie, questo è un buon collegamento.Ho esaminato brevemente questo aspetto, ma si spiega solo come utilizzare la struttura URLACL_SET e non SSL_SET che è necessaria per la gestione della configurazione SSL nel mio scenario. Sfortunatamente la struct SSL_SET è un po 'più complessa, quindi è diventato complicato lavorare con e l'eseguibile httpcfg è stato più conveniente. – Jason