Сценарий
Я пытаюсь использовать сертификаты для подписи документов.
В первый раз, когда я подписываюсь, ОС запрашивает у пользователя диалоговое окно для установки PIN-кода, но в следующий раз - нет.
Из соображений безопасности мне нужно, чтобы при каждой подписи ОС запрашивала у пользователя ПИН-код.
Кто-нибудь знает, как это сделать?
Это код:
''// create ContentInfo
Dim content As New ContentInfo(bytesContenido)
''// create a signer
Dim signer As New CmsSigner(certificado)
''// SignedCms represents signed data
Dim signedMessage As New SignedCms(content)
''// sign the data
signedMessage.ComputeSignature(signer, False)
''// create and return PKCS #7 byte array
Return signedMessage.Encode()
На некоторых страницах я обнаружил, что использование CryptSetProvParam
может очистить штифт, но пока не работает.
Утверждение:
<DllImport("advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function CryptSetProvParam(ByVal hProv As IntPtr, ByVal dwParam As Int32, ByVal pbData As Byte(), ByVal dwFlags As Int32) As Boolean
End Function
Вызов:
Public punteroContexto As New System.IntPtr ''// Obtenido usando CryptAcquireContext
Public Const PP_SIGNATURE_PIN As UInt32 = 33
If (Not CryptSetProvParam(punteroContexto, PP_SIGNATURE_PIN, Nothing, 0)) Then
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error)
End If
Ошибка:
Указан неверный тип. (Исключение из HRESULT: 0x8009000A)
Также проверьте использование многопоточности (используя другой поток только для подписи), и это не сработает.
Большое спасибо!