Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 注册成员请求失败,签名验证失败_Go_Hyperledger_Hyperledger Fabric - Fatal编程技术网

Go 注册成员请求失败,签名验证失败

Go 注册成员请求失败,签名验证失败,go,hyperledger,hyperledger-fabric,Go,Hyperledger,Hyperledger Fabric,当我尝试注册“admin”用户时,第二次调用CreateCertificatePair失败,并显示“签名验证失败”消息。顺便说一句,我从eca_test.go复制了enrollUser函数。并且membersrvc/ca包下的测试可以通过 //Phase 2 of the protocol spi := ecies.NewSPI() eciesKey, err := spi.NewPrivateKey(nil, encPriv) if err != nil { return err }

当我尝试注册“admin”用户时,第二次调用CreateCertificatePair失败,并显示“签名验证失败”消息。顺便说一句,我从eca_test.go复制了enrollUser函数。并且membersrvc/ca包下的测试可以通过

//Phase 2 of the protocol
spi := ecies.NewSPI()
eciesKey, err := spi.NewPrivateKey(nil, encPriv)
if err != nil {
    return err
}

ecies, err := spi.NewAsymmetricCipherFromPublicKey(eciesKey)
if err != nil {
    return err
}

out, err := ecies.Process(resp.Tok.Tok)
if err != nil {
    return err
}

req.Tok.Tok = out
req.Sig = nil

hash := primitives.NewHash()
raw, _ := proto.Marshal(req)
hash.Write(raw)

r, s, err := ecdsa.Sign(rand.Reader, signPriv, hash.Sum(nil))
if err != nil {
    return err
}
R, _ := r.MarshalText()
S, _ := s.MarshalText()
req.Sig = &pb.Signature{Type: pb.CryptoType_ECDSA, R: R, S: S}

resp, err = ecapCient.CreateCertificatePair(context.Background(), req)

CreateCertificatePair请求ECA创建新的注册证书对。 “注册”证书是唯一的,ECA只能为每个用户创建一次


为同一用户再次调用
CreateCertificatePair
将导致错误。

正如Sergey提到的,
CreateCertificatePair
请求创建新的证书对,
根据文件,

在注册期间,应用程序向证书颁发机构发送请求以验证用户注册,如果成功,CA将使用用户证书和密钥进行响应

成功进行用户身份验证后,应用程序将向CA执行一次用户注册。如果再次尝试为同一用户注册,将导致错误。 这就是对
CreateCertificatePair
的第二次调用失败的原因。 如果确实要注册以前已注册过的用户,则需要删除由CA服务器进程创建的临时文件(客户端注册证书、注册密钥、事务证书链等),要执行此操作,请运行以下命令:

rm -rf /var/hyperledger/production
/var/hyperledger/production
是存储从CA收到的证书的目录


来源:

我不这么认为。官方api文档说:“CreateCertificatePair函数允许用户创建和读取他们的注册证书对。为此,用户必须连续两次调用此函数。”请检查同一文档中的下一个短语-“首先,签名和加密公钥必须与之前由RegisterUser函数调用返回的一次性密码一起交给ECA。”在第二次登录尝试中不能再次使用一次性密码。实际上,第二次调用使用了新的令牌。out,err:=ecies.Process(resp.Tok.Tok)req.Tok.Tok=out此外,如果我使用一次性密码两次,消息将是“identity or token not match”.“eca_test.go”文件中的enrollUser函数,它会调用CreateCertificatePair两次。此外,官方api文档还提到”CreateCertificatePair函数允许用户创建和读取其注册证书对。为此,用户必须连续两次调用此函数。“请记住”rm-rf/var/hyperledger/production“将删除所有内容,包括除证书和密钥之外的所有块的账本……谢谢Sergey。但是,证书位于子目录
/var/hyperledger/production/crypto/client/
中。如果要保留分类账和区块,可以将其删除。您仍然只能注册一次。