Adding a new organisation to the system channel fails after FAB-17733 #fabric-orderer #raft #fabric
Hey,
we are using an architecture where there is a TLS root CA and each organisation has its own intermediate TLS CA which is an immediate child to the TLS root CA (realized with fabric-ca v1.4.7). We only want to specify the TLS root CA certificate for any connection within the network (e.g. for "peer channel update --cafile") and have had some trouble achieving that in the first place. Our workaround is to append their respective intermediate TLS CA certificates to all peer/orderer TLS certificates building the proper chain of trust up to the TLS root CA certificate.
Now, when checking if we could upgrade to Hyperledger Fabric v2.1.1 (from 2.1.0), updating the system channel with a new organisation (including a new orderer) fails with the error "x509: certificate signed by unknown authority". We made sure that "tls_root_certs" and "tls_intermediate_certs" within "channel_group.groups.Orderer.groups.newOrg.values.MSP.value" both contain the correct certificates, but still faced the same error. We believe to have tracked down the problem to FAB-17733 which adds a certificate check when adding a new consenter to the raft configuration. Our configuration update for the system channel contains both the "channel_group.groups.Orderer.groups" definition for the new organisation as well as the new orderer in "channel_group.groups.Orderer.values.ConsensusType.consenters". Could this be a problem? Should we first update the orderer group definition and then add the new consenter?
Any pointers towards a fix are greatly appreciated. We would also love to learn more about how peers/orderers handle TLS connections - especially how they handle multiple CAs in their chain of trust - to be able to move away from appending intermediate TLS CA certificates to build the chain of trust manually.
Thanks,
Christoph
- Yes, with FAB-17733 implemented you need to do it in 2 stages- first expand the organizations and then add the new consenter.
- I guess it's possible to address your problem by speculatively looking at how the root TLS CA will look like after applying the config and not before it. Please open a new JIRA? :-)
- I'm not sure why you can't specify the intermediate certificates in the channel config for each organization?
From: "christoph.buttler via lists.hyperledger.org" <christoph.buttler=ruhr-uni-bochum.de@...>
To: fabric@...
Date: 06/16/2020 03:57 AM
Subject: [EXTERNAL] [Hyperledger Fabric] Adding a new organisation to the system channel fails after FAB-17733 #fabric #fabric-orderer #raft
Sent by: fabric@...
Hey,
we are using an architecture where there is a TLS root
CA and each organisation has its own intermediate TLS CA which is an immediate
child to the TLS root CA (realized with fabric-ca v1.4.7). We only want
to specify the TLS root CA certificate for any connection within
the network (e.g. for "peer channel update --cafile") and have
had some trouble achieving that in the first place. Our workaround is to
append their respective intermediate TLS CA certificates to all peer/orderer
TLS certificates building the proper chain of trust up to the TLS root
CA certificate.
Now, when checking if we could upgrade to Hyperledger Fabric v2.1.1 (from
2.1.0), updating the system channel with a new organisation (including
a new orderer) fails with the error "x509: certificate signed by unknown
authority". We made sure that "tls_root_certs" and "tls_intermediate_certs"
within "channel_group.groups.Orderer.groups.newOrg.values.MSP.value"
both contain the correct certificates, but still faced the same error.
We believe to have tracked down the problem to FAB-17733 which adds a certificate
check when adding a new consenter to the raft configuration. Our configuration
update for the system channel contains both the "channel_group.groups.Orderer.groups"
definition for the new organisation as well as the new orderer in "channel_group.groups.Orderer.values.ConsensusType.consenters".
Could this be a problem? Should we first update the orderer group definition
and then add the new consenter?
Any pointers towards a fix are greatly appreciated. We would also love
to learn more about how peers/orderers handle TLS connections - especially
how they handle multiple CAs in their chain of trust - to be able to move
away from appending intermediate TLS CA certificates to build the chain
of trust manually.
Thanks,
Christoph
Hey Yacov,
thanks for your quick reply. As suggested, I have opened a new JIRA (https://jira.hyperledger.org/browse/FAB-17998).
Regarding (3.), we have already added the intermediate certificates to the channel configuration. Let me try to give a proper explanation on what we want to achieve:
Suppose we have an orderer with a TLS chain "orderer.crt -> intermediate.crt -> root.crt" and want to create a new channel with "peer channel create". Now, if we are contacting the organisations orderer, we could simply specify "--cafile intermediate.crt" and the TLS handshake would succeed. However, if we are contacting another organisations orderer, we do not want look up its "intermediate.crt" within the channel config. We would like to be able to specify "--cafile root.crt" no matter which orderer we are contacting. For some reason, this always results in a failed TLS handshake. We would expect the orderer to supply its full chain of certificates (or at least "orderer.crt -> intermediate.crt") in the handshake, but can not figure out how to achieve this. As mentioned, our workaround is to build the TLS chain through manually appending "intermediate.crt" to "orderer.crt". Is there a way for the orderer/peer to do this automatically? Maybe through the fabric configuration files orderer.yaml/core.yaml?
Thanks,
Christoph
To do what you want (just specify the root cert and not the intermediate) would require the TLS server handshake to send the full validation chain which happens only if we specify the validation chain itself in the TLS config,
which we do not do: https://github.com/hyperledger/fabric/blob/master/internal/pkg/comm/server.go#L70-L95
therefore I find it hard to believe that the workaround you mention indeed works (unless I am misinterpreting your workaround - i assume you mean you do it in the server side and not in the client side)
From: "christoph.buttler via lists.hyperledger.org" <christoph.buttler=ruhr-uni-bochum.de@...>
To: fabric@...
Date: 06/16/2020 04:05 PM
Subject: [EXTERNAL] Re: [Hyperledger Fabric] Adding a new organisation to the system channel fails after FAB-17733 #fabric #fabric-orderer #raft
Sent by: fabric@...
Hey Yacov,
thanks for your quick reply. As suggested, I have opened
a new JIRA (https://jira.hyperledger.org/browse/FAB-17998).
Regarding (3.), we have already added the intermediate certificates to
the channel configuration. Let me try to give a proper explanation on what
we want to achieve:
Suppose we have an orderer with a TLS chain "orderer.crt -> intermediate.crt
-> root.crt" and want to create a new channel with "peer channel
create". Now, if we are contacting the organisations orderer, we could
simply specify "--cafile intermediate.crt" and the TLS handshake
would succeed. However, if we are contacting another organisations orderer,
we do not want look up its "intermediate.crt" within the channel
config. We would like to be able to specify "--cafile root.crt"
no matter which orderer we are contacting. For some reason, this always
results in a failed TLS handshake. We would expect the orderer to supply
its full chain of certificates (or at least "orderer.crt -> intermediate.crt")
in the handshake, but can not figure out how to achieve this. As mentioned,
our workaround is to build the TLS chain through manually appending "intermediate.crt"
to "orderer.crt". Is there a way for the orderer/peer to do this
automatically? Maybe through the fabric configuration files orderer.yaml/core.yaml?
Thanks,
Christoph
iterates over the PEM and just put multiple certificates into the tls.Certificate object https://golang.org/src/crypto/tls/tls.go
So, basically this seems fine to me....
From: "christoph.buttler via lists.hyperledger.org" <christoph.buttler=ruhr-uni-bochum.de@...>
To: fabric@...
Date: 06/16/2020 11:45 PM
Subject: [EXTERNAL] Re: [Hyperledger Fabric] Adding a new organisation to the system channel fails after FAB-17733 #fabric #fabric-orderer #raft
Sent by: fabric@...
One or more of the following files ( example_env.zip ) violates IBM policy and all attachment(s) have been removed from the message.
We are indeed doing this on the server side (see attached certificates). If you ever wonder how it can work at all, I have put together a small example environment of what this would look like.
Thank you very much for your insights!