.net - 如何始终启用询问智能卡 PIN 码的对话框?

标签 .net vb.net certificate

场景

我正在尝试使用证书来签署文档。 我第一次签名时,操作系统会提示用户设置 PIN 码的对话框,但下一次就不会了。 出于安全原因,我需要每次签名时操作系统都会向用户询问 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

错误:

Invalid type specified. (Exception from HRESULT: 0x8009000A)

还使用多线程进行测试(仅使用另一个线程进行签名),但它不起作用。

非常感谢!

最佳答案

[DllImport("Advapi32.dll", SetLastError = true)]
public static extern bool CryptSetProvParam(IntPtr hProv, uint dwParam, IntPtr pvData, uint dwFlags);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptAcquireContext(ref IntPtr hProv,
    string pszContainer, string pszProvider, uint dwProvType, uint dwFlags);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern void CryptReleaseContext(IntPtr hProv, uint dwFlags);

static public bool ClearPINCache2(RSACryptoServiceProvider key)
{
    const uint PP_KEYEXCHANGE_PIN = 32;
    const uint PP_SIGNATURE_PIN = 33;
    bool bretval = false;

    IntPtr hProv = IntPtr.Zero;

    if (CryptAcquireContext(ref hProv, key.CspKeyContainerInfo.KeyContainerName,
        key.CspKeyContainerInfo.ProviderName, (uint)key.CspKeyContainerInfo.ProviderType, 0))
    {
        if ((CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, IntPtr.Zero, 0) == true) &&
            (CryptSetProvParam(hProv, PP_SIGNATURE_PIN, IntPtr.Zero, 0) == true))
        {
            bretval = true;
        }
    }

    if (hProv != IntPtr.Zero)
    {
        CryptReleaseContext(hProv, 0);
        hProv = IntPtr.Zero;
    }

    return bretval;
}

关于.net - 如何始终启用询问智能卡 PIN 码的对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654957/

相关文章:

.net - 使用 GROUP BY 和 Count(*) 将 LINQ 查询为匿名类型

c# - X509Chain 在 RemoteCertificateValidationCallback 期间未构建完整链

c# - 如何设置展开多少层TreeView节点?

asp.net - 从日期时间减去 1 年

c# - 一组整数作为自己的数据类型

VB.NET 和 BITS - 后台智能传输服务

c# - 为什么我的证书没有得到验证?

ssl - gRPC 是否在 TLS 握手期间检查 CRL/OCSP 响应程序?

.net - 在 .NET MVC 中使用带有 oAuth 2.0 的 Workday REST API

c# - 有没有办法区分 .NET 中的 SQL Money 和 Decimal 类型?