专家不帮我??谁帮我???API调用的史无前例的super难题(PFXExportCertStoreEx)

时间:2022-03-09 23:18:06
我想实现导出一个“CN=liu”的带私钥的证书.私钥密码为"liuying"我想让我的应用程序不显示这段导出过程.(包括密码也不要手动输入)而完成这个任务.
这里先谢谢一叶知秋gg告诉我说要调PFXExportCertStoreEx它是这样的:
BOOL WINAPI PFXExportCertStoreEx(
  HCERTSTORE hStore,
  CRYPT_DATA_BLOB *pPFX,
  LPCWSTR szPassword,
  void *pvReserved,
  DWORD dwFlags
);


我写的声名:[DllImport("crypt32.dll", EntryPoint="PFXExportCertStoreEx", CharSet=CharSet.Auto)] 
public  static extern int  eee(IntPtr hStore,string szPassword,UInt32 dwFlags);
调用:eee(store.Handle,"6215376",不会);
反正绝对不对。希望英雄们帮我解决一下。



20 个解决方案

#1


C#中调用API真的好麻烦:(

GZ!

#2


由于没有使过这个API,最好把
HCERTSTORE:什么类型?
CRYPT_DATA_BLOB:应该是个结构类型吧,需要layout
LPCWSTR szPassword:不能直接用string来进行传递
void *pvReserved:你调用的时候,还想没传这个参数
DWORD dwFlags:应该是标志,有些具体的值吧
你先看看
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/pfxexportcertstoreex.asp的说明吧

#3


你说的对,现在我已经明白一些api的东西了,msdn的说明我也看了无数遍了,可惜这个PFXExportCertStoreEx坏东西太难用了,十分不懂,百分迷惑,千分糊涂,万分困扰。
希望对api比较懂的大哥哥们帮帮小妹。。。试试这个函数吧。哪怕给我一段没经过测试的代码也好让小妹葫芦画瓢阿。。谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢

#4


不会,不过这个flag也就只有3个值。
EXPORT_PRIVATE_KEYS Private keys are exported as well as the certificates. 

REPORT_NO_PRIVATE_KEY If a certificate is encountered that has no associated private key, the function returns FALSE with the last error set to either CRYPT_E_NOT_FOUND or NTE_NO_KEY. 

REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY If a certificate is encountered that has a non-exportable private key, the function returns FALSE with the last error set to either CRYPT_E_NOT_FOUND or NTE_BAD_KEY. 

#5


算了吧,,有谁能告诉我一个可以得到答案的论坛??

#6


试试看:
IntPtr hnd; 
...
Cryptography.X509Certificates.X509Certificate cert= Cryptography.X509Certificates.X509Certificate(hnd);
byte[] Data=cert.GetRawCertData();  //得到证书的原始数据

typedef struct _CRYPTOAPI_BLOB 
{  
   DWORD cbData;
   BYTE* pbData;
}cryB;
cryB->cbData=Data.Length;
cryB->pbData=Data;

PFXExportCertStoreEx(store.Handle,cryB,"liuying",null,EXPORT_PRIVATE_KEYS|REPORT_NO_PRIVATE_KEY);

#7


你导出证书做什么用?能说说你的思路吗?

#8


我其时就是想要做一个带秘钥的合法的证书发给用户

#9


PFXExportCertStoreEx(store.Handle,cryB,"liuying",null,EXPORT_PRIVATE_KEYS|REPORT_NO_PRIVATE_KEY);

这个不行啊,

#10


注册名连名字生日都出来了,帮你顶一下。

#11


faint

#12


呵呵,我的VC 删了,你找个有VC 的家伙,找出 Wincrypt.h 就冰释了

你是不是想要数字签名?
可以参考:http://www.ithome-cn.net/technology/vc/vc141.htm

信任证书不是你自己可以颁发的,就算是windows 中的administrator 身份证书也只是身份证书并不是一个信任证书。。。晕

#13


我用makecert 做一个根证书不就可以了吗?

#14


补充:自签名的

#15


自签名的证书,用法只有一个,受最终用户所信任,如果是microsoft.com 那么最终用户能够明确的知道一件事,此证书是微软的,并且在该包中有效,有效就代表着包的CRC 都正常没有被改动过。但是,如果是你自己颁发给自己,用户会信任吗?它和有没有证书并没有区别,用户都只能根据此包的来源来确定是否应该点击是,换个角度,如果你使用的是国际上受信任的颁发机构发给你的证书,那么最终用户见到的将是颁发机构的证书,因为此机构受正当信任,他只要考虑是否此证书现在是否还有效。比如,3721.com 的证书是他们自己create 的,你会信任他吗?取决于证书自己吗?如果3721 弹出来的证书是微软的那就另当别论了,呵呵

而数字签名则不同,它可以是双方的一个约定,以保证双方的数据原封不动,它是可以由用户自己生成。

你的问题你可以查阅一下Wincrypt.h 里面有你要的声明和原型

#16


你不要忘了,有了证书并不代表用户信任你
正因它人人都可以自己创建,所以它并不能保证包内的内容是否有害。如果它没有存在信任,那么它只一个作用就是保证自己的完整性,不知你的:

我其时就是想要做一个带秘钥的合法的证书发给用户

是什么意思,如果是WEB上的多点某知用户,那么根本没有必要,单点已知用户用签名比这个要更好

#17


恩,太谢谢你了,我就是想要模仿一个证书机构,拥有自己的根证书,然后给用户颁发子证书
现在就是不好做子证书。

#18


只能把子证书作好放到系统的证书库中,还要导出
我想利用api用程序导出证书,存成证书文件

#19


哦!!对了!!我有办法了哈哈

#20


什么办法啊,教教我,我也想知道

#1


C#中调用API真的好麻烦:(

GZ!

#2


由于没有使过这个API,最好把
HCERTSTORE:什么类型?
CRYPT_DATA_BLOB:应该是个结构类型吧,需要layout
LPCWSTR szPassword:不能直接用string来进行传递
void *pvReserved:你调用的时候,还想没传这个参数
DWORD dwFlags:应该是标志,有些具体的值吧
你先看看
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/pfxexportcertstoreex.asp的说明吧

#3


你说的对,现在我已经明白一些api的东西了,msdn的说明我也看了无数遍了,可惜这个PFXExportCertStoreEx坏东西太难用了,十分不懂,百分迷惑,千分糊涂,万分困扰。
希望对api比较懂的大哥哥们帮帮小妹。。。试试这个函数吧。哪怕给我一段没经过测试的代码也好让小妹葫芦画瓢阿。。谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢

#4


不会,不过这个flag也就只有3个值。
EXPORT_PRIVATE_KEYS Private keys are exported as well as the certificates. 

REPORT_NO_PRIVATE_KEY If a certificate is encountered that has no associated private key, the function returns FALSE with the last error set to either CRYPT_E_NOT_FOUND or NTE_NO_KEY. 

REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY If a certificate is encountered that has a non-exportable private key, the function returns FALSE with the last error set to either CRYPT_E_NOT_FOUND or NTE_BAD_KEY. 

#5


算了吧,,有谁能告诉我一个可以得到答案的论坛??

#6


试试看:
IntPtr hnd; 
...
Cryptography.X509Certificates.X509Certificate cert= Cryptography.X509Certificates.X509Certificate(hnd);
byte[] Data=cert.GetRawCertData();  //得到证书的原始数据

typedef struct _CRYPTOAPI_BLOB 
{  
   DWORD cbData;
   BYTE* pbData;
}cryB;
cryB->cbData=Data.Length;
cryB->pbData=Data;

PFXExportCertStoreEx(store.Handle,cryB,"liuying",null,EXPORT_PRIVATE_KEYS|REPORT_NO_PRIVATE_KEY);

#7


你导出证书做什么用?能说说你的思路吗?

#8


我其时就是想要做一个带秘钥的合法的证书发给用户

#9


PFXExportCertStoreEx(store.Handle,cryB,"liuying",null,EXPORT_PRIVATE_KEYS|REPORT_NO_PRIVATE_KEY);

这个不行啊,

#10


注册名连名字生日都出来了,帮你顶一下。

#11


faint

#12


呵呵,我的VC 删了,你找个有VC 的家伙,找出 Wincrypt.h 就冰释了

你是不是想要数字签名?
可以参考:http://www.ithome-cn.net/technology/vc/vc141.htm

信任证书不是你自己可以颁发的,就算是windows 中的administrator 身份证书也只是身份证书并不是一个信任证书。。。晕

#13


我用makecert 做一个根证书不就可以了吗?

#14


补充:自签名的

#15


自签名的证书,用法只有一个,受最终用户所信任,如果是microsoft.com 那么最终用户能够明确的知道一件事,此证书是微软的,并且在该包中有效,有效就代表着包的CRC 都正常没有被改动过。但是,如果是你自己颁发给自己,用户会信任吗?它和有没有证书并没有区别,用户都只能根据此包的来源来确定是否应该点击是,换个角度,如果你使用的是国际上受信任的颁发机构发给你的证书,那么最终用户见到的将是颁发机构的证书,因为此机构受正当信任,他只要考虑是否此证书现在是否还有效。比如,3721.com 的证书是他们自己create 的,你会信任他吗?取决于证书自己吗?如果3721 弹出来的证书是微软的那就另当别论了,呵呵

而数字签名则不同,它可以是双方的一个约定,以保证双方的数据原封不动,它是可以由用户自己生成。

你的问题你可以查阅一下Wincrypt.h 里面有你要的声明和原型

#16


你不要忘了,有了证书并不代表用户信任你
正因它人人都可以自己创建,所以它并不能保证包内的内容是否有害。如果它没有存在信任,那么它只一个作用就是保证自己的完整性,不知你的:

我其时就是想要做一个带秘钥的合法的证书发给用户

是什么意思,如果是WEB上的多点某知用户,那么根本没有必要,单点已知用户用签名比这个要更好

#17


恩,太谢谢你了,我就是想要模仿一个证书机构,拥有自己的根证书,然后给用户颁发子证书
现在就是不好做子证书。

#18


只能把子证书作好放到系统的证书库中,还要导出
我想利用api用程序导出证书,存成证书文件

#19


哦!!对了!!我有办法了哈哈

#20


什么办法啊,教教我,我也想知道

#21