Skip to content

Commit 755c8bb

Browse files
Report error for unsupported PKCS #1 format for the private key (#4116)
Java Kafka clients don't support PKCS #1 format for private keys. Signed-off-by: Pierangelo Di Pilato <[email protected]> Co-authored-by: Pierangelo Di Pilato <[email protected]>
1 parent 1754676 commit 755c8bb

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

control-plane/pkg/security/secret.go

+22
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ package security
1919
import (
2020
"crypto/tls"
2121
"crypto/x509"
22+
"encoding/pem"
2223
"fmt"
2324
"strconv"
25+
"strings"
2426

2527
"github.com/IBM/sarama"
2628

@@ -193,6 +195,10 @@ func sslConfig(protocol string, data map[string][]byte) kafka.ConfigOption {
193195
if err != nil {
194196
return fmt.Errorf("[protocol %s] failed to load x.509 key pair: %w", protocol, err)
195197
}
198+
// Java Kafka clients don't support PKCS #1 format for the private key
199+
if isPrivateKeyPKCS1Format(userKeyCert) {
200+
return fmt.Errorf("[protocol %s] unsupported user key format in %s, 'PKCS #1' format is not supported, convert private key to 'PKCS #8'", protocol, UserKey)
201+
}
196202
tlsCerts = []tls.Certificate{tlsCert}
197203
}
198204
}
@@ -220,3 +226,19 @@ func skipClientAuthCheck(data map[string][]byte) (bool, error) {
220226
}
221227
return enabled, nil
222228
}
229+
230+
func isPrivateKeyPKCS1Format(keyPEMBlock []byte) bool {
231+
var keyDERBlock *pem.Block
232+
for {
233+
keyDERBlock, keyPEMBlock = pem.Decode(keyPEMBlock)
234+
if keyDERBlock == nil {
235+
return false
236+
}
237+
if keyDERBlock.Type == "PRIVATE KEY" || strings.HasSuffix(keyDERBlock.Type, " PRIVATE KEY") {
238+
break
239+
}
240+
}
241+
242+
_, err := x509.ParsePKCS1PrivateKey(keyDERBlock.Bytes)
243+
return err == nil
244+
}

control-plane/pkg/security/secret_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,22 @@ func TestSSL(t *testing.T) {
194194
assert.NotNil(t, config.Net.TLS.Config.RootCAs)
195195
}
196196

197+
func TestSSLPKCS1(t *testing.T) {
198+
ca, userKey, userCert := loadPKCS1Certs(t)
199+
200+
secret := map[string][]byte{
201+
"protocol": []byte("SSL"),
202+
"user.key": userKey,
203+
"user.crt": userCert,
204+
"ca.crt": ca,
205+
}
206+
config := sarama.NewConfig()
207+
208+
err := kafka.Options(config, secretData(secret))
209+
210+
assert.NotNil(t, err)
211+
}
212+
197213
func TestSSLNoUserKey(t *testing.T) {
198214
ca, _, userCert := loadCerts(t)
199215

@@ -384,3 +400,16 @@ func loadCerts(t *testing.T) (ca, userKey, userCert []byte) {
384400

385401
return ca, userKey, userCert
386402
}
403+
404+
func loadPKCS1Certs(t *testing.T) (ca, userKey, userCert []byte) {
405+
ca, err := os.ReadFile("testdata/ca.crt")
406+
assert.Nil(t, err)
407+
408+
userKey, err = os.ReadFile("testdata/pkcs1_user.key")
409+
assert.Nil(t, err)
410+
411+
userCert, err = os.ReadFile("testdata/user.crt")
412+
assert.Nil(t, err)
413+
414+
return ca, userKey, userCert
415+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEA1c6XoILp78NVhSuzC8KJ1QnSGQ8CisCHkGWeEIkXI0Cuh2k6
3+
2+vpVIMUuHdehF45/Jxcia54GqIZ6SneN1IpW94+oP+Sls1ZtEZgJpJCyMqe8qBd
4+
jB2M/+CI3px8GyinnumM50TPr/zpp04XsR8I2NzhQq2IQtNAm7FjK7orZtfdqCYe
5+
sk5tARcObVWxKm+WOwjTWDGmlVyxwyWqFGIspV2ymv8Sx8rnOBhUFYIBqB3lefNn
6+
ja0Oh89oZM6ZlRrCupxsnZHXhM3i/c2+AR+tLWQEW0xlqdtle8oARe44E1bnryI1
7+
mDLmjQ3YuyR4/Kw+yl4Q+DLFMC7pBAZLTFbkIQIDAQABAoIBAE190DTr3e/5gyB+
8+
Iymq+5vMMGrGpuw1Na0fN3fUyB8NzXPkruGQkoP/8l2dXhNpt2iYH24DXyKACBYb
9+
B6BTVgwm89oUZ0Pi75VIQIcaUbxGu+9CMkWbXERNVC4i11Rcmswc5+XWadPmPaVW
10+
x315uxImlDo/fPiDapJDa6colZxzDRfa+cH2PrjzDw317Q371qEliJOJF2ZFPDRF
11+
vSBiSQlo9gE9vVR6lanuaG1nQFkAnN1wjb4qfjsGjSdSbQfOHkwA+jQ8o4L3csAo
12+
idUq8UlLmGJY7GIStF47m7TiWv/aLcTCOks7sii/gQJx9GEme+wR1Xe/BtHErqnI
13+
N3hUVKUCgYEA7PvaV6AJE/Ht9itRbxuoeK+yAe0Sn9z5mbuy9HQsVJH0LLL/lL5Y
14+
BuyWWy+Tj7IorfCEmHyY9KOq9V7HRRIa6PKzd5rVGn1D8I6yPU/n8FgZboOy4ahN
15+
lkbDNIuHcu27bkqiAZ4Vu2mpRtalr7QQdlS9v7S235GDQWTroDQQyycCgYEA5vaj
16+
mPnvYOR2S2h4pSBTKdz9Ba2fWw0MiLFIKoHmOblazqRZkLOKoN/DbnOKpbvKqyA6
17+
cwo4r9AF4dRLa0sE3zjmNOBZAV0Uu6fhcaZgvc+1t82P+vrZblP9pXOdFGGoed4S
18+
bskLL/C1oXd6+Q89rCFIkkHJXDJvxRUZNe0BA3cCgYBZ9akGxltr1NTOM9dv5AHp
19+
/lgGXyZIxSuC7juajFcfq2ATb8eRgUgNKNZSuxa635iNntXWxMWTaGXHSzk9wQey
20+
Eh+KcZ4fthmKQcDrgV+8XtUYnKnU+3yoZShI1AaQ3CngTjh9gLMjN5LoryaqMiJl
21+
qPl2wnUBHU3EDzla0Sjm1QKBgQCPxodu6l+OxImzRZScznOWwt+rkjp6NrRPv3R6
22+
KaUE2BLkQkETKAErRkBlWH290BpIzuYzyPAi2e9fdoWAhBHDV6tOzT368FPAwbBA
23+
zF66qjun8MopZdDGsnhab48gKe7z9j8pQfO54zFeE3+03Tz6EzoW+eb8gtU7LXgl
24+
LqWL3wKBgQC0+0lRsGfnsPgRDaAAwoHCxP6h3DNMcRxNMca1aI78ENJZUXfY3XzG
25+
yOE1i/1/SV1NQD4O1BlEqNTaDlM0yw0UttMvOPrI+ZC9hZIbCxVfXGZ7xKqIL+Vo
26+
nG64GxSZh7M6pQHzUjlqTpsr8JaG6O7ODQtlYPHwNw24j7YGvxfk7A==
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)