我在 Windows 上使用 Go 1.6 并尝试将证书容器导出到 PFX(这里的最终目标是从证书存储访问可导出的私钥)。
我打开了一个内存存储并将证书插入到存储中:
var storedCertCtx *syscall.CertContext
storeHandle, err := syscall.CertOpenStore(syscall.CERT_STORE_PROV_MEMORY, 0, 0, syscall.CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG, 0)
err = syscall.CertAddCertificateContextToStore(storeHandle, certenum, syscall.CERT_STORE_ADD_ALWAYS, &storedCertCtx)
现在我想生成那个商店的 PFX。我已经定义了一个包含数据 blob的结构,并希望使用PFXExportCertStoreEx来获取商店的 PFX:
var (
crypt32 = syscall.NewLazyDLL("crypt32.dll")
procPFXExportCertStoreEx = crypt32.NewProc("PFXExportCertStoreEx")
)
type CRYPTOAPI_BLOB struct {
DataSize uint32
Data *byte
}
var pfxBlob CRYPTOAPI_BLOB
err = PfxExportCertStore(storeHandle, &pfxBlob, syscall.StringToUTF16Ptr("MyPassword"), 0, 0)
syscall.Syscall6(procPFXExportCertStoreEx.Addr(), 5,
uintptr(storeHandle), //hStore
uintptr(unsafe.Pointer(&pfxBlob)), //*pPFX
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("password"))), //szPassword
0, //*pvPara
0, //dwFlags
0)
这一半有效。
DataSize填充了看起来像一个适当的值(即,如果我增加更多的证书商店,它的增长较大),但Data就是永远 <nil>。
看到它意味着用指针填充,我尝试将它声明为*uintptr和uint32(只是为了看看是否填充了任何东西),但什么也没有。该值始终保持不变(如果我手动将垃圾数据放入其中,则在执行系统调用后垃圾数据仍然存在)。
我是否错误地定义了结构?用 Go 完成这件事的例子很少,但是从我从众多 C 例子中看到的,这应该是有效的。
心有法竹
白板的微信
相关分类