Newsgroup: it.comp.lang.visual-basic
Titolo: Certificati digitali

Ciao a tutti,
sto realizzando un sito in 
ASP.NET
, dove l'utente richiede un
documento, il server lo crea e lo firma digitalmente, tramite un
certificato digitale presente in un token USB.
Lavorando con il server di sviluppo di visual studio, alla prima
richiesta, al momento di applicare la firma, in automatico compare una
form sul server in cui inserire il PIN legato al token USB. Le
successive richieste non richiedono il PIN.
Lavorando con IIS, il form di richiesta del PIN non compare e quindi
non posso applicare la firma digitale al documento.
Qualcuno può suggerire un procedimento per aggirare il problema,
magari come passare il PIN da codice, cosa che a quanto ho visto non
si può fare, oppure come far apparire questo benedetto form?
grazie

Rieccomi qui dopo una giornata cercando di trovare una soluzione.
Onestamente credo che il problema non sia dei web server in generale
in quanto non ha senso far continuare l'elaborazione della pagina dopo
un intervento lato server.
L'anomalia è del server web di visual studio, che lo permette. Forse
perchè non si tratta di un vero web server ma di un emulatore. (detto
fra noi spero ancora che qualcuno mi smentisca e mi dica in che modo
si risolve!)
Detto questo ho spostato il punto di vista sull'inserimento del PIN
tramite codice.
In giro ho trovato informazioni poco piacevoli.
Alcuni dicono che non si può fare, altri semplicemente non hanno
trovato risposta.
Naturalmente ho provato un pò di codice trovato in giro ma va in
errore; errore di cui non sono riuscito a trovare nessuna
documentazione.
Posto il codice così che possiate farvene un'idea:
'apro lo store dei certificati
Dim mystore = New X509Store(StoreName.My, StoreLocation.LocalMachine)
mystore.Open(OpenFlags.ReadOnly)
Dim cert As New X509Certificate2
Dim certFounded As Boolean = False
'cerco il certificato che mi interessa
For Each cert In mystore.Certificates
    If cert.Subject.Contains(MioSubject) Then
        certFounded = True
            Exit For
    End If
Next
'se non lo trovo esco
If Not certFounded Then
    Exit Function
End If
Dim signer As New Pkcs.CmsSigner()
'oggetto firmatario
Dim content As New Pkcs.ContentInfo(msgBytes)               'oggetto
da firmare
Dim instance As New Pkcs.SignedCms(content, False)
'assegno al firmatario il certificato digitale
signer.Certificate = cert
'calcolo la firma
instance.ComputeSignature(signer, False)
'codifico il messaggio
Dim myCmsMessage As Byte()
myCmsMessage = instance.Encode
Questo è il codice originale. Sull'istruzione:
instance.ComputeSignature(signer, False)
viene lanciato il form per l'inserimento del PIN
Come dicevo ho trovato in giro questa porzione di codice che dovrebbe
servire per impostare da codice il PIN:
'codifico il PIN
Dim pwstr As New System.Security.SecureString()
pwstr.AppendChar("1")
pwstr.AppendChar("2")
pwstr.AppendChar("3")
pwstr.AppendChar("4")
pwstr.AppendChar("5")
pwstr.AppendChar("6")
pwstr.AppendChar("7")
pwstr.AppendChar("8")
'creo i parametri
Dim cspparams As New CspParameters(1, MioProvider)
'ai parametri dò la password criptata
cspparams.KeyPassword = pwstr
'sostituisco la creazione del signer passandogli i parametri
'Dim signer As New Pkcs.CmsSigner()
'oggetto firmatario
'Dim signer As New Pkcs.CmsSigner(cspparams)
'oggetto firmatario
A questo punto viene lanciata un eccezione con il messaggio:
"Operazione Completata"  (mah!)
e come stackTrace:
in System.Security.Cryptography.Pkcs.PkcsUtils.CreateDummyCertificate
(CspParameters parameters)
in System.Security.Cryptography.Pkcs.CmsSigner..ctor(CspParameters
parameters)
etc....
Non ho trovato nulla in giro su questa eccezione
Ho la testa più confusa che altro in questo momento ed aspetto
un'anima pia che mi illumini il cammino
grazie a tutti