阅读:4856回复:7
usb key读取证书和数字签名经常有错误,求解.
1、 CryptGetUserKey函数经常错误,错误为:NTE_NO_KEY,但是用“智能卡管理器”看好像也没什么问题,而且这种情况不是一直存在的,比如刚才我在VC6下以调试状态一路跟踪下去就是正常的,可是接下来直接运行的时候又出现这个问题了。
// 获取一个密钥//句柄的函数 if(CryptGetUserKey( hProv, AT_SIGNATURE, //, AT_KEYEXCHANGE &hKey)) { printf("获取数字签名公钥成功. \n"); } else { // NTE_NO_KEY MyHandleError("Error during CryptGetUserKey for signkey."); } 2、CryptReleaseContext的时候每次都会出错,错误代码为0x00000057L 。 if(!CryptReleaseContext(hProv, 0)) { sprintf(szMsg, "释放CSP失败,错误代码: 0x%8X", GetLastError()); writeToLog(szMsg); } 总之就是操作usb key里很不稳定,经常会出现pin锁住啊,读取CSP失败啊,等问题。 |
|
|
沙发#
发布于:2007-05-31 10:05
我就问了两次,怎么两次都冷冷清清的,心寒的来,人呢?
|
|
|
板凳#
发布于:2007-05-31 18:21
呵呵,你的问题涉及到具体硬件,别人又不知道你的KEY是哪个厂商的。如果是硬件厂商提供的CSP本身有问题,如何解决?
1、CryptGetUserKey的dwKeySpec参数,你用AT_KEYEXCHANGE | AT_SIGNATURE试试,我知道很多厂商对签名密钥是这么指定的,MSDN也提到允许这样干。 2、CryptReleaseContext出错有点奇怪,象是CSP有问题,或加了什么限制。 3、关于你调试没问题,而直接运行有问题,可能是这个原因造成的:厂商可能有个服务模块,负责将指令排队、执行并返回结果。厂商的管理器可能也在定时地发一些指令,而整个指令执行的机制有BUG,没处理好吧。 以上只是猜测,第1条你可以试试,2、3在正常情况下不应该有,很可能是厂商的软件问题。顺便问下,是哪个公司的产品。 |
|
地板#
发布于:2007-06-01 10:06
哪个厂商还真不好说哎,不过那个智能卡管理器是A.E.T.Europe.B.V的,不知道是不是这个公司出的,好像是个外国公司的,也不清楚为什么就只给个USB key,连接口都不给的。
还有一个奇怪问题,就是在IE中把证书删掉,用我们的DEMO程序来读数字签名就一切正常的,用我的程序一读就会提示失败了,然后用DEMO程序读也会失败。 |
|
|
地下室#
发布于:2007-06-02 01:51
可以确认硬件是捷德,软件是飞天提供的,产品可能是ePass系列。两公司曾经合作过。正常调用其提供的CSP,应该不会出问题。
你提到的读取数字签名是怎么回事,你是想说的读取证书数据吗?读取证书数据是不需要校验PIN的,如果理参数正确的情况下,不会失败。你说的DEMO程序又是怎么回事,是二次开发包中的DEMO吗? 如果可以,把你的程序和DEMO,发来我看看,也许能找到问题。 |
|
5楼#
发布于:2007-06-02 09:46
飞天的硬件还将就,软件质量一向比较垃圾,我用过好多款,软件都有问题. 我感觉他们的软件开发人员不是专业的,可能是硬件转行的,好多细节处理不完善,把我们当白老鼠...
|
|
|
6楼#
发布于:2007-06-04 17:34
是这样的,因为我不知道为什么,我用反汇编分析得到的C_Login等一系列函数,在读取证书的时候就会出错,因为找不到可以参考的代码,所以我们换了种方法,验证pin密码的时候用C_Login这一套函数,但是读证书等操作用的是微软的cryptoapi来操作了。不知道谁能提供个用C_Login这一套函数的演示程序,读取证书,验证数字签名,等。
|
|
|
7楼#
发布于:2007-06-06 00:36
飞天的软件层是CSP调用P11,你用的C_Login就是他的P11库提供的接口。你这样跨层用是不行的,因为他的CSP内部对PIN的状态是有管理的,而且它有些型号的PIN是用加密的,加密方法你可以逆向分析一下,这里我不方便透露。你没有必要管P11,对不熟悉P11开发者来说,使用P11非常不合适。调用CSP要简单得多,你不想用CSP是否因为它的PIN码输入对话框。如果不是,要完成你说的操作,只要参照MSDN里CryptoApi的例子代码即可。
|
|