//把member类型的证书加载到org下面的peer节点 public override Task <RegistReply> Regist(RegistRequest request, ServerCallContext context) { try { if (_identityProvider.GetCAUserName() != request.Username || _identityProvider.GetCAPassword() != request.Password) { return(Task.FromResult(new RegistReply() { Status = false })); } //获取证书 var ca = Newtonsoft.Json.JsonConvert.DeserializeObject <Certificate>(request.Certificate); //校验签名 var rs = RSAHelper.VerifyData(_identityProvider.GetPublicKey(), ca.TBSCertificate, ca.SignatureValue); //如果是peer节点类型 则返回false //peer节点类型在组织加入通道的时候进行校验 if (ca.TBSCertificate.CAType == CAType.Peer) { return(Task.FromResult(new RegistReply() { Status = false, Msg = "签名校验失败" })); } else { //把证书上链 var caconfig = new OrgMemberConfig(); caconfig.Name = ca.TBSCertificate.Subject; caconfig.OrgId = _identityProvider.GetPeerIdentity().OrgId; caconfig.Certificate = ca; var response = _invokeBLL.RegistMember(request.ChannelId, caconfig); return(Task.FromResult(new RegistReply() { Status = true, Msg = "注册成功!" })); } } catch (Exception ex) { _logger.LogError(ex, ex.Message); return(Task.FromResult(new RegistReply() { Status = false, Msg = ex.Message })); } }
/// <summary> /// 向节点注册成员 /// </summary> /// <param name="channelId"></param> /// <param name="ca"></param> /// <returns></returns> public async Task <TxResponse> RegistMember(string channelId, OrgMemberConfig ca) { var txHeader = new QMBlockSDK.TX.TxHeader(); txHeader.ChannelId = channelId; //txHeader.ChaincodeName = ConfigKey.SysIdentityChaincode; txHeader.ChaincodeName = ConfigKey.SysNetConfigChaincode; txHeader.FuncName = ConfigKey.AddOrgMemberFunc; txHeader.Args = new string[] { Newtonsoft.Json.JsonConvert.SerializeObject(ca) }; txHeader.Type = TxType.Invoke; var rs = await _txService.InvokeTx(txHeader); return(rs); }
/// <summary> /// 添加组织节点 只能更改自己的组织节点 /// </summary> /// <param name="stub"></param> /// <returns></returns> private ChainCodeInvokeResponse AddOrgMember(IChaincodeStub stub) { if (stub.GetArgs().Count() != 1) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var arg = stub.GetArgs()[0]; OrgMemberConfig newOrgMember = Newtonsoft.Json.JsonConvert.DeserializeObject <OrgMemberConfig>(arg); #region 请求合法性校验 //如果修改的组织节点等于本组织节点 则需要验证请求是否由本节点发出 var identity = stub.GetPeerIdentity(); if (newOrgMember.OrgId == identity.OrgId) { var signature = stub.GetTxRequestHeaderSignature(); //这里添加验证 } #endregion #region 成员数据完整性校验 if (string.IsNullOrEmpty(newOrgMember.OrgId)) { return(stub.Response("组织ID不能为空", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(newOrgMember.Name)) { return(stub.Response("成员名称不能为空", StatusCode.BAD_OTHERS)); } if (newOrgMember.Certificate == null) { return(stub.Response("证书不存在", StatusCode.BAD_OTHERS)); } if (!newOrgMember.Certificate.Check()) { return(stub.Response("证书数据不完整", StatusCode.BAD_OTHERS)); } if (newOrgMember.Certificate.TBSCertificate.CAType == CAType.Peer) { return(stub.Response("证书类型不正确", StatusCode.BAD_OTHERS)); } #endregion var channelconfig = stub.GetChannelConfig(); var org = channelconfig.OrgConfigs.Where(p => p.OrgId == newOrgMember.OrgId).FirstOrDefault(); if (org == null) { return(stub.Response("组织不存在", StatusCode.BAD_OTHERS)); } #region 成员唯一性检验 if (org.OrgMember.Any(p => p.Name == newOrgMember.Name)) { return(stub.Response("成员名称重复", StatusCode.BAD_OTHERS)); } if (org.OrgMember.Any(p => p.Certificate.TBSCertificate.SerialNumber == p.Certificate.TBSCertificate.SerialNumber)) { return(stub.Response("成员证书编号重复", StatusCode.BAD_OTHERS)); } if (org.OrgMember.Any(p => p.Certificate.TBSCertificate.PublicKey == p.Certificate.TBSCertificate.PublicKey)) { return(stub.Response("成员公钥重复", StatusCode.BAD_OTHERS)); } #endregion org.OrgMember.Add(newOrgMember); stub.SetChannelConfig(channelconfig); return(stub.Response("", StatusCode.Successful)); }
public Task <TxResponse> AddOrgMember(OrgMemberConfig config) { throw new NotImplementedException(); }