シナリオ
証明書を使用してドキュメントに署名しようとしています。初めて署名すると、OS はユーザーに PIN を設定するためのダイアログを表示しますが、次回は表示されません。セキュリティ上の理由から、署名するたびに、OS がユーザーに 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)
また、マルチスレッド (署名のためだけに別のスレッドを使用) を使用してテストしますが、機能しません。
どうもありがとうございました!