证书管理
更新时间:2020-11-11
证书管理
证书管理支持client证书的申请和下载,用户可使用下载的证书调用链码并进一步使用证书属性集实现丰富的权限校验。
申请证书
- 进入【联盟】菜单,点击联盟名称进入联盟详情页,点击【证书管理】进入证书管理页。
- 申请证书时需要设置的参数:
参数 | 说明 | 举例 |
---|---|---|
用户名 | 证书的唯一标识 | Bob |
属性集 | key=value格式,多个键值对以英文逗号分割 | role=admin,permission=1 |
下载并使用证书
- 申请完证书后可在证书操作栏进行证书下载:
- 下载证书与SDK的配合使用,将下载的证书解压到 sdk 的crypto-config/组织名称/users 并将demo中UserName改为证书用户名即可(比如:Bob)
属性集实现权限认证
Hyperledger Fabric 支持使用基于属性的访问控制(ABAC, Attribute-Based Access Control)来控制用户的访问权限。在进行申请证书时,可以包含一个或多个属性名称和值,链码运行时可以提取属性值来进行访问控制决策。
例如,您正在开发一个”黑名单“的应用,需要控制上传黑名单的权限。您可以在链码中指定permission权限为1的用户才可以上传黑名单,然后申请证书时为有上传黑名单权限的client指定permission=1
关于 Hyperledger Fabric ABAC 功能,更多请参见:Attribute-Based Access Control
黑名单 demo,其中对上传操作进行权限校验:
package main
import (
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/core/chaincode/shim/ext/cid"
pb "github.com/hyperledger/fabric/protos/peer"
)
type BlacklistChaincode struct {
}
func (t *BlacklistChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
return shim.Success(nil)
}
func (t *BlacklistChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
function, args := stub.GetFunctionAndParameters()
if function == "upload" {
return t.upload(stub, args)
} else if function == "query" {
return t.query(stub, args)
}
return shim.Error("Invalid invoke function name. Expecting \"upload\" \"query\"")
}
func (t *BlacklistChaincode) upload(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 2 {
return shim.Error("Incorrect number of arguments. Expecting 2")
}
// 校验调用用户是否有上传黑名单权限
err := cid.AssertAttributeValue(stub, "permission", "1")
if err != nil {
return shim.Error("The client identity does not have the permission to upload blacklist")
}
// Write the state back to the ledger
err = stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
func (t *BlacklistChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 1 {
return shim.Error("Incorrect number of arguments. Expecting name of the person to query")
}
// Get the state from the ledger
Avalbytes, err := stub.GetState(args[0])
if err != nil {
jsonResp := "{\"Error\":\"Failed to get state for " + args[0] + "\"}"
return shim.Error(jsonResp)
}
if Avalbytes == nil {
jsonResp := "{\"Error\":\"Nil content for " + args[0] + "\"}"
return shim.Error(jsonResp)
}
return shim.Success(Avalbytes)
}
func main() {
err := shim.Start(new(BlacklistChaincode))
if err != nil {
fmt.Printf("Error starting Blacklist chaincode: %s", err)
}
}