Skip to content

Commit 07a15a1

Browse files
committed
[FAB-3353] CRLs loading
This change-set does the following: 1. It modifies the MSP to load the crls from files. The crls are supposed to be under the folder 'crls' under the msp configuration folder. The existance of folder is not mandatory. Change-Id: Ib13493e468deaad6d69cfdce26e1f63c03ba8705 Signed-off-by: Angelo De Caro <[email protected]>
1 parent ca3a1a2 commit 07a15a1

File tree

7 files changed

+92
-79
lines changed

7 files changed

+92
-79
lines changed

msp/configbuilder.go

+24-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
"encoding/pem"
2626
"path/filepath"
2727

28+
"os"
29+
2830
"github.com/hyperledger/fabric/bccsp"
2931
"github.com/hyperledger/fabric/bccsp/factory"
3032
"github.com/hyperledger/fabric/protos/msp"
@@ -56,6 +58,11 @@ func readPemFile(file string) ([]byte, error) {
5658
func getPemMaterialFromDir(dir string) ([][]byte, error) {
5759
mspLogger.Debugf("Reading directory %s", dir)
5860

61+
_, err := os.Stat(dir)
62+
if os.IsNotExist(err) {
63+
return nil, err
64+
}
65+
5966
content := make([][]byte, 0)
6067
files, err := ioutil.ReadDir(dir)
6168
if err != nil {
@@ -72,6 +79,7 @@ func getPemMaterialFromDir(dir string) ([][]byte, error) {
7279

7380
item, err := readPemFile(fullName)
7481
if err != nil {
82+
mspLogger.Warningf("Failed readgin file %s: %s", fullName, err)
7583
continue
7684
}
7785

@@ -87,6 +95,7 @@ const (
8795
signcerts = "signcerts"
8896
keystore = "keystore"
8997
intermediatecerts = "intermediatecerts"
98+
crlsfolder = "crls"
9099
)
91100

92101
func SetupBCCSPKeystoreConfig(bccspConfig *factory.FactoryOpts, keystoreDir string) {
@@ -143,6 +152,7 @@ func getMspConfig(dir string, bccspConfig *factory.FactoryOpts, ID string, sigid
143152
signcertDir := filepath.Join(dir, signcerts)
144153
admincertDir := filepath.Join(dir, admincerts)
145154
intermediatecertsDir := filepath.Join(dir, intermediatecerts)
155+
crlsDir := filepath.Join(dir, crlsfolder)
146156

147157
cacerts, err := getPemMaterialFromDir(cacertDir)
148158
if err != nil || len(cacerts) == 0 {
@@ -159,8 +169,19 @@ func getMspConfig(dir string, bccspConfig *factory.FactoryOpts, ID string, sigid
159169
return nil, fmt.Errorf("Could not load a valid admin certificate from directory %s, err %s", admincertDir, err)
160170
}
161171

162-
intermediatecert, _ := getPemMaterialFromDir(intermediatecertsDir)
163-
// intermediate certs are not mandatory
172+
intermediatecert, err := getPemMaterialFromDir(intermediatecertsDir)
173+
if os.IsNotExist(err) {
174+
mspLogger.Infof("intermidiate certs folder not found at [%s]. Skipping.: [%s]", intermediatecertsDir, err)
175+
} else if err != nil {
176+
return nil, fmt.Errorf("Failed loading intermediate ca certs at [%s]: [%s]", intermediatecertsDir, err)
177+
}
178+
179+
crls, err := getPemMaterialFromDir(crlsDir)
180+
if os.IsNotExist(err) {
181+
mspLogger.Infof("crls folder not found at [%s]. Skipping.: [%s]", intermediatecertsDir, err)
182+
} else if err != nil {
183+
return nil, fmt.Errorf("Failed loading crls ca certs at [%s]: [%s]", intermediatecertsDir, err)
184+
}
164185

165186
// Load FabricCryptoConfig
166187
cryptoConfig := &msp.FabricCryptoConfig{
@@ -175,6 +196,7 @@ func getMspConfig(dir string, bccspConfig *factory.FactoryOpts, ID string, sigid
175196
IntermediateCerts: intermediatecert,
176197
SigningIdentity: sigid,
177198
Name: ID,
199+
RevocationList: crls,
178200
CryptoConfig: cryptoConfig}
179201

180202
fmpsjs, _ := proto.Marshal(fmspconf)

msp/revocation_test.go

+7-77
Original file line numberDiff line numberDiff line change
@@ -19,91 +19,21 @@ package msp
1919
import (
2020
"testing"
2121

22-
"github.com/golang/protobuf/proto"
23-
"github.com/hyperledger/fabric/bccsp"
24-
"github.com/hyperledger/fabric/protos/msp"
2522
"github.com/stretchr/testify/assert"
2623
)
2724

28-
// the following strings contain the credentials for a test MSP setup that has
29-
// 1) a key and a signcert (used to populate the default signing identity);
30-
// 2) cacert is the CA that signed the intermediate;
31-
// 2) a revocation list that revokes signcert
32-
const keyrev = `-----BEGIN EC PRIVATE KEY-----
33-
MHcCAQEEIAsWwFunEzqz1Rh6nvD4MiPkKCtmoxzh3jTquG5MSbeLoAoGCCqGSM49
34-
AwEHoUQDQgAEHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3x
35-
CPQtdG/XJJvZ+C756KEsUBM3yw5PTfku8g==
36-
-----END EC PRIVATE KEY-----`
37-
38-
var signcertrev = `-----BEGIN CERTIFICATE-----
39-
MIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw
40-
fzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh
41-
biBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK
42-
BgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw
43-
WhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg
44-
Q2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy
45-
IEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
46-
HBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ
47-
+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
48-
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC
49-
dcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1
50-
nEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG
51-
SM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA
52-
25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=
53-
-----END CERTIFICATE-----`
54-
55-
var cacertrev = `-----BEGIN CERTIFICATE-----
56-
MIICYjCCAgmgAwIBAgIUB3CTDOU47sUC5K4kn/Caqnh114YwCgYIKoZIzj0EAwIw
57-
fzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh
58-
biBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK
59-
BgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMDEyMTkzMTAw
60-
WhcNMjExMDExMTkzMTAwWjB/MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv
61-
cm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEChMWSW50ZXJuZXQg
62-
V2lkZ2V0cywgSW5jLjEMMAoGA1UECxMDV1dXMRQwEgYDVQQDEwtleGFtcGxlLmNv
63-
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKIH5b2JaSmqiQXHyqC+cmknICcF
64-
i5AddVjsQizDV6uZ4v6s+PWiJyzfA/rTtMvYAPq/yeEHpBUB1j053mxnpMujYzBh
65-
MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQXZ0I9
66-
qp6CP8TFHZ9bw5nRtZxIEDAfBgNVHSMEGDAWgBQXZ0I9qp6CP8TFHZ9bw5nRtZxI
67-
EDAKBggqhkjOPQQDAgNHADBEAiAHp5Rbp9Em1G/UmKn8WsCbqDfWecVbZPQj3RK4
68-
oG5kQQIgQAe4OOKYhJdh3f7URaKfGTf492/nmRmtK+ySKjpHSrU=
69-
-----END CERTIFICATE-----`
70-
71-
var crlrev = `-----BEGIN X509 CRL-----
72-
MIIBYzCCAQgCAQEwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxEzARBgNVBAgT
73-
CkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xHzAdBgNVBAoTFklu
74-
dGVybmV0IFdpZGdldHMsIEluYy4xDDAKBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhh
75-
bXBsZS5jb20XDTE3MDEyMzIwNTYyMFoXDTE3MDEyNjIwNTYyMFowJzAlAhQERXCx
76-
LHROap1vM3CV40EHOghPTBcNMTcwMTIzMjA0NzMxWqAvMC0wHwYDVR0jBBgwFoAU
77-
F2dCPaqegj/ExR2fW8OZ0bWcSBAwCgYDVR0UBAMCAQgwCgYIKoZIzj0EAwIDSQAw
78-
RgIhAOTTpQYkGO+gwVe1LQOcNMD5fzFViOwBUraMrk6dRMlmAiEA8z2dpXKGwHrj
79-
FRBbKkDnSpaVcZgjns+mLdHV2JkF0gk=
80-
-----END X509 CRL-----`
81-
8225
func TestRevocation(t *testing.T) {
83-
keyinfo := &msp.KeyInfo{KeyIdentifier: "PEER", KeyMaterial: []byte(keyrev)}
84-
85-
sigid := &msp.SigningIdentityInfo{PublicSigner: []byte(signcertrev), PrivateSigner: keyinfo}
86-
87-
cryptoConfig := &msp.FabricCryptoConfig{
88-
SignatureHashFamily: bccsp.SHA2,
89-
IdentityIdentifierHashFunction: bccsp.SHA256,
90-
}
91-
92-
fmspconf := &msp.FabricMSPConfig{
93-
RootCerts: [][]byte{[]byte(cacertrev)},
94-
RevocationList: [][]byte{[]byte(crlrev)},
95-
SigningIdentity: sigid,
96-
Name: "DEFAULT",
97-
CryptoConfig: cryptoConfig}
98-
99-
fmpsjs, _ := proto.Marshal(fmspconf)
100-
101-
mspconf := &msp.MSPConfig{Config: fmpsjs, Type: int32(FABRIC)}
26+
// testdata/revocation
27+
// 1) a key and a signcert (used to populate the default signing identity);
28+
// 2) cacert is the CA that signed the intermediate;
29+
// 3) a revocation list that revokes signcert
30+
conf, err := GetLocalMspConfig("testdata/revocation", nil, "DEFAULT")
31+
assert.NoError(t, err)
10232

10333
thisMSP, err := NewBccspMsp()
10434
assert.NoError(t, err)
10535

106-
err = thisMSP.Setup(mspconf)
36+
err = thisMSP.Setup(conf)
10737
assert.NoError(t, err)
10838

10939
id, err := thisMSP.GetDefaultSigningIdentity()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICYjCCAgmgAwIBAgIUB3CTDOU47sUC5K4kn/Caqnh114YwCgYIKoZIzj0EAwIw
3+
fzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh
4+
biBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK
5+
BgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMDEyMTkzMTAw
6+
WhcNMjExMDExMTkzMTAwWjB/MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv
7+
cm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEChMWSW50ZXJuZXQg
8+
V2lkZ2V0cywgSW5jLjEMMAoGA1UECxMDV1dXMRQwEgYDVQQDEwtleGFtcGxlLmNv
9+
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKIH5b2JaSmqiQXHyqC+cmknICcF
10+
i5AddVjsQizDV6uZ4v6s+PWiJyzfA/rTtMvYAPq/yeEHpBUB1j053mxnpMujYzBh
11+
MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQXZ0I9
12+
qp6CP8TFHZ9bw5nRtZxIEDAfBgNVHSMEGDAWgBQXZ0I9qp6CP8TFHZ9bw5nRtZxI
13+
EDAKBggqhkjOPQQDAgNHADBEAiAHp5Rbp9Em1G/UmKn8WsCbqDfWecVbZPQj3RK4
14+
oG5kQQIgQAe4OOKYhJdh3f7URaKfGTf492/nmRmtK+ySKjpHSrU=
15+
-----END CERTIFICATE-----
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICYjCCAgmgAwIBAgIUB3CTDOU47sUC5K4kn/Caqnh114YwCgYIKoZIzj0EAwIw
3+
fzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh
4+
biBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK
5+
BgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMDEyMTkzMTAw
6+
WhcNMjExMDExMTkzMTAwWjB/MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv
7+
cm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEChMWSW50ZXJuZXQg
8+
V2lkZ2V0cywgSW5jLjEMMAoGA1UECxMDV1dXMRQwEgYDVQQDEwtleGFtcGxlLmNv
9+
bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKIH5b2JaSmqiQXHyqC+cmknICcF
10+
i5AddVjsQizDV6uZ4v6s+PWiJyzfA/rTtMvYAPq/yeEHpBUB1j053mxnpMujYzBh
11+
MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQXZ0I9
12+
qp6CP8TFHZ9bw5nRtZxIEDAfBgNVHSMEGDAWgBQXZ0I9qp6CP8TFHZ9bw5nRtZxI
13+
EDAKBggqhkjOPQQDAgNHADBEAiAHp5Rbp9Em1G/UmKn8WsCbqDfWecVbZPQj3RK4
14+
oG5kQQIgQAe4OOKYhJdh3f7URaKfGTf492/nmRmtK+ySKjpHSrU=
15+
-----END CERTIFICATE-----

msp/testdata/revocation/crls/crl.pem

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN X509 CRL-----
2+
MIIBYzCCAQgCAQEwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxEzARBgNVBAgT
3+
CkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xHzAdBgNVBAoTFklu
4+
dGVybmV0IFdpZGdldHMsIEluYy4xDDAKBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhh
5+
bXBsZS5jb20XDTE3MDEyMzIwNTYyMFoXDTE3MDEyNjIwNTYyMFowJzAlAhQERXCx
6+
LHROap1vM3CV40EHOghPTBcNMTcwMTIzMjA0NzMxWqAvMC0wHwYDVR0jBBgwFoAU
7+
F2dCPaqegj/ExR2fW8OZ0bWcSBAwCgYDVR0UBAMCAQgwCgYIKoZIzj0EAwIDSQAw
8+
RgIhAOTTpQYkGO+gwVe1LQOcNMD5fzFViOwBUraMrk6dRMlmAiEA8z2dpXKGwHrj
9+
FRBbKkDnSpaVcZgjns+mLdHV2JkF0gk=
10+
-----END X509 CRL-----
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIAsWwFunEzqz1Rh6nvD4MiPkKCtmoxzh3jTquG5MSbeLoAoGCCqGSM49
3+
AwEHoUQDQgAEHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3x
4+
CPQtdG/XJJvZ+C756KEsUBM3yw5PTfku8g==
5+
-----END EC PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw
3+
fzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh
4+
biBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK
5+
BgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw
6+
WhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg
7+
Q2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy
8+
IEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
9+
HBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ
10+
+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
11+
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC
12+
dcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1
13+
nEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG
14+
SM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA
15+
25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=
16+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)